В настоящее время я пытаюсь внедрить FFT в микроконтроллеры avr32 для целей обработки сигналов, используя Kiss FFT. И у меня странная проблема с выводом. По сути, я передаю образцы АЦП (тестирование с помощью генератора функций) в fft (реальный ввод, размер 256 n), и извлеченный вывод имеет для меня смысл. Однако, если я применяю окно Хэмминга к выборкам АЦП, а затем передаю их в БПФ, частотный бин пиковой величины неверен (и отличается от предыдущего результата без окна). Образцы АЦП имеют смещение постоянного тока, поэтому я устранил смещение, но оно все равно не работает с оконными образцами.
Ниже приведены первые несколько выходных значений через rs485. Первый столбец - это вывод fft без окна, тогда как второй столбец - это вывод с окном. Из столбца 1 пик находится в строке 6 (6 x fs (10,5 кГц) / 0,5 Н) дал мне правильный результат входной частоты, где столбец 2 имеет пиковую величину в строке 2 (кроме бина постоянного тока), что для меня не имеет смысла . Любое предложение будет полезно. Заранее спасибо.
488 260 //dc bin 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);