我目前正在尝试使用吻 fft 将 fft 实现到 avr32 微控制器中以进行信号处理。我的输出有一个奇怪的问题。基本上,我将 ADC 样本(使用函数发生器测试)传递给 fft(实际输入,256 n 大小)并且检索到的输出对我来说很有意义。但是,如果我将汉明窗应用于 ADC 样本,然后将它们传递给 FFT,则峰值幅度的频率箱是错误的(并且与之前没有开窗的结果不同)。ADC 样本有 DC 偏移,因此我消除了偏移,但它仍然不适用于加窗样本。
下面是通过 rs485 的前几个输出值。第一列是没有窗口的 fft 输出,而第二列是有窗口的输出。从第 1 列开始,峰值位于第 6 行(6 x fs (10.5kHz) / 0.5N)给了我正确的输入频率结果,其中第 2 列在第 2 行(直流 bin 除外)有一个峰值幅度,这对我来说没有意义. 任何建议都会有所帮助。提前致谢。
488 260 //直流仓 5 97 5 41 5 29 4 26 10 35 133 76 33 28 21 6 17 3
kiss_fft_scalar zero;
memset(&zero,0,sizeof(zero));
kiss_fft_cpx fft_input[n];
kiss_fft_cpx fft_output[n];
for(ctr=0; ctr<n; ctr++)
{
fft_input[ctr].r = zero;
fft_input[ctr].i = zero;
fft_output[ctr].r =zero;
fft_output[ctr].i = zero;
}
// IIR filter calculation
for (ctr=0; ctr<n; ctr++)
{
// filter calculation
y[ctr] = num_coef[0]*x[ctr];
y[ctr] += (num_coef[1]*x[ctr-1]) - (den_coef[1]*y[ctr-1]);
y[ctr] += (num_coef[2]*x[ctr-2]) - (den_coef[2]*y[ctr-2]);
//y1[ctr] += y[ctr] - 500;
// hamming window
hamming[ctr] = (0.54-((0.46) * cos(2*PI*ctr/256)));
window[ctr] = hamming[ctr]*y[ctr];
fft_input[ctr].r = window[ctr];
fft_input[ctr].i = 0;
fft_output[ctr].r = 0;
fft_output[ctr].i = 0;
}
kiss_fftr_cfg fftConfig = kiss_fftr_alloc(n,0,NULL,NULL);
kiss_fftr(fftConfig, (kiss_fft_scalar * )fft_input, fft_output);
for (ctr=0; ctr<n; ctr++)
{
fft_mag[ctr] = (sqrt((fft_output[ctr].r * fft_output[ctr].r) + (fft_output[ctr].i * fft_output[ctr].i)))/(0.5*n);
//Usart write
char filtResult[10];
sprintf(filtResult, "%04d %04d\n", (int)x[ctr], (int)fft_mag[ctr]);
//sprintf(filtResult, "%04d %04d\n", (int)x[ctr], (int)window[ctr]);
char c;
char *ptr = &filtResult[0];
do
{
c = *ptr;
ptr++;
usart_bw_write_char(&AVR32_USART2, (int)c);
// sendByte(c);
} while (c != '\n');
}
kiss_fft_cleanup();
free(fftConfig);