在Matlab中用fft計算整週期採樣信號的幅值相位

  轉載(http://hi.baidu.com/zhaolinger_789/blog/category/%CA%FD%D7%D6%D0%C5%BA%C5%B4%A6%C0%ED)  

    假設一個信號,它含有2V的直流分量,頻率爲50Hz、相位爲-30度、幅度爲3V的交流信號,以及一個頻率爲75Hz、相位爲90度、幅度爲1.5V的交流信號。用數學表達式就是如下:S=2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180)    式中cos參數爲弧度,所以-30度和90度要分別換算成弧度。我們以256Hz的採樣率對這個信號進行採樣,總共採樣256點。MATLAB程序如下:

clc;
clear;
Adc=2; %直流分量幅度
A1=3;   %頻率F1信號的幅度
A2=1.5; %頻率F2信號的幅度
F1=50; %信號1頻率(Hz)
F2=75; %信號2頻率(Hz)
Fs=256; %採樣頻率(Hz)
P1=-30; %信號1相位(度)
P2=90; %信號相位(度)
N=256; %採樣點數
t=[0:1/Fs:N/Fs]; %採樣時刻

%信號
S=Adc+A1*cos(2*pi*F1*t+pi*P1/180)+A2*cos(2*pi*F2*t+pi*P2/180);
%顯示原始信號
subplot(411);plot(S);
title('原始信號');


Y = fft(S,N); %做FFT變換
Ayy = (abs(Y)); %取模
subplot(412);stem(Ayy(1:N)); %顯示原始的FFT模值結果
title('FFT 模值');

Ayy=Ayy/(N/2);   %換算成實際的幅度
Ayy(1)=Ayy(1)/2;
F=([1:N]-1)*Fs/N; %換算成實際的頻率值,Fn=(n-1)*Fs/N
subplot(413);stem(F(1:N/2),Ayy(1:N/2));   %顯示換算後的FFT模值結果
title('幅度-頻率曲線圖');

Pyy=[1:N/2];
for i=1:N/2
Pyy(i)=angle(Y(i)); %計算相位
Pyy(i)=Pyy(i)*180/pi; %換算爲角度
end;
subplot(414);stem(F(1:N/2),Pyy(1:N/2));   %顯示相位圖
title('相位-頻率曲線圖');

 

 

FFT結果:
   Y(1)=512
   Y(51)=3.3255e+002 -1.9200e+002i
   Y(76)=3.4350e-012 +1.9200e+002i

  
FFT幅值結果:
   abs(Y(1))=512
   abs(Y(51))=384
abs(Y(76))=192
FFT相位結果:
   angle(Y(1))=0
   angle(Y(51))=-0.5236 rad=-30.000°
    angle(Y(76))=1.5708 rad= 90.000°

另外:atan2(b,a)是求座標爲(a,b)點的角度值,範圍從-pipi。例如:
    atan2(0,512)=0
    atan2(-1.9200e+002,3.3255e+002 )=-0.5236 rad=-30.000°
   
求具體信號的幅值:
   Adc= abs(Y(1))/N=512/256=2             %直流分量是僅除以N
   A1= abs(Y(51))/N*2=384/256*2=3      %交流分量是除以N後還要乘以2
   A2= abs(Y(76))/N*2=192/256*2=1.5

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章