離散フーリエ変換(DFT)の大きさの補間


7

たとえば、ピーク周波数の検出では、複素数のDFTビンで、またはそれらの実数部と虚数部で別々に帯域制限内挿法を使用し、結果の大きさまたは2乗した大きさを計算することは有効であると思われます。しかし、ビンの大きさ(それは妥当ではないと思います)、またはそれらの二乗された大きさ(多分妥当)の帯域制限補間についてはどうですか?妥当とは、完全に補間された値は、時間領域信号のゼロパディングされたバージョンのより大きなDFTからそれらを計算することによって検出された値と等しくなることを意味します。

最初のアプローチは、補間が完全でない場合の他のアプローチとは異なり、非負の結果を保証します非負または正の帯域制限補間に関するこの質問を参照してください。


オリー、これは質問ですか?
robert bristow-johnson

@ robertbristow-johnsonはい、そうです...「どうですか」の部分。でも私はそこにいると思います。
Olli Niemitalo

1
ところで、ガウスはフーリエ変換のAN固有関数です。実際には無限の数の固有関数があり、固有関数を作成するのは非常に簡単です。
robert bristow-johnson

1
@ robertbristow-johnsonやや接線方向に進んでいますが、他には何ですか?
Olli Niemitalo

1
偶数対称関数とそれ自体のフーリエ変換( f 交換された t)はフーリエ変換の固有関数です。
robert bristow-johnson 2016

回答:


4

DFTの補間ポイントは、事前に計算された補間ベクトルを使用して、ピーク領域周辺のいくつかのサンプルの内積を使用して計算できます。補間ベクトルは、必要なゼロパディングの量などを考慮して、目的の補間サンプルの場所によって決定されます。

この手法と補間ベクトルを計算する方法は、このドキュメントの付録Bで説明されています。

http://ericjacobsen.org/FTinterp.pdf

少しお役に立てば幸いです。


エリック、ありがとうございます。マグニチュード補間について、「マグニチュード検出の非線形性により、信号が実質的にアンダーサンプリングされる」ことに気付いたのは素晴らしいことです。時間領域信号が2倍の長さにゼロパディングされている場合、二乗された振幅はアンダーサンプリングされないことを私の回答で示します。残念ながら、PDFのすべての方程式がChromeで正しく表示されるわけではありません。3.5。
Olli Niemitalo

1
マグニチュードが検出されるまでアンダーサンプリングされないため、複素数係数を補間して複素数補間係数を取得し、マグニチュード(または2乗マグニチュード)を計算すると、この問題を回避できます。
Eric Jacobsen、

同意しました!PDFはEdgeで正常に動作します。
Olli Niemitalo

5

最初に両方の正方形のデモ

[,0,0,1,1,0,0,] and[,0,0,1,1,0,0,]

等しい

[,0,0,1,1,0,0,] and

しかし、sinc補間の2乗は異なります(図1)。

sinc補間の2乗
図1. sincの二乗補間 [1,1] (青)と [1,1] (赤)。

これは、帯域制限された信号の臨界サンプリング周波数で取得された均一なサンプルから帯域制限された信号の二乗を回復することは一般に不可能であることを示しています。


Octaveでさまざまな補間アプローチをテストしてみましょう。帯域制限補間のゴールドスタンダードは、DFT-ゼロパッド-DFTです。

>> format free
>> x = [1 2 3];
>> y = [1 2 3  0 0 0];
>> abs(fft(x))
ans =

 6 1.73205 1.73205

>> abs(fft(y))
ans =

 6 4.3589 1.73205 2 1.73205 4.3589

最後の数値セットは、完全に補間された周波数領域ビンから計算されたマグニチュード値です。代わりにマグニチュードを補間してみましょう:

>> fft(fftshift(horzcat([0 0], fftshift(ifft(abs(fft(x)))), [0])))
ans =

 6 4.57735 1.73205 0.309401 1.73205 4.57735

かなりずれているようです。二乗した大きさを補間してみましょう:

