正弦函数的频谱图(FFT)

来源:互联网 发布:安徽巨蟒渡劫事件知乎 编辑:程序博客网 时间:2024/04/29 17:26
从理论上讲,正弦函数的傅里叶变换是冲击函数:

正弦函数的频谱图(FFT) - MR.Xiao - MR.Xiao的博客
它的幅值为原正弦信号幅值的1/2倍;即:若x(t)=Acos(Ωt),则其频谱幅值最大值为A/2;如左图:
 
正弦函数的频谱图(FFT) - MR.Xiao - MR.Xiao的博客     
但是,我们用matlab求出来的频谱图却不是左边这样的,而是右图;
原因是:
1.理论中的正弦信号是无限长连续信号,而matlab,参与运算的信号只是截取了其中1个周期或多个周期的信号,就变成了有限长信号了;无限长信号和有限长信号的傅里叶变换是不一样的!      
2.理论中的正弦信号是连续的模拟信号,而应用中的正弦信号都是采样,量化处理的,是数字信号;模拟信号和数字信号的傅里叶变换是不一样的!

对于已知周期的信号,通常只需要取其中一个周期做代表分析;但实际应用中,信号的频率通常已知,但噪声的频率却不固定,所以,应尽可能长的截取信号;

下面介绍在Matlab中,如何分析正弦函数的FFT:
已知正弦信号 x(t)=4.6sin(2*pi*f0*t),每周波采样点数Ns=512,采样频率fs=f0*512;(f0为正弦信号的固有频率)
在Matlab中需要做一下处理:
1.将时间轴离散化:    ts = tp * n=(T0/Ns) * n =n/f0*512=n/fs;  n = 0:511; tp为每周波采样512点的时间间隔;
2.将连续信号x(t)离散化:x(ts)= 4.6sin(2*pi*f0*ts) = 4.6sin(2*pi*n/N);
   可以看出x(t)离散化后,已经与信号的固有频率没关系了,这个信号已经变成了与n相关的函数:
x(n)= 4.6sin(2*pi*n/N); n = 0:511;
3.离散信号在Matlab中求FFT就很容易了:
X(n)= FFT( x(n) ) *2 / Ns ;
4.根据周期信号的傅里叶变换的性质:时域的周期,造成频域的离散;时间的离散,造成频域的周期;
   可知:X(n) 为离散的,且有周期;离散点的间距正好是正弦信号的固有频率f0 ;周期为采样周期1/fs;
   X(0),X(1)....分别对应x(t)的第0次,1次...谐波;
5.如果要在二维图上显示频率与频谱幅值的关系,还需要:
   将横轴映射为频率值,映射关系为 f = n*f0;
6.根据奈奎斯特采样定理,当采样频率为fs时,可以得到FFT后的最高有效频率为fs/2;最高谐波次数为Ns/2-1;
  
具体实现如下(Matlab中,已调试通过):
%求正弦信号的傅里叶变换
Ns = 512;%采样点
n = 0 : Ns-1;
xn = 4.6*sin(2*pi*n/Ns);%离散的正弦信号
Xn =  fft( xn ) ;    %fft的结果是复数
Xn = abs(Xn) *2 /Ns; %求绝对值得到幅值,乘以2,乘以Ns是由傅里叶变换公式导致的
%用二维图显示原始正弦信号
subplot(3,1,1),plot(n, xn); %画出原始正弦信号
xlabel('n = 0:511'); ylabel('振幅');
title('原始的正弦信号');
%用二维图显示信号0~255次的谐波
Nyquist = Ns/2-1;%根据奈奎斯特定理,只需显示前255次的谐波
subplot(3,1,2),plot(n(1:Nyquist), Xn(1:Nyquist)); 
xlabel('n = 0:255'); ylabel('谐波幅值');
title('0~255次的谐波');
%用二维图显示信号频率与幅值的关系
f0 = 50;    %假设信号的固有频率为50Hz
f = n*f0;    %频率与横轴序列n的映射关系
subplot(3,1,3),plot(f(1:Nyquist), Xn(1:Nyquist)); %根据奈奎斯特定理,只需显示前fs/2部分的频谱
xlabel('f = 0, 50Hz... 255*f0 Hz '); ylabel('幅值');
title('频率与幅值的关系');

运行结果如下:
正弦函数的频谱图(FFT) - MR.Xiao - MR.Xiao的博客

图中,在f = f0 = 50Hz时,幅值为4.6;即一次谐波幅值为4.6;
 
原创粉丝点击