Я использую fftw, чтобы получить спектр аудиосигнала. Я получаю образцы аудио в float32, а также пробовал другие форматы с помощью PortAudio. Затем я использую fftw. Во всех форматах у меня есть небольшое отклонение пика частоты от фактической частоты. Моя установка.
- Генератор сигналов для подачи синусоидального сигнала.
- Частота дискретизации 44,1 кГц.
Я получаю правильные / относительно точные показания до 10 кГц. Однако по мере того, как я постепенно увеличиваю частоту генератора, я начинаю получать компенсацию. Например, выше 10 кГц, вот что происходит.
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.
Спасибо,