ゼロパディングの奇数長FFTの場合の実数値のリンギング


13

だから私は、信号と逆変換の周波数応答をゼロで埋める周波数領域補間器を書き込もうとしています。対処しなければならない2つのケースがあります。

  1. 偶数長の応答ビンを分割する必要があるのは、あいまいだからです。そこで、スペクトルの負の部分をコピーし、その間にゼロを追加します。Fs/2n*(interp-1)-1
  2. 奇数長の応答ビンがないため、正/負の周波数を分割し、それらの間にゼロを挿入するだけです。Fs/2n*(interp-1)

ゼロパディングを行うコードはこちらにあります

// Copy negative frequency components to end of buffer and zero out middle
//  inp    - input buffer of complex floats
//    n    - transform size
//  interp - interpolation amount
void zero_pad_freq(cfloat_t *inp, size_t n, size_t interp) {
    if ((n % 2) == 0) {
        memmove(inp + n*interp - n/2, inp + n/2,     n/2*sizeof(cfloat_t));
        memset (inp + n/2 + 1, 0,       (n*(interp-1)-1)*sizeof(cfloat_t)); // Duplicate Fs/2 so we need one less zero

        inp[n/2]          /= 2.0;
        inp[n*interp-n/2] /= 2.0;
    } else {
        memmove(inp + n*interp - n/2, inp + (n+1)/2, n/2*sizeof(cfloat_t));
        memset (inp + (n+1)/2, 0,         (n*(interp-1))*sizeof(cfloat_t));
    }
}

最初のケースは少し数値ノイズがあります、私はチャープ信号にそれをテストだし、それだけで罰金を補間し、正常に動作しているが、それはラウンドFFTを通じてつまずいていますあなたは何ができるか(最初ので、かそこら信号の公演):50μs

50μs

架空のチャネルには小さな波紋がありますが、それほど悪くはありません。

Fs/2Fs/2


プロットは縮小されているため、見づらいです。
ジェイソンR

@Jason申し訳ありませんが、リンクされていると思ったので、HTMLを調整して、クリックしてフルサイズにできるようにしました。
GCT

3
入力として使用しているもののコードまたはサンプルファイルはありますか?留意すべきことの1つは、DFTが想定する境界条件です。具体的には、対象の信号が周期的であるという固有の仮定があります。そのため、奇数長の入力の最初と最後のサンプルの間に不連続がある場合、観察したようなリンギングを見ることができます。偶数長のサンプルが最初から最後まで連続している可能性があるため、この現象は見られません。
ジェイソンR

他の人が簡単に消化できる形式のデータはありませんが、あなたは正しいと思います。私はちょうどここに来て、コードを再コンパイル/テスト入力を再生成し(1秒で10Hz〜100Hzのチャープ)、コードを再実行しましたが、鳴りませんでした。私はあなたのコメントを見て、頻度を10-100.314に変更しましたが、今では偶数と奇数の両方の変換が鳴っています。
GCT

1
データにウィンドウ関数を適用しようとしましたか?それは通常、リンギングを減らします。
MarkSci

回答:


1

高周波ビンをゼロにすることにより、信号のスペクトルに矩形関数を効果的に掛けました。周波数の乗算は時間のたたみ込みであり、矩形のフーリエペアはシンクです。したがって、実際に行ったのは、時間領域信号をsincで畳み込み、sincのメインローブの幅をrectの長さに反比例させることでした。これが、Parks-McClellanのような多数のフィルター設計技術が、いわゆる「遷移領域」または「遷移」帯域を設計して、フィルターの周波数応答に瞬間的な変化がないようにするためです。これらのフィルター設計手法は重要です。なぜなら、使用したような「理想的な」フィルターは時間領域でそのような望ましくない効果をもたらすからです。


0

周波数ドメインのステップは、時間ドメインのリップルとして現れます。ウィンドウ関数(ハミングウィンドウなど)で周波数データを平滑化すると、リップルが大幅に減少します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.