1

sin(2*pi f t+phi) という単純な正弦関数があります。位相信号φを取得したい。FFT を使用して phi を計算しようとしました。matlabでは、次のことを行います

f=200; %frequency of sine wave
overSampRate=30; %oversampling rate
fs=overSampRate*f; %sampling frequency
phase = 3/5*pi; %desired phase shift in radians
nCyl = 5; %to generate five cycles of sine wave

t=0:1/fs:nCyl*1/f; %time base

x=sin(2*pi*f*t+phase); %replace with cos if a cosine wave is desired

NFFT=1024; %NFFT-point DFT
X=fft(x,NFFT); %compute DFT using FFT
XX=2*abs(X(1:NFFT/2+1));
[tt ind]=max(XX);
phase_Estimate=angle(X(ind);

この結果は私にはほとんど意味がありません。たとえば、phi=0.523 の場合、phase_Estimate は -0.98 となります。

4

4 に答える 4

3

補間されていない FFT 結果位相の使用は、正弦波の周期が正確に FFT 長の整数の約数である場合にのみ機能します。あなたの例では、正弦波は開口部で周期的な整数ではありません。

そうでない場合は、位相を補間してより正確な推定値を得る必要があります。より良い補間位相を得る 1 つの方法を次に示します。

FFT を実行する前に、最初にデータを fftshift (N/2 だけ回転) して、ゼロ位相基準点をウィンドウの中心に移動します。(これは、隣接する FFT 結果ビン間で位相が反転/交互にならないようにするために必要です。 * )

次に、FFT を実行し、放物線補間または Sinc 補間によって正弦波の周波数を推定します。

次に、推定された周波数を使用して、最も近い 2 つの FFT 結果ビン位相間の位相を線形補間します。更新:または、さらに良いことに、FFT結果の実数成分と虚数成分のSinc補間を別々に使用し、補間されたIQ成分でatan2を使用して補間された位相を取得します。

次に、ウィンドウの中心で推定された周波数と位相を使用して、FFT ウィンドウの開始など、他のポイントでの位相を計算します。

また、正弦波の位相は、余弦波の位相と pi/2 だけ異なることに注意してください。atan(im,re) は余弦位相を返します。

(* データを事前にシフトする代わりに、奇数 FFT 結果ビンの位相をポストフリップすることもできます。)

于 2015-04-15T15:50:39.867 に答える
0

遅いかもしれませんが、スクリプトを少し変更しました

f=200; %frequency of sine wave
overSampRate=30; %oversampling rate
fs=overSampRate*f; %sampling frequency
shift = 30
phase = shift*pi/180; %desired phase shift in radians
nCyl = 5; %to generate five cycles of sine wave
t=0:1/fs:nCyl*1/f; %time base
x=cos(2*pi*f*t+phase); %replace with cos if a cosine wave is desired

NFFT=4096; %NFFT-point DFT
X=fft(x,NFFT); %compute DFT using FFT
XX=2*abs(X(1:NFFT/2+1));
[tt, ind]=max(XX);
phase_Estimate = angle(X(ind)) * 360/(2*pi)

それは私が期待するものに非常に近い結果を吐き出します.

x ベクトルの生成をコサインに変更し、ラジアンではなく phase_Estimate で角度を計算し、入力位相シフトを簡単に変更できるようにしました。

于 2022-02-04T21:03:29.833 に答える