現在、kiss fft を使用して信号処理の目的で fft を avr32 マイクロ コントローラーに実装しようとしています。そして、私の出力に奇妙な問題があります。基本的に、ADC サンプル (関数発生器でテスト) を fft (実際の入力、256 n サイズ) に渡し、取得した出力は意味があります。ただし、ハミング ウィンドウを ADC サンプルに適用してから、これらを FFT に渡すと、ピーク振幅の周波数ビンが正しくなくなります (ウィンドウ処理を行わない前の結果とは異なります)。ADC サンプルには DC オフセットがあるため、オフセットを削除しましたが、ウィンドウ化されたサンプルでは機能しません。
以下は、rs485 を介した最初のいくつかの出力値です。最初の列はウィンドウなしの fft 出力で、2 番目の列はウィンドウ付きの出力です。列 1 から、ピークは行 6 (6 x fs (10.5kHz) / 0.5N) にあり、列 2 の行 2 (DC ビンを除く) にピークの大きさがある正しい入力周波数の結果が得られましたが、これは意味がありません。 . どんな提案も役に立ちます。前もって感謝します。
488 260 //DC ビン 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);