我有一个双精度数组,它是对数组应用 FFT 的结果,其中包含我添加了 1000Hz 音调的 Wav 音频文件的音频数据。
我得到了这个数组,认为是“数字食谱”中定义的 DREALFT。(我必须使用它)。(原始数组的长度是 2 的幂。)
我的数组有这样的结构:
array[0] = 复数变换的第一个实值分量
array[1] = 复数变换的最后一个实值分量
array[2] = 第二个元素的实部
array[3] = 第二个元素的虚部
ETC......
现在,我知道这个数组代表频域。
我想确定并杀死 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 频率?
谢谢!