【发布时间】:2015-08-28 14:37:32
【问题描述】:
我正在使用 fftw 获取音频信号的频谱。我获得了 float32 格式的音频样本,并且还尝试了使用 PortAudio 的其他格式。然后我使用 fftw 处理它。在所有格式中,我的频率峰值与实际频率略有漂移。我的设置是。
- 信号发生器提供正弦信号。
- 44.1KHz 的采样率。
直到 10KHz,我都得到了正确/相对准确的读数。然而,随着我逐渐增加发生器的频率,我开始得到偏移。例如在 10KHz 以上,会发生这种情况。
Actual frequency Peak on Spectrum
10KHz 10.5KHz
12KHz 12.9KHz
14KHz 15.5KHz
16KHz 18.2KHz
fft代码是这样的。
//Take Samples and do Windowing
for( i=0; i<framesPerBuffer; i++ )
{
samples[i] = in[i];
fft->fftIn[i] = (0.54-(0.46*cos(scale_fact*i))) * samples[i];
}
//Zero Padding
for(i=framesPerBuffer; i<fftSize; i++)
{
fft->fftIn[i] = 0.0;
}
//FFTW Code
{ fftSize = fftSize;
this->fftSize = fftSize;
cout << "Plan start " << endl;
outArraySize = fftSize/2+1;
cout << "fft Processor start \n";
fftIn = ((double*) fftw_malloc(sizeof(double) * fftSize));
fftOut = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * outArraySize );
fftOutAbs = (double*) fftw_malloc(sizeof(double) * outArraySize );
fftwPlan = fftw_plan_dft_r2c_1d(fftSize, fftIn, fftOut, FFTW_ESTIMATE);
// fftwPlan = fftw_plan_dft_r2c_1d(fftSize, fftIn, fftOut, FFTW_MEASURE);
}
//Absolute response
int n=fftSize/2+1;
for(int i=0; i < n; i++)
{
fftOutAbs[i] = sqrt(fftOut[i][0]*fftOut[i][0] + fftOut[i][1]*fftOut[i][1]);
}
for(unsigned int i=0; i < n; i++)
{
mainCureYData[i] = 20.0 * log10(one_over_n * fft->fftOutAbs[i]);
}
我需要一些关于这个问题可能在哪里/为什么会出现的提示?
硬件设置看起来不错,因为峰值在 sndpeek 应用程序上显示正确。
谢谢,
【问题讨论】:
标签: c++ signal-processing fft fftw portaudio