最初に両方の正方形のデモ
[…,0,0,1,−1,0,0,…] and[…,0,0,1,−1,0,0,…]
等しい
[ ... 、0 、0 、1 、−1 、0 、0 、... ] そして
しかし、sinc補間の2乗は異なります(図1)。
図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= {01 −1 −p2√p、p =γ − αα + γα = γの場合 、さもないと、
と d= 0つまり、sincは最大のサンプルの時刻に正確にシフトします。同じ補間を半分のサンプルレートで実行できます。これは、2つの連続する最大値のサンプルで、その大きさがタイムシフトされたsincの振幅に等しい、基礎となる関数の臨界サンプリング周波数です。α そして β 基礎となる関数の絶対値の二乗:
0 ≤ D≤ 1d=⎧⎩⎨⎪⎪⎪⎪011 + p −1 −p2√2 p、p =β- αα +ββの場合 = 0 、α = 0の場合 、さもないと、
式は、データの振幅スケーリングの影響を受けません。周波数推定では、純粋に実時間でシフトされたsincはめったにありませんが、そうした場合、正確な補間式があります。