matlab 编写计算傅里叶系数函数

1. 编写计算傅里叶级数系数的函数

%计算函数 x 的 N 次谐波的傅里叶级数系数,函数的周期为 T0
%数组 X 存放的是傅里叶系数,也就是幅值
%数组 w 存放的是频率
function [X, w]=fourierseries(x, T0, N)
    syms t;%因为传进来的x函数中包含符号 t,所以函数内部也要定义符号变量 t,否则会报错
    for k = 1: N,
        X(k)=int(x*exp(-j*2*pi*(k-1)*t/T0), t, 0, T0)/T0;
        w(k)=(k-1)*2*pi/T0;
    end
end
X(k) = int(x*exp(-j*2*pi*(k-1)*t/T0), t, 0, T0) / T0;

上面的式子为傅里叶公式
X ( k ) = 1 T 0 ∗ ∫ 0 T 0 x ( t ) ∗ e − j ∗ k ∗ Ω 0 ∗ t d t X(k) =\frac{1}{T0}* \int_{0}^{T0}x(t) * e^{-j*k*\Omega_0*t}dt X(k)=T010T0x(t)ejkΩ0tdt
其中使用了计算积分的 int 函数,不懂使用的可以看这里 matlab 使用 int函数 求积分

2*pi*(k-1)*/T0

注意上面的意思是 ( k − 1 ) ∗ Ω 0 (k-1)*\Omega_0 (k1)Ω0 ,因为频率要从 0 开始每次递增 Ω 0 \Omega_0 Ω0,K 是从 1 开始,所以要 -1。

w(k) = (k-1)*2*pi/T0;

这行代码的意思是 w ( k ) = ( k − 1 ) ∗ Ω 0 w(k) = (k-1)*\Omega_0 w(k)=(k1)Ω0,因为频率要从 0 开始每次递增 Ω 0 \Omega_0 Ω0,K 是从 1 开始,所以要 -1。

下面我们可以使用上面编写好的函数计算函数的N次谐波对应的傅里叶系数和相位

2. 求 y = s i n ( 5 ∗ t ) y=sin(5*t) y=sin(5t) 的5次谐波(谐波次数可以任意指定)

clear all;
syms t;
y=sin(5*t); T0 = 2 * pi/5; N=5;
figure(1);
subplot(211);
ezplot(y , [0, 2*pi]);
grid;

[Y1, w1] = fourierseries(y, T0, N);
disp(Y1);
disp(w1);

%fliplr(Y1(2:N))的意思是将Y1数组中第2到N个数字顺序反转
%比如 Y1 数组为 [ 0, -1i/2, 0, 0, 0]
%fliplr(Y1(2:N))) 得到就是 [ 0, 0, 0, -1i/2]
%conj函数是求共轭
%比如对数组 [ 0, 0, 0, -1i/2] 求共轭,得到的就是 [ 0, 0, 0, 1i/2]
Y = [conj(fliplr(Y1(2:N)))  Y1];
w = [-fliplr(w1(2:N))  w1];
disp(Y);
disp(w);

subplot(223);
stem(w, abs(Y));%abs函数是对数组 Y 的每一个元素取绝对值
subplot(224);
stem(w, angle(Y));%angle函数是对数组 Y 的每一个元素求其对应的弧度

%计算函数 x 的 N 次谐波的傅里叶级数系数,函数的周期为 T0
%数组 X 存放的是傅里叶系数,也就是幅值
%数组 w 存放的是频率
function [X, w]=fourierseries(x, T0, N)
    syms t;%因为传进来的x函数中包含符号 t,所以函数内部也要定义符号变量 t,否则会报错
    for k = 1: N,
        X(k)=int(x*exp(-j*2*pi*(k-1)*t/T0), t, 0, T0)/T0;
        w(k)=(k-1)*2*pi/T0;
    end
end

在这里插入图片描述

下面,我们在刚才的函数上面增加 1

3. 求 y = 1 + s i n ( 5 ∗ t ) y=1+sin(5*t) y=1+sin(5t) 的5次谐波(谐波次数可以任意指定)

只需在原来的信号函数前面加 1 即可

在这里插入图片描述

4. 求 y = 2 + s i n ( 5 ∗ t ) y=2+sin(5*t) y=2+sin(5t) 的5次谐波(谐波次数可以任意指定)

只需在原来的信号函数前面加 2 即可

在这里插入图片描述

  • 11
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
分段函数在数学和工程学的实际应用中非常普遍。在MATLAB编写分段函数傅里叶展开非常简单。 首先,我们需要定义分段函数的区间和函数表达式。在MATLAB中,我们可以使用符号变量来定义函数表达式。然后,我们可以使用if语句来确定当前值是在哪个区间。一旦我们确定了当前值所处的区间,我们可以使用symsum函数或者int函数计算每个区间的傅里叶系数。 假设我们要编写分段函数f(x),其定义如下: 当0≤x<1时,f(x)=x; 当1≤x<2时,f(x)=2-x; 在MATLAB中,我们可以通过以下代码来定义分段函数: syms x; f(x) = piecewise(0 <= x < 1, x, 1 <= x < 2, 2 - x); 接下来,我们可以使用以下代码来计算f(x)的傅里叶展开系数: syms n; coeffs = zeros(1,6); % 初始化四个系数为 0 for i = 1:6 if i == 1 % 第一个区间 coeffs(i) = int(f(x)*exp(-j*2*pi*x*n), x, 0, 1); elseif i == 2 % 第二个区间 coeffs(i) = int(f(x)*exp(-j*2*pi*x*n), x, 1, 2); elseif i == 3 % 权重为零的系数 coeffs(i) = 0; elseif i == 4 % 权重为零的系数 coeffs(i) = 0; elseif i == 5 % 第二个区间 coeffs(i) = int(f(x)*exp(j*2*pi*x*n), x, 1, 2); else % 第一个区间 coeffs(i) = int(f(x)*exp(j*2*pi*x*n), x, 0, 1); end end 最后,我们可以使用以下代码将傅里叶系数绘制成频谱图: stem(-3:2, abs(coeffs)); xlabel('n'); ylabel('F_n'); title('傅里叶系数'); 这就是MATLAB编写分段函数傅里叶展开的过程。通过这个简单而强大的技术,我们可以为任何分段函数计算傅里叶系数,并进一步分析其频谱特性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值