转载(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