matlab 1到无穷_从零开始的matlab学习笔记——(31)傅里叶变换

matlab应用——求极限,求导,求积分,解方程,概率统计,函数绘图,三维图像,拟合函数,动态图,傅里叶变换....更多内容尽在个人专栏:matlab学习

上一节我们已经做好了关于傅里叶变换的一些准备工作,这一节我们正式开始利用matlab认识傅里叶变换

傅里叶变换:

傅里叶变换是基于这样一个原理:

任何周期函数都可以用正弦函数和余弦函数构成的无穷级数来表示(关于这点我们下面会用matlab直观的表现一下)

选择正弦函数与余弦函数作为基函数是因为它们是正交

公式(我觉得这个公式更方便初学者理解):

1、给定周期函数

则周期

,

2、如果区间并不对称,比如

则现将函数向左平移

个单位

此时

3、傅里叶级数

注意这里i不是虚数单位,别看混了(笑哭)

其中系数:

n=0,1,2...

n=1,2,3...

推导过程大家可以看看这位大佬的:

ElPsyCongree:傅里叶系列(一)傅里叶级数的推导​zhuanlan.zhihu.com
acbecf9619ceb93aa037614bb942ac7f.png

matlab中的傅里叶变换:

这里我们自己写一下matlab实现傅里叶变换的代码:

这里为了让代码不至于太过冗长,我们可以使用一下自定义函数,基本操作可以看一下本专栏的这篇文章:

浅吻板牙:从零开始的matlab学习笔记——(9)自定义函数​zhuanlan.zhihu.com
477d1f78830f770b1509448f88644f0c.png

代码如下

function F= fuliye(f,x,n,a,b) %表达式f,自变量x,n阶展开,区间(a,b)

L=(b-a)/2

if abs(a+b)>0

f=subs(f,x,x+L+a) %向左平移

end

a0=int(f,x,-L,L),F=a0/2

for i=1:n %累加和我们用for循环实现

ai=int( f*cos(i*pi*x/L),x,-L,L )/L

bi=int( f*sin(i*pi*x/L),x,-L,L )/L

F=F+ai*cos(i*pi*x/L)+bi*sin(i*pi*x/L)

end

if abs(a+b)>0

F=subs(F,x,x-L-a) %再平移回来

end

end

这里我们使用for循环来进行傅里叶变换的累加和,for循环:

浅吻板牙:从零开始的matlab学习笔记——(5)循环​zhuanlan.zhihu.com
477d1f78830f770b1509448f88644f0c.png

此外,int函数代表求积分:

浅吻板牙:从零开始的matlab学习笔记——(8)积分​zhuanlan.zhihu.com
477d1f78830f770b1509448f88644f0c.png

subs函数用来进行替换表达式中的变量,以达成平移效果,这个上一节我们刚刚铺垫过:

浅吻板牙:从零开始的matlab学习笔记——(30)傅里叶逼近前传——一些常用函数与基本GUI​zhuanlan.zhihu.com
477d1f78830f770b1509448f88644f0c.png

这样写好自定义函数之后,保存,我们再本机上就可以自由的调用:

比如近似逼近

syms x f

f=x*(x-pi)*(x-2*pi)

F=fuliye(f,x,6,0,2*pi)

结果输出:

01ae2bbda298ab8d61e564bc4f918a9a.png

傅里叶变换的动态演示:

之前我们动态演示过泰勒公式,这里我们再来做一个傅里叶变换的动态图

因为傅里叶变换的计算比较复杂,计算机运行时间比较长,所以我们只是大致的感受一下

这里用分段函数

,来演示

完整代码:

syms x

y=abs(x)/x

xx=-pi:pi/100:pi

xx=xx(xx~=0) %抠点,分母不能有0

yy=subs(y,x,xx) %替换。这里不大好懂,为了使用plot函数,我们要用密集的点坐标而不是符号量x来绘图

L=pi

a0=int(y,x,-L,L),f=a0/2

F=subs(f,x,xx) %同上替换

plot(xx,yy,xx,F)

axis([-pi,pi,-1.5,1.5])

pause(0.1) %间隔0.1秒

hold off

for i=1:18

ai=int( y*cos(i*pi*x/L),x,-L,L )/L

bi=int( y*sin(i*pi*x/L),x,-L,L )/L

f=f+ai*cos(i*pi*x/L)+bi*sin(i*pi*x/L) %累加,这里没有使用自定义函数,是为了提高计算效率,原理有点类似算法竞赛中的递推,省去了一些没有必要的重复计算

F=subs(f,x,xx)

plot(xx,yy,xx,F)

axis([-pi,pi,-1.5,1.5])

pause(0.01) %因为运算本身需要耗时间,所以停顿时间就设置的极短。但是为了展示动态效果,不得不加上pause函数

hold off

end

一个动画带你直观了解傅里叶变换(滑稽脸)

1890cb02ea9e90b632ed793139bff24a.png
https://www.zhihu.com/video/1209846220468064256

呼,这可能是本专栏目前为止写的最费劲的一节,看到这的朋友如果觉得可以就请双击点个赞吧,能够加个关注就更好了(握手),希望能帮到大家。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值