加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

[转载]MATLAB做信号频谱图

(2018-03-10 19:15:21)
标签:

转载

分类: matlab设计
原文地址:MATLAB做信号频谱图作者:Tony
分析一下傅里叶变换先:
下面是公式:
http://s15/middle/5dc0a514g80eba9824e2e&690
由于信号的因果性,故当t<0时,x(t)=0.所以变换公式可以进一步细节描述成:

http://s2/middle/5dc0a514g80ebaefbc9d1&690
由于现在我还没有研究傅里叶变换的数学公式层级MATLAB算法,只好很初级的借用fft函数。于是研究离散傅里叶就必不可少了。公式如下:
http://s1/middle/5dc0a514g80eba9ecc4b0&690
来看一下help fft 里面的解释:


---------------------------分割线-------------------------------------------------------------
For length N input vector x, the DFT is a length N vector X,
    with elements
                     N
       X(k) =       sum  x(n)*exp(-j*2*pi*(k-1)*(n-1)/N), 1 <= k <= N.
                    n=1
---------------------------分割线-------------------------------------------------------------

显然,这就是离散傅里叶变换。尽管公式与理论公式不完全一样,其原因为MATLAB里向量的第一个元素角标为1而不是0. 对于一个信号,我们将定义域离散化,生成相应的一个向量t。对应的值域离散化成为一个向量x。

假设这个信号的定义域长为lent,向量t为N维向量,则此信号离散化的抽样周期为Ts=1/fs=lent/(N-1),其中fs为抽样频率。

由上述离散傅里叶公式,我们可以知道将t用fft函数作用后,仍然得到一个N维向量。其频域的长度我们定义为lenf,则满足lent=(N-1)*Ts,固lenf=((N-1)*(N-1)/N)/lent=fs*(N-1)/N。N较大时,lenf=fs。
至此得到频域的向量为f=(0:N-1)/(N-1)*lenf=(0:N-1)*fs/N。

根据那奎斯特抽样定理,抽样频率要高于信号中最高频率的两倍,才不会失真,因此频谱中(fs/2,fs)为无用谱,故频域信号的定义域向量与值域向量都应该做减半处理。即:
f=f(1,N/2);
y=abs(fft(x));
y=y(1.N/2);
好了,我们可以画出信号的时域与频域图像了。


-----------------------------------程序如下-----------------------------------------

clear all;   %这个其实可以没有,只不过以前出过问题,现在就加上!
N=1024;      %这个是你举得信号的点数,随便你了
fs=50;       %这个是抽样频率,记得要高于信号中最高频率的2倍
t=(0:N-1)/fs;     %没啥好说的,信号时域横轴向量
f=(0:N-1)*fs/N;    %没啥好说的,信号频域横轴向量,不过待会要减半处理一下
x=sin(2*pi*20.*t);   %这个更没啥好说的,想分析什么函数,你自己打吧
y=abs(fft(x));     %依旧没有什么好说的,频域分析吗。不过记得要求模
f=f(1:N/2);      %正事:减半了
y=y(1:N/2);      %正事:减半了
subplot(1,2,1)   %画图
plot(t,x);
subplot(1,2,2)   %画图
plot(f,y);

----------------------------------程序完毕--------------------------------------------

0

  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有