サンプルの一部だけ信号を循環シフトする方法は?


22

シフト定理は述べています

乗算することによって線形位相E 2 π Iバツn 、いくつかの整数のためのMに対応する循環シフト出力のXのKXのkはにより置換されてXのK-M、添字モジュロ解釈されるN(すなわち、周期的に)。e2πNnmバツkバツkバツkm

OK、それはうまくいきます:

plot a

任意の9サンプル信号

N = 9
k = [0, 1, 2, 3, 4, 5, 6, 7, 8]
plot ifft(fft(a)*exp(-1j*2*pi*3*k/N))

周波数領域で3サンプルだけシフトされた信号

予想通り、3サンプル分シフトしました。

サンプルの端数でシフトするためにこれを行うこともできると思っていましたが、試してみると、私の信号は想像上のものになり、元の信号とはまったく異なります。

plot real(ifft(fft(a)*exp(-1j*2*pi*3.5*k/N)))
plot imag(ifft(fft(a)*exp(-1j*2*pi*3.5*k/N))), 'b--'

3.5複素指数を乗算した後の信号

私はこれをまったく期待していませんでした。これは、3.5サンプルだけシフトされた実際のインパルスとの畳み込みに相当しませんか?それで、衝動はまだ本当でなければならず、結果はまだ本当でなければなりませんか?そして、それは多かれ少なかれ元のものと同じ形状を持っているはずですが、sincは補間されていますか?


:ここでは偶数/奇数長の実数/複素数信号とフラクショナル遅れ彼らのために正しい変調計算MATLABファイル交換の提出だmathworks.com/matlabcentral/fileexchange/7886-fshift
アーメドFasih

回答:


14

IFFTのシフト出力を実数にしたい場合、周波数領域の位相のねじれ/回転は、データと同様に共役対称でなければなりません。これは、与えられた位相勾配に対して、複雑なexp()の指数に適切なオフセットを追加することで実現できます。そのため、2 Piを法とする上(または負)の半分の位相は、FFTアパーチャの下半分を反映します。 。複素指数シフト関数は、インデックス0で位相をゼロにして-N / 2からN / 2にインデックスを付けることにより、共役対称にすることもできます。

開口部で2 Pi回転の正確な整数倍を完了し、開口部で共役対称になる位相のねじれまたはらせんの適切なオフセットがゼロになるのは、まさにそのためです。

共役対称位相ツイストベクトルでは、結果は非整数シフトの円形Sinc補間になります。

OPによる詳細:

k = [0、1、2、3、4、5、6、7、8]を選択すると、非対称複素指数が生成されます。

非対称複素指数0.5サンプルシフト試行、破線として虚数部

代わりにk = [0、1、2、3、4、-4、-3、-2、-1]を使用すると、エルミート対称複素指数が得られます。

plot(fftshift(exp(-1j * 2*pi * 0.5/N * k)))

0.5サンプルシフトのエルミート対称複素指数、虚数部は破線

そして今、同じ指数式を使用して0.5または3.5サンプルだけシフトすると、実際の結果が得られます。

plot ifft(fft(a)*exp(-1j * 2 * pi * 0.5/N *k))
plot ifft(fft(a)*exp(-1j * 2 * pi * 3.5/N *k))

オリジナルを点線として、0.5および3.5サンプルだけシフト


あぁ!代わりにk = [0, 1, 2, 3, 4]、私は使用する必要がありますk = [0, 1, 2, -2, -1]
エンドリス

@endolith / hotpaw2、言い換えれば、それはすべて時間領域サンプルのインデックス付けについてですか?
TheGrapeBeyond

1
ビン0の対称性は、N / 2が整数でない場合でも、N / 2の対称性も提供します。
hotpaw2

1
:私はMatlabのファイル交換に正しい変調を適用する機能見つかっmathworks.com/matlabcentral/fileexchange/7886-fshiftを 👏!
アーメドファシィ

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