>> fft(fftshift(horzcat([0 0], fftshift(ifft(abs(fft(x)).^2)), [0])))
ans =

 36 25 3 -8 3 25

>> sqrt(ans)
ans =

 (6,0) (5,0) (1.73205,0) (0,2.82843) (1.73205,0) (5,0)

オフであるだけでなくsqrt()、負の補間値に対して複素数も返しました。それで、ビン値を補間する唯一の有効な方法は何ですか?

係数2でアップサンプリングされた周波数領域データを補間して、もう一度チャンスを与えましょう。偶数の長さの変換のため、「ナイキストサンプル」を複製する必要があるため、コードが読みづらくなったことをお詫びします。

>> z = [1 2 3  0 0 0  0 0 0  0 0 0];
>> abs(fft(z))
ans =

 6 5.55485 4.3589 2.82843 1.73205 1.77302 2 1.77302 1.73205 2.82843 4.3589 5.55485

上記は私たちが望むものです。2xアップサンプリングされた大きさを補間してみましょう:

>> fftshift(horzcat([0 0 0], fftshift(ifft(abs(fft(y)))), [0 0 0]))
ans =

 3.36365 1.10447 0.318175 0 0 0 0 0 0 -0.208949 0.318175 1.10447

>> ans(4) = ans(length(ans)-2)
ans =

 3.36365 1.10447 0.318175 -0.208949 0 0 0 0 0 -0.208949 0.318175 1.10447

>> fft(ans)
ans =

 5.79105 5.59483 4.56785 2.7273 1.5231 1.76882
 2.20895 1.76882 1.5231 2.7273 4.56785 5.59483

それはまだオフです。2xアップサンプリングされた2乗の大きさを補間してみましょう。

>> fftshift(horzcat([0 0 0], fftshift(ifft(abs(fft(y)).^2)), [0 0 0]))
ans =

 14 8 3 0 0 0 0 0 0 1.18424e-15 3 8

>> ans(4) = ans(length(ans)-2)
ans =

 14 8 3 1.18424e-15 0 0 0 0 0 1.18424e-15 3 8

>> sqrt(fft(ans))
ans =

 6 5.55485 4.3589 2.82843 1.73205 1.77302 2 1.77302 1.73205 2.82843 4.3589 5.55485

今では完璧に動作します!テイクホームメッセージは、周波数領域で補間する前に、少なくとも2倍に(時間領域のゼロパッド)アップサンプリングし、振幅ではなく二乗した振幅を補間することです。大きさの2乗を取ることは、各ビン値にその複素共役を掛けることと同じであるため、機能します。複素共役では、データによって表される帯域制限関数の帯域幅が保持されるため、乗算は「時間領域の帯域幅」を2倍にします。これは、時間領域のたたみ込みと同等であるためです。内挿法を選択する場合、2倍のアップサンプリングされた2乗の大きさは依然として厳密にサンプリングされるため、さらにオーバーサンプリングを行うと、正確な内挿がはるかに容易になります。

私は自分の質問に回答しましたが、回答としてさらなる洞察を受け入れます!

PSだけinterpftでなく、より少ない構文で補間を行うも見つかりました。

追加情報の活用

補間は、データについての追加情報を使用して、より簡単に、または正確にできます。たとえば、それは臨界的にサンプリングされた2乗タイムシフトsincです。その場合、2つのサンプルを考えるとα 直前と γ 最大のサンプルの直後、時間 1<d<1 ピークの大きさは、

d={0もし α=γ11p2pp=γαα+γさもないと、

d=0つまり、sincは最大のサンプルの時刻に正確にシフトします。同じ補間を半分のサンプルレートで実行できます。これは、2つの連続する最大値のサンプルで、その大きさがタイムシフトされたsincの振幅に等しい、基礎となる関数の臨界サンプリング周波数です。α そして β 基礎となる関数の絶対値の二乗:

0d1d={0もし β=01もし α=01+p1p22pp=βαα+βさもないと、

式は、データの振幅スケーリングの影響を受けません。周波数推定では、純粋に実時間でシフトされたsincはめったにありませんが、そうした場合、正確な補間式があります。

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