2017-08-05 5 views
1

私はFFTWを使用してC++でスペクトルアナライザを作成しています。FFTウィンドウが周波数スペクトル全体で不均一な増幅を引き起こす

入力信号にウィンドウ関数を適用した後、出力振幅は突然周波数に比例しているように見えます。

Retangularウィンドウ

image

厳密ブラックマン

image

グラフは44100 [Hz]のサンプリング周波数で対数スケーリングされます。すべての高調波は、同じレベルで生成され、長方形の場合に見られるように0dBでピークに達します。 Exact-Blackmanウィンドウは、ゲインを処理するためにメークアップを試みるために7.35dBだけ増幅されました。ここで

は、入力テーブルを生成するための私のコードです...

freq = 1378.125f; 

for (int i = 0; i < FFT_LOGICAL_SIZE; i++) 
{ 
    float term = 2 * PI * i/FFT_ORDER; 

    for (int h = 1; freq * h < FREQ_NYQST; h+=1) // Harmonics up to Nyquist 
    { 
     fftInput[i] += sinf(freq * h * K_PI * i/K_SAMPLE_RATE); // Generate sine 
     fftInput[i] *= (7938/18608.f) - ((9240/18608.f) * cosf(term)) + ((1430/18608.f) * cosf(term * 2)); // Exact-Blackman window 
    } 
} 

fftwf_execute(fftwR2CPlan); 

ウィンドウサイズを増加または減少は何も変わりません。私はハミング窓でも同じ問題をテストしました。

ここに出力を取得するためのコードです。

float val; // Used elsewhere 
for (int i = 1; i < K_FFT_COMPLEX_BINS_NOLAST; i++) // Skips the DC and Nyquist bins 
{ 
    real = fftOutput[i][0]; 
    complex = fftOutput[i][1]; 

    // Grabs the values and scales based on the window size 
    val = sqrtf(real * real + complex * complex)/FFT_LOGICAL_SIZE_OVER_2; 
    val *= powf(20, 7.35f/20); // Only applied during Exact-Blackman test 
} 

不思議なことに、私は正確な-ブラックマン場合の応答を平らにしようとするには、以下のことを試みました。このスケールダウンにより、ほぼ完全なフラットレスポンスは得られませんでした。きちんとしていますが、なぜこれが起こっているのかを私には説明していません。

float x = (float)(FFT_COMPLEX_BINS - i)/FFT_COMPLEX_BINS; // Linear from 0 to 1 
x = log10f((x * 9) + 1.3591409f); // Now logarithmic from 0 to 1, offset by half of Euler's constant 
val = sqrt(real * real + complex * complex)/(FFT_LOGICAL_SIZE_OVER_2/x); // Division by x added to this line 

答えて

1

バグかもしれません。 1つのサンプルにつき複数回ウィンドウ関数を適用しているようです。すべてのウィンドウ処理は入力合成ループから削除し、FFTの直前に入力ベクトルに一度だけ適用する必要があります。

+0

よく見つかった!これだった!本当にありがとう! – Krunklehorn

0

ライブラリを手元に置いていないため、コードを再現できませんでした。しかし、これはスペクトル漏れの結果である可能性があります。

これは、ウィンドウ関数とサンプリングの不利な点です。その記事のトレードオフセクションを見ると、ウィンドウのタイプは広範囲の周波数に適応でき、特定のウィンドウに集中することができます。あなたの信号の周波数が増加しているので、おそらくあなたのターゲットの外のより低い周波数の信号は、より多くのスペクトル漏れにさらされます。

関連する問題