2012-04-22 31 views
1

MATLABを使用してFFTの位相をプロットしようとしています。私は実際に光の半分の強度に設定された光の調光器を通るこの信号を持っています。とにかく、それは本当に問題ではありません。基本的に私のコードでは、シグナルをベクトルにまとめました。次に、私はFFTを実行してIに格納します。その後、Iの大きさと角度を取得しようとします。MATLAB FFT位相プロット

振幅のスペクトルは正しいようですが、位相/なぜか。助言がありますか?私は自分のコードが非効率的に書かれている方法では少し「ドギー」であることを認識しています。私は実際にMATLABやその他のプロではありません...

助けていただければ幸いです。

ありがとうございます。

%    ( 40/240 * sin(2*pi*50*t)  for a < t < T 
% waveform = { 
%    ( 0       for 0 < t < a 

cycles = 2; 
a = 90; 




clear i t; 
aTime = a/360; 
dt = 0.0001; 

t = 0; 
i = 0; 

for n = 0 : cycles - 1; 
    T = 1/50; 

    t0 = 0 + (n*T) : dt : T*aTime + (n*T) - dt; 
    t1 = T*aTime + (n*T) : dt : T/2 + (n*T) - dt; 
    t2 = T/2 + (n*T) : dt : T*(aTime + 1/2) + (n*T) - dt; 
    t3 = T*(aTime + 1/2) + (n*T) : dt : T + (n*T) - dt; 
    t = [t [t0, t1, t2, t3]]; 

    i = [i zeros(1, length(t0))]; 
    i = [i 40/240 * sin(2*pi*50*t1)]; 
    i = [i zeros(1, length(t2))]; 
    i = [i 40/240 * sin(2*pi*50*t3)]; 
end 

subplot(3,2,[1 2]) 
hold on; 
plot(t, 40/240 * sin(2*pi*50*t), ':r'); 
plot(t, i); 
xlabel('time (sec)') 
ylabel('i(t)') 
title('Current through a 40W, 240V dimmed light with alpha = 90^o') 
grid on; 
hold off; 
axis([0, T*(n(end) + 1), -0.2, 0.2]); 

fs = 1/dt; 
N = length(i); 
df = fs/N; 
f = (-fs/2) : df : (fs/2)-df; 
I = fftshift(fft(i)/N); 

subplot(3,2,3) 
plot(f, abs(I)) 
axis([-1000,1000,0,0.055]); 
xlabel('frequency (Hz)') 
ylabel('|i(t)|') 
title('Magnitude Spectrum') 
grid on; 

subplot(3,2,5) 
plot(f, mod(unwrap(angle(I)), 2*pi)) 
axis([-1000, 1000, -pi, 2.5*pi]); 
xlabel('Radians') 
ylabel('Arg(i(t))') 
title('Frequency') 
grid on; 

subplot(3,2,4) 
hold on; 
plot(t, i); 
plot(t, real(0.1*exp(1i*(2*pi*50*t + 4.139))), 'm'); 
plot(t, real(2*0.02653*exp(1i*(2*pi*150*t + 6.268))), 'g'); 
plot(t, real(2*0.008844*exp(1i*(2*pi*250*t + 3.156))), 'r'); 
axis([0, T*(n(end) + 1), -0.2, 0.2]); 
hold off; 
xlabel('Time') 
ylabel('Value') 
title('Fourier Series Components') 
grid on; 

subplot(3,2,6) 
hold on; 
plot(t, i); 
plot(t, real(0.1*exp(1i*(2*pi*50*t + 4.139))), 'm'); 
plot(t, real(2*0.008844*exp(1i*(2*pi*250*t + 3.156)) + 2*0.02653*exp(1i*(2*pi*150*t + 6.268)) + 0.1*exp(1i*(2*pi*50*t + 4.139))), 'm'); 
plot(t, real(2*0.02653*exp(1i*(2*pi*150*t + 6.268)) + 0.1*exp(1i*(2*pi*50*t + 4.139))), 'g'); 
axis([0, T*(n(end) + 1), -0.2, 0.2]); 
hold off; 
xlabel('Time') 
ylabel('Value') 
title('Fourier Series Sum') 
grid on; 

編集:関数fftshiftは、角度や大きさの両方に適用されるように はそれを作りました。

これは私が得るものです: plots

答えて

2

FFTフェーズは意味をなさないために解き放つ必要があります。それ以外の場合は、2piの不連続性があります。

+1

これは根本的な原因です。 –

+0

ありがとうございました!私はそれをアンラップしてから2πでモジュロを取った。上記のコードと画像を更新しました。 –

0

私はあなたの問題はあなたが大きさのためにfftshiftでは使用して、角度のためにそれを使用していないと思います。私はそれを使用するか、使用しないことをお勧めします。そのようなものは通常悪い練習です。

+0

アドバイスをいただきありがとうございますが、解決したかどうかはわかりません。私はそれをしたときにかなり狂った位相波形を得ました。 –