Matlab求解周期函数的傅里叶级数以及作频谱图与相位图

(一)前言

Matlab并没有自带的求解傅里叶级数的函数,本文将介绍如何使用Matlab进周期函数的傅里叶级数分析,内容包括:

1、求解傅里叶级数的系数

2、求N次谐波的叠加函数,画图比较与原函数的差值

3、做出傅里叶级数的幅度谱与相位谱

(二)傅里叶级数系数的求解

设f(x)为周期为T的周期函数,则我们有傅里叶级数展开式:

$$ f\left( x \right) =a_0+\sum_{n=1}^{\infty}{\left( a_n\cos nx+b_n\sin nx \right)} \\ a_0=\frac{1}{T}\int_{-\frac{T}{2}}^{\frac{T}{2}}{f\left( x \right) \text{d}x} \\ a_n=\frac{2}{T}\int_{-\frac{T}{2}}^{\frac{T}{2}}{f\left( x \right) \cos nx\text{d}x}\quad \left( n=\text{1,2,3,}\cdots \right) \\ b_n=\frac{2}{T}\int_{-\frac{T}{2}}^{\frac{T}{2}}{f\left( x \right) \sin nx\text{d}x}\quad \left( n=\text{1,2,3,}\cdots \right) $$

根据系数的求解的定义,我们使用int()函数进行积分即可求解,如果f(x)在一个周期内为分段函数的话可能还需分段积分,我是自己写了一个统一处理分段函数积分的函数,当然也可以自己分段写,本质是一样的。这里以一个周期三角函数为例进行求解,三角波函数图像如下:

则在一个周期内的函数表达式为:$$ f\left( t \right) =\begin{cases} 2t+\text{1, }-0.5\leqslant t<0\\ -2t+\text{1, }0\leqslant t<\text{0.5 }\\ \end{cases} $$

则求解系数的代码如下:

syms t n;
T=2;w=2*pi/T;
f1=2*t+1;f2=-2*t+1;
a0=1/T*myint('t',f1,-0.5,0,f2,0,0.5);
an=myint('t',f1*cos(n*pi*t),-0.5,0,f2*cos(n*pi*t),0,0.5);
bn=myint('t',f1*sin(n*pi*t),-0.5,0,f2*sin(n*pi*t),0,0.5);

运行结果为:

(三)作N次谐波的合成图并与原函数进行比较

作合成图实际上就对多个函数进行一定项数的叠加,为了适应不同项数的叠加处理,这里编写函数进行实现:

%trifourierseries.m
function [ f ] = trifourierseries( a0, an, bn, m, t )
%TRIFOURIERSERIES 求傅里叶级数m次谐波的合成
%   a0、an、bn为傅里叶级数的系数
%   t为变量(取样间隔也就是自变量)
f=a0;
syms n;
for n=1:m
    f=f+eval(an)*cos(n*pi.*t);
    f=f+eval(bn)*sin(n*pi.*t);
end

接着就是进行画图处理:

%求傅里叶变换
t=-6:0.01:6;
d=-6:2:6;
%tripuls为三角波函数,进行偏移叠加处理可以得到一个类似三角周期函数的图
f=pulstran(t,d,'tripuls');
%3次谐波叠加
f3=trifourierseries(a0, an, bn, 3, t);
%9次谐波叠加
f9=trifourierseries(a0, an, bn, 9, t);
%21次谐波叠加
f21=trifourierseries(a0, an, bn, 21, t);
%45次谐波叠加
f45=trifourierseries(a0, an, bn, 45, t);

%级数展开图
subplot(2,3,1);plot(t,f,'r',t,f3,'b');grid on
axis([-6.1,6.1,-0.1,1.1]);title('展开3项');
xlabel('t');ylabel('f(t)');
subplot(2,3,4);plot(t,f,'r',t,f9,'b');grid on
axis([-6.1,6.1,-0.1,1.1]);title('展开9项');
xlabel('t');ylabel('f(t)');
subplot(2,3,2);plot(t,f,'r',t,f21,'b');grid on
axis([-6.1,6.1,-0.1,1.1]);title('展开21项');
xlabel('t');ylabel('f(t)');
subplot(2,3,5);plot(t,f,'r',t,f45,'b');grid on
axis([-6,6,-0.1,1.1]);title('展开45项');
xlabel('t');ylabel('f(t)');

(四)幅度谱与相位图作图

先给定需要绘制的范围,再对具体的幅度An以及相位ψn进行求解,最后画出An~n以及ψn~n即可:

%幅度谱--相位谱
n=0:1:10;
anVal=eval(an);
bnVal=eval(bn);
%注意A0需要自己赋值
An=sqrt(anVal.^2+bnVal.^2);An(1)=a0;
%phi0同理
phi=atan(-bnVal./anVal);phi(1)=0;
subplot(2,3,3);stem(n,An,'b');
grid on; axis([-0.1,10.1,-0.1,1.1]);
title('幅度谱');xlabel('n');ylabel('An');
subplot(2,3,6);plot(n,phi,'b');
grid on; axis([-0.1,10.1,-0.1,1.1]);
title('相位谱');xlabel('n');ylabel('ψn');

(五)最终绘图结果

(六)说明

该例子为周期三角波函数的求解,如需改成其它函数,只需要将最开始的分段f1、f2以及相应的积分过程进行修改即可。

该程序直接运行的话会比较慢,因为在进行傅里叶级数的计算是将a0、an、bn进行传参然后求解,既涉及到符号运算又涉及到了数值运算,故运算特别慢,在算出a0、an、bn以后,直接将三者的值代入trifourierseries()中即可可以跑得比较快,不过这样的话在修改为不同函数进行积分时,这里也要进行修改,各有所长,也有所缺,看个人所好以及实际情况进行取舍即可。

 

  • 46
    点赞
  • 436
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
好的,我可以为您提供一些MATLAB代码来求解周期函数傅里叶级数,并频谱图相位图。 首先,我们需要定义这个周期函数。假设这个函数是一个正弦波函数,其周期为T,频率为f,振幅为A,相位为phi。则函数可以表示为: f(t) = A*sin(2*pi*f*t + phi) 接下来,我们可以使用MATLAB的内置函数来求解傅里叶级数,代码如下: ``` % 定义周期函数 T = 1; % 周期 f = 1/T; % 频率 A = 1; % 振幅 phi = pi/4; % 相位 t = linspace(0, T, 1000); % 时间向量 f_t = A*sin(2*pi*f*t + phi); % 周期函数 % 计算傅里叶级数 N = 50; % 取前50项 w = linspace(-pi, pi, 1000); % 频率向量 F = zeros(size(w)); % 傅里叶级数 for n = -N:N cn = A * exp(-1i*n*2*pi*f*t) / length(t); F = F + cn * sum(exp(1i*n*w)); end % 图 figure; subplot(2,1,1); plot(t, f_t); xlabel('时间'); ylabel('振幅'); title('周期函数'); subplot(2,1,2); plot(w, abs(F)); xlabel('频率'); ylabel('振幅'); title('频谱图'); figure; subplot(2,1,1); plot(w, angle(F)); xlabel('频率'); ylabel('相位'); title('相位图'); ``` 代码中,我们首先定义了周期函数,然后使用linspace函数生成了一个时间向量t。接着,我们利用上述周期函数计算了傅里叶级数的前50项,并使用linspace函数生成频率向量w。最后,我们绘制了周期函数频谱图相位图。 您可以根据自己的需要修改周期函数的参数,例如周期T、频率f、振幅A和相位phi,来观察不同参数下的傅里叶级数及其频相位信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值