傅立叶变化matlab实验,从逗比到略懂

      对傅立叶变换一直在学习,一直入不了门,由此我以一个小学生学习的视角去解析傅立叶变换,文中大部分内容源于各个博主大神,在此隆重感谢。

 
      事实上我对傅立叶变换一窍不通,唯一的认知来自于大学本科高数的傅立叶级数变换,与matlab要用到的fft函数没有关系,这里不仔细研究快速傅立叶变换如何把原始信号转为处理后的信号的具体算法,建立在直接调用matalab自带的fft函数。
     
首先,先列举一下我要用到的函数(均在matlab平台实现)
1,fft()%直接调用,不用了解内部算法。
2,abs()%绝对值计算;
3,atan2()%三角函数正切反函数
好了就只用到三个主要 函数而已……

1,fft函数输出和输入是什么

      函数的一种调用格式为        y=fft(x)

  其中,x是序列,y是序列的FFT,x可以为一向量或矩阵,若x为一向量,y是x的FFT。且和x相同长度。若x为一矩阵,则y是对矩阵的每一列向量进行FFT。

注意:在这些输出值中,第一个值是对应的直流分量的振幅(其实就是周期为无穷的可能性),那么第2个值对应第1个采样点,第3个对应第2个。。第n个对应第n-1个采样点。而且这个输出是对称的,也就是大家直接关注前N/2个才样点就可以了。那么第n个点的频率是多少呢,它的计算公式是Fn=(n-1)*Fs/N,其中Fs是采样频率。由此就可以计算出n点对应的周期了,它是频率的倒数,即Tn=N/((n-1)*Fs)。下面给出两个例子:

这里首先死记硬背住上面两个公式,下面的fft研究就有用到。
1; Fn=(n-1)*Fs/N
2; Tn=N/((n-1)*Fs)

1.1先来研究一下fft

例一:>>A=[1,2,1,2,1,2];

          >>fft(A)

           ans= 9 0 0 -3 0 0

         这里输出的意思是,序列A有很大的可能没有周期(第一个点的频率为0,它对应的数字是9),还有一个可能的周期是-3对应的周期,这个周期的计算方法是:-3对应于n=4,默认Fs=1,这里T=6/(3*1)=2,即周期为2。看明白了吗?因为9对应1,所以T=6/(1-1)*1=周期无穷大,所以没有周期


1.2: Fn=5; %频率

N=300; %采样点

Fs=40; %采样频率

t=[0:1/Fs:N/Fs];

S=cos(2*pi*Fn*t);

abs(fft(S));

plot(abs(fft((S))));

    总而言之一句话,这些输出的绝对值就是序列对应的二维频域图上的点,它的横坐标是采样点,纵坐标是振幅,由它我们可以计算序列可能的频率或周期等值

以上信息来自于leegang12的博客http://blog.csdn.net/leegang12/article/details/6376619

    我的理解是fft函数是一个中间处理函数,可以用fft得到的数据,继续处理后得到源信号分为几个正弦或余弦函数,可以确定其振幅,周期和相位。

      这里补充指出,如果x长度是2的幂次方,函数fft执行高速基-2FFT算法;否则fft执行一种混合基的离散傅立叶变换算法,计算速度较慢。为提高运算时间,可以认为修改x的长度序列。

    采样得到的数字信号,就可以做FFT变换了。N个采样点,经过FFT之后,就可以得到N个点的FFT结果。为了方便进行FFT运算,通常N取2的整数次方。


   假设采样频率为Fs(输入参数,人为决定),信号频率F(待求的数据,作图后可以看出输入信号由那些主要正弦或余弦函数的频率),采样点数为N(人为决定,一般取2的N次幂)。

    那么FFT之后结果就是N+1个点的复数。每一个点就对应着一个频率点。这个点的模值,就是该频率值下的幅度特性。具体跟原始信号的幅度有什么关系呢?

    假设原始信号的峰值为A,那么FFT的结果的每个点(除了第一个点直流分量之外)的模值就是A的N/2倍。而第一个点就是直流分量,它的模值就是直流分量的N倍。而每个点的相位呢,就是在该频率下的信号的相位(复数虚部所表示的相位)。


    第一个点表示直流分量(即0Hz),而最后一个点N的再下一个点(实际上这个点是不存在的,这里是假设的第N+1个点,也可以看做是将第一个点分做两半分,另一半移到最后)则表示采样频率Fs,这中间被N-1个点平均分成N等份,每个点的频率依次增加。例如某点n所表示的频率为:Fn=(n-1)*Fs/N。由上面的公式可以看出,Fn所能分辨到频率为为Fs/N,如果采样频率Fs为1024Hz,采样点数为1024点,则可以分辨到1Hz。1024Hz的采样率采样1024点,刚好是1秒,也就是说,采样1秒时间的信号并做FFT,则结果可以分析到1Hz,如果采样2秒时间的信号并做FFT,则结果可以分析到0.5Hz。如果要提高频率分辨力,则必须增加采样点数,也即采样时间。频率分辨率和采样时间是倒数关系。

      上面一段蓝色文字不是很了解,姑且把公式记住,并知道1,要提高频率分辨力,则必须增加采样点数,也即采样时间。2,频率分辨率和采样时间是倒数关系。这两个结论。

    假设FFT之后某点n用复数a+bi表示,那么这个复数的模就是An=根号a*a+b*b,相位就是Pn=atan2(b,a)。根据以上的结果,就可以计算出n点(n≠1,且n<=N/2)对应的信号的表达式为:

