1

sin信号とcos信号のfftの位相出力をテストしています。以下のスクリプトは信号を作成し、FFT を実行します。信号の位相のみに関心があるため、振幅がしきい値を下回るビンは、位相スペクトルに対してゼロになります。

% 10khz 10 second long time interval
t = 0:1 / 10000:10;

%1khz cos
c = cos(2 * pi * 1000 .* t);
%1khz sin
s = sin(2 * pi * 1000 .* t);

%ffts
C = fft(c)/length(c);
S = fft(s)/length(s);

%magnitude and phases of ffts
CA = abs(C); %cos magnitude
SA = abs(S); %sin magnitude

Cthresh = max(CA) * 0.5;
Sthresh = max(SA) * 0.5;

%find all indeces below the threshold
Crange = find(CA < Cthresh);
Srange = find(SA < Sthresh);

%set the indeces below the threshold to 0 - phase will be meaningless for
%noise values
CP = angle(C);
CP(Crange) = 0;
SP = angle(S);
SP(Srange) = 0;

CP (cos の位相) をプロットすると、cos 信号の周波数に対応するビンで 0.3142 の位相が得られ、他の場所ではゼロになります。これは pi/10 です。円周率を期待しています。どうしてこれなの?

SP をプロットすると、1.2566 の値が得られます。私は pi/2 または 1.5708 を期待しています。期待値の80%。これらのエラーの原因は何ですか?

4

2 に答える 2

1

入力信号が FFT アパーチャの長さ (全周期の正確な整数) で完全に周期的でない場合、正弦波は FFT アパーチャの両端で不連続になります。したがって、FFT 入力ベクトルの両端にある 2 つの異なる位相の平均である位相が得られます。

より適切な位相が必要な場合は、正弦波の位相を FFT 入力ベクトルの中心に参照し、FFT の前に fft シフトを実行します。これにより、奇妙な平均値の代わりに単一の位相を持つ、ゼロ位相基準位置での連続正弦波が得られます。

また、matlab では、最初の vectorElement[i=0] ではなく、サンプリングされた正弦波の 2 番目の点 (例: vectorElement[i=1]) を参照する場合があることに注意してください。これは、周期 = 20 サンプルの正弦波に対して pi/10 の位相を持ちます。

于 2011-10-31T16:53:57.570 に答える