1000Hz トーンを追加した Wav オーディオ ファイルのオーディオ データを含む配列に適用された FFT の結果である double の配列があります。
「Numerical Recipes」で定義されている DREALFT を考えて、この配列を取得しました (使用する必要があります)。(元の配列の長さは 2 のべき乗です。)
私の配列には次の構造があります。
array[0] = 複素変換の最初の実数値コンポーネント
array[1] = 複素数変換の最後の実数値コンポーネント
array[2] = 2 番目の要素の実部
array[3] = 2 番目の要素の虚数部
等......
これで、この配列が周波数ドメインを表していることがわかりました。
1000Hzの周波数を特定して殺したい。
1000Hzの周波数を含む配列のインデックスを見つけるために、次の式を試しました。
index = 1000. * NElements /44100;
また、このインデックスは実数値のみを含む配列を参照していると想定しているため、虚数値も含む配列内の正しい (?) 位置を特定しました。
int correctIndex=2;
for(k=0;k<index;k++){
correctIndex+=2;
}
(確かにもっと簡単な方法があることは知っていますが、それが最初に思い浮かびました)
次に、16275892957.123705 という値を見つけました。これは、1000Hz 周波数の実部であると思われます。
だから私はそれを抑制しようとしました:
array[index]=-copy[index]*0.1f;
なぜこの式を使用したのか正確にはわかりませんが、いくつかの結果が得られる唯一の式です。実際、1000hz トーンがわずかに減少しているように見えます。
これは、問題のコードの一部です。
double *copy = malloc( nCampioni * sizeof(double));
int nSamples;
/*...Fill copy with audio data...*/
/*...Apply ZERO PADDING and reach the length of 8388608 samples,
or rather 8388608 double values...*/
/*Apply the FFT (Sure this works)*/
drealft(copy - 1, nSamples, 1);
/*I determine the REAL(?) array index*/
i= 1000. * nSamples /44100;
/*I determine MINE(?) array index*/
int j=2;
for(k=0;k<i;k++){
j+=2;
}
/*I reduce the array value, AND some other values aroud it as an attempt*/
for(i=-12;i<12;i+=2){
copy[j-i]=-copy[i-j]*0.1f;
printf("%d\n",j-i);
}
/*Apply the inverse FFT*/
drealft(copy - 1, nSamples, -1);
/*...Write the audio data on the file...*/
注: 簡単にするために、int16_t の配列から double の配列を取得する部分を省略しました
1000Hzの周波数を特定して完全に殺すにはどうすればよいですか?
ありがとうございました!