An/(N/2)*cos(2*pi*Fn*t+Pn),即2*An/N*cos(2*pi*Fn*t+Pn)。


对于n=1点的信号,是直流分量,幅度即为A1/N。

    由于FFT结果的对称性,通常我们只使用前半部分的结果,即小于采样频率一半的结果。

以上解释摘自一位叫圈圈的博主http://blog.sina.com.cn/s/blog_640029b301010xkv.html


2,fft完整使用指南

    估计大多数人跟我一样只关心怎么把一组原始信号通过fft方法分解为几个正弦或余弦函数,就是怎么用这些数据并得到最后结果。好了,那就算前面也是一点没看明白,也完全没有关系,就从这里开始,举一个完整的例子。来使用fft。


    首先,我们需要一组原始输入信号。

  没办法,找不到好数据,那我们就自己一组数据,比如

S=2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180)

    当然,这数据是人造的只是为了检验方便,现实中,函数S是我们要求的目标函数。 

 NormalText Code 
1
2
3
4
5
6
7
8
clear all
N=256; %采样点
Fs=256; %采样频率
t=[0:1/Fs:N/Fs];
S=2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180);
fft1=fft(S);%查看fft后的结果
abs1=abs(fft(S))%取复数的模
plot(abs(fft((S))));%作频率分布图

由于FFT结果的对称性,通常我们只使用前半部分的结果,即小于采样频率一半的结果。就是说看128以前的数据就可以的,这里我们发现大约在50Hz,和75Hz左右有峰值(另外在第一点0Hz处也有一个峰值,这里表示有一个直流信号即S中的常数2),和输入S的两个交流信号频率一样呢,好开森。


也就是说我们已经得到两个余弦函数的频率,接下来还要求振幅和相位,不急,一步一步来。

我们的信号有3个频率:0Hz、50Hz、75Hz,应该分别在第1个点、第51个点、第76个点上出现峰值,其它各点应该接近0


从图中我们可以看到,在第1点、第51点、和第76点附近有
比较大的值。我们分别将这三个点附近的数据拿上来细看:
1516.598076211353 + 0.00000000000000i
2,2.59900704081871 - 0.0196787424660072i
3,2.60180445475026 - 0.0393809855325276i


50,58.6169480649775 - 6.34990888216907i
51,359.979318198187 - 33.6014960745965i
52,-87.8368011133880 + 6.74667444598843i


75,-31.8771197561628 - 22.6953712901770i
76,-134.345505037574 - 100.765116060030i
77,53.3617717909087 + 41.9525431367541i
   
    很明显,1点、51点、76点的值都比较大,它附近的点值
都很小,可以认为是0,即在那些频率点上的信号幅度为0。
接着,我们来计算各点的幅度值。分别计算这三个点的模值,

用abs()方法求
结果如下:
1点:516.598076211353
51点:361.544146777241
76点:167.935473734384

这时,就要用到前文所用的公式,记住第一点是直流分量,计算方法与交流分量是不一样的。

An/(N/2)*cos(2*pi*Fn*t+Pn),即2*An/N*cos(2*pi*Fn*t+Pn)。

对于n=1点的信号,是直流分量,幅度即为A1/N。


按照公式,可以计算出直流分量为:512/N=512/256=2;

50Hz信号的幅度为:       384/(N/2)=384/(256/2)=3;

75Hz信号的幅度为:       192/(N/2)=192/(256/2)=1.5。

S=2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180)

可见,从频谱分析出来的幅度是正确的。
    然后再来计算相位信息。直流信号没有相位可言,不用管它。

先计算50Hz信号的相位,atan2(-192, 332.55)=-0.5236,结果是弧度,换算为角度就是180*(-0.5236)/pi=-30.0001。

计算75Hz信号的相位,atan2(192, 3.4315E-12)=1.5708弧度,换算成角度就是180*1.5708/pi=90.0002。可见,相位也是对的。

这样就可以把一组一维原始输入信号分解为几个正弦(余弦)函数了,若想处理二维的图片,则先把图片处理成一维向量即可。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值