[Matlab-2]傅里叶级数(Fourier Series)

周期延拓

在遇到非周期函数尤其是一段函数时,我们常常将其周期延拓
在这里插入图片描述
在这里插入图片描述
在时域下,表达式为
在这里插入图片描述
如下方波的傅里叶级数为
在这里插入图片描述

数值法实现傅里叶级数展开(Realize Fourier Series with Numeric Method )

Loop形式

% numeric method: loop function, trapz
clear;clf;
T = 2; f = 1/T; w1 = 2*pi*f;
dt = 0.01;
t = -2:dt:2;
tao = -0.5:dt:0.5;
a0 = trapz(tao,tao.^0)/T;
f = a0;
N = input('N=');
an = zeros(1,N);
bn = zeros(1,N);
for n = 1:N
 fcos = 1.*cos(n*w1*tao); an(n)=trapz(tao,fcos)*2/T;
 fsin = 1.*sin(n*w1*tao); bn(n)=trapz(tao,fsin)*2/T;
 f = f+ an(n)*cos(n*w1*t)+bn(n)*sin(n*w1*t);
end
plot(t,f);xlabel('t(s)');ylabel('ft'); grid on;
title(['Numeric Loop with N=' num2str(N)]);

矩阵形式

Matlab在矩阵计算上有着其他软件难以企及的优势,所以通过数学公式变化,我们也可以将其写成矩阵形式
在这里插入图片描述
在这里插入图片描述

% numeric method: matrix calculation
clear; clf;
T = 2; f = 1/T; w1 = 2*pi*f;
dt = 0.01;
t = -2:dt:2;
tao = -0.5:dt:0.5;
a0 = trapz(tao,tao.^0)/T;
N = input('N=');
n = 1:N;
fcos = 1.*cos(n'*w1*tao); an = trapz(tao,fcos,2)*2/T;
fsin = 1.*sin(n'*w1*tao); bn = trapz(tao,fsin,2)*2/T;
f = a0 + an'*cos(n'*w1*t) + bn'*sin(n'*w1*t);
plot(t,f); xlabel('t(s)');ylabel('ft'); grid on;
title(['Numeric Matrix with N=' num2str(N)]);

符号法实现傅里叶级数展开(Realize the Fourier Series with Symbolic Method )

Loop结构

% Symbolic method: loop function, int
clear; clf;
N = input('N=');
syms t1 a0 an bn n
T1 = 2; f = 1/T1; w1 = 2*pi*f;
range = [-0.5,0.5];
a0 = 1/T1*int(t1^0,t1,range);
f = a0;
for n=1:N
 an = 2/T1*int(cos(n*w1*t1),t1,range);
 bn = 2/T1*int(sin(n*w1*t1),t1,range);
 f = f+an*cos(n*w1*t1)+bn*sin(n*w1*t1);
end
fplot(f); xlabel('t');ylabel('y(t)');
title(['Symbolic Loop with N=' num2str(N)]);
axis([-2,2,-0.2,1.2]); grid on;

吉布斯现象(Gibbs Phenomenon)

在进行高阶展开时。我们常常能遇到下面这些问题,在断点处的峰值不随N变大而减小,这就是所谓的吉布斯现象
在这里插入图片描述

不同形式的傅里叶级数

另一种三角形式

在这里插入图片描述

指数形式(complex exponential form)

在这里插入图片描述

三角与指数形式之间的关系

在这里插入图片描述

样例(Sample)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 20
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Matlab中,我们可以使用“exp”函数和傅立叶级数公式来将锯齿波进行指数级傅立叶级数展开。具体步骤如下: 1.定义锯齿波函数: ```matlab function y = sawtooth_wave(t, T) % t为时间向量,T为锯齿波周期 y = (t/T) - floor(t/T + 1/2); end ``` 2.设置展开参数: ```matlab T = 1; N = 10; % 展开项数 ``` 3.计算傅立叶级数系数: ```matlab n = -N:N; c = 1./(2*pi*1i*n) .* (exp(-1i*2*pi*n*T/2) - 1); ``` 4.计算指数级傅立叶级数展开: ```matlab t = linspace(-3*T, 3*T, 1000); y = zeros(size(t)); for nn = 1:length(n) y = y + c(nn)*exp(1i*2*pi*n(nn)*t/T); end ``` 5.绘制锯齿波和展开结果: ```matlab % 绘制锯齿波 figure; plot(t, sawtooth_wave(t, T), 'LineWidth', 2); hold on; % 绘制展开结果 plot(t, real(y), 'LineWidth', 2); grid on; xlabel('Time (s)'); ylabel('Amplitude'); legend('Original Signal', ['Exp Fourier Series, N = ' num2str(N)]); ``` 完整代码如下: ```matlab function y = sawtooth_wave(t, T) % t为时间向量,T为锯齿波周期 y = (t/T) - floor(t/T + 1/2); end T = 1; N = 10; % 展开项数 n = -N:N; c = 1./(2*pi*1i*n) .* (exp(-1i*2*pi*n*T/2) - 1); t = linspace(-3*T, 3*T, 1000); y = zeros(size(t)); for nn = 1:length(n) y = y + c(nn)*exp(1i*2*pi*n(nn)*t/T); end figure; plot(t, sawtooth_wave(t, T), 'LineWidth', 2); hold on; plot(t, real(y), 'LineWidth', 2); grid on; xlabel('Time (s)'); ylabel('Amplitude'); legend('Original Signal', ['Exp Fourier Series, N = ' num2str(N)]); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值