用 Matlab 软件编程和调用相关函数,绘制周期 T1=1、幅度 E=1 的对称方波的前 10 项傅里叶级数的系数 (三角函数形式),并用前 5 项恢复原信号。(1) 画出原时域波形和幅度谱; (2)绘出恢复后的时域波形,并与原波形比较并简要说明
时间: 2024-03-27 08:35:51 浏览: 98
好的,这是一个关于 Matlab 编程和信号处理的问题,我会尽力回答。首先,我们需要用 Matlab 生成对称方波信号。代码如下:
```matlab
% 生成对称方波信号
T = 1; % 周期为1
t = 0:0.01:10*T; % 时间范围
E = 1; % 幅度为1
x = E*square(2*pi/T*t, 50);
```
这里使用了 `square` 函数生成方波信号,其中第二个参数为占空比,这里取了50%。
接下来,我们需要计算对称方波的前10项傅里叶级数的系数。代码如下:
```matlab
% 计算前10项傅里叶级数的系数
N = 10; % 前10项
a0 = mean(x); % 直流分量
an = zeros(1, N); % 余弦项系数
bn = zeros(1, N); % 正弦项系数
for n = 1:N
an(n) = 2/T * trapz(t, x.*cos(2*pi*n/T*t)); % 余弦项系数
bn(n) = 2/T * trapz(t, x.*sin(2*pi*n/T*t)); % 正弦项系数
end
```
这里用到了 `trapz` 函数计算定积分,用到了余弦函数和正弦函数分别计算系数。
接下来,我们可以画出原时域波形和幅度谱。代码如下:
```matlab
% 画出原时域波形和幅度谱
subplot(2, 1, 1) % 第一行第一列
plot(t, x); % 原时域波形
title('Square Wave');
xlabel('Time (s)');
ylabel('Amplitude');
subplot(2, 1, 2) % 第二行第一列
stem([0, 1:N], [a0, an, bn]); % 幅度谱
title('Amplitude Spectrum');
xlabel('Harmonic Number');
ylabel('Amplitude');
```
这里用到了 `subplot` 函数将画布分成两行一列的子图,画出时域波形和幅度谱。
接下来,我们需要用前5项傅里叶级数恢复原信号。代码如下:
```matlab
% 用前5项傅里叶级数恢复原信号
N = 5; % 前5项
x_recovered = zeros(size(x)); % 初始化恢复信号
for n = 1:N
x_recovered = x_recovered + an(n)*cos(2*pi*n/T*t) + bn(n)*sin(2*pi*n/T*t);
end
x_recovered = x_recovered + a0; % 加上直流分量
```
这里用到了余弦函数和正弦函数分别计算恢复信号的每一项,最后将各项相加得到恢复信号。
最后,我们可以画出恢复后的时域波形,并与原波形比较并简要说明。代码如下:
```matlab
% 画出恢复后的时域波形,并与原波形比较并简要说明
figure; % 新建画布
plot(t, x, 'b', t, x_recovered, 'r--'); % 原波形为蓝色实线,恢复波形为红色虚线
title('Comparison of Original and Recovered Square Wave');
xlabel('Time (s)');
ylabel('Amplitude');
legend('Original', 'Recovered');
```
这里用到了 `plot` 函数将原波形和恢复波形画在同一个图中,并用 `legend` 函数添加图例。
通过比较原波形和恢复波形,我们可以发现,恢复波形在时间轴上和原波形非常接近,但在波形的转折处存在一定的误差,这是由于傅里叶级数只考虑了有限项,无法完全描述原始信号的所有特征。
阅读全文