4

現在、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);        
4

1 に答える 1