| %% ======================================================================
|
| % 实验内容 1:方波信号的分解与合成(合集脚本)
|
| % 包括:
|
| % (1) 方波谐波分解(实验 1.1)
|
| % (2) 方波谐波合成对比(实验 1.2)
|
| % ======================================================================
|
|
|
| clc; clear; close all;
|
|
|
| %% ----------------------------------------------------------------------
|
| % 实验内容 1.1:方波信号的傅里叶级数分解
|
| % ----------------------------------------------------------------------
|
|
|
| A = 3; % 幅值
|
| f = 50; % 基频 50Hz
|
| w0 = 2*pi*f; % 角频率
|
| T = 1/f;
|
|
|
| t = 0 : 0.0001 : 2*T; % 时间:两个周期
|
|
|
| harmonics_idx = [1,3,5,7,9];
|
| N_terms = length(harmonics_idx);
|
| harmonics_data = zeros(N_terms, length(t));
|
|
|
| coeff_base = 4*A/pi;
|
|
|
| % 计算谐波分量
|
| for i = 1:N_terms
|
| k = harmonics_idx(i);
|
| harmonics_data(i,:) = (coeff_base / k) * sin(k*w0*t);
|
| end
|
|
|
| % ------------------------ 图 1:各谐波分量(分图显示) ------------------
|
| figure('Name','方波分解 - 单独谐波','Color','w');
|
| for i = 1:N_terms
|
| subplot(N_terms,1,i);
|
| plot(t, harmonics_data(i,:), 'LineWidth',1.5);
|
| grid on;
|
| ylabel(['k=',num2str(harmonics_idx(i))]);
|
| if i==1
|
| title('方波的前 5 项谐波分量(50Hz,幅值 3)');
|
| end
|
| end
|
| xlabel('时间 t (s)');
|
|
|
| % ------------------------ 图 2:谐波的三维 mesh 图 ----------------------
|
| figure('Name','方波分解 - 3D Mesh','Color','w');
|
| [X, Y] = meshgrid(t, harmonics_idx);
|
| mesh(X, Y, harmonics_data);
|
| view(3);
|
| title('方波各次谐波的三维波形');
|
| xlabel('时间 t (s)');
|
| ylabel('谐波序号 k');
|
| zlabel('幅值');
|
| colormap jet;
|
|
|
| % ------------------------ 图 3:谐波叠加 2D ------------------------------
|
| figure('Name','方波分解 - 2D叠加','Color','w');
|
| hold on;
|
| colors = ['r','g','b','m','k'];
|
| for i=1:N_terms
|
| plot(t, harmonics_data(i,:), 'Color',colors(i),'LineWidth',1.3);
|
| end
|
| title('前五谐波在同一坐标系叠加');
|
| xlabel('时间 t (s)');
|
| ylabel('幅值');
|
| legend("k=1","k=3","k=5","k=7","k=9");
|
| grid on;
|
|
|
|
|
| %% ----------------------------------------------------------------------
|
| % 实验内容 1.2:方波信号的傅里叶级数合成
|
| % ----------------------------------------------------------------------
|
| % =========================== 执行两种情况 ===============================
|
|
|
| % x1(t): |t|<1 → 1 , |t|>1 → 0
|
| % tau = 2, T = 4
|
| synth_square_wave(4, 2, [5,20,100], 'x1(t): T=4, 宽度 2');
|
|
|
| % x2(t): |t|<0.5 → 1 , |t|>0.5 → 0
|
| % tau = 1, T = 2
|
| synth_square_wave(2, 1, [5,20,100], 'x2(t): T=2, 宽度 1');
|
|
|
| % =================== 定义一个用于合成的函数 ============================
|
| function synth_square_wave(T, tau, N_values, fig_title)
|
|
|
| t_limit = 1.5 * T;
|
| t = -t_limit : 0.001 : t_limit;
|
| w0 = 2*pi/T;
|
|
|
| % 构造理想方波
|
| original = zeros(size(t));
|
| for i = 1:length(t)
|
| t_mod = mod(t(i) + T/2, T) - T/2;
|
| if abs(t_mod) < tau/2
|
| original(i) = 1;
|
| end
|
| end
|
|
|
| figure('Name', fig_title, 'Color', 'w');
|
|
|
| for k = 1:length(N_values)
|
| N = N_values(k);
|
| f_synth = zeros(size(t));
|
|
|
| % 直流项
|
| a0 = tau/T;
|
| f_synth = f_synth + a0;
|
|
|
| % 余弦系数 an
|
| for n = 1:N
|
| an = 2*(tau/T)*sinc(n*tau/T);
|
| f_synth = f_synth + an*cos(n*w0*t);
|
| end
|
|
|
| subplot(length(N_values),1,k);
|
| plot(t, original,'k--','LineWidth',1); hold on;
|
| plot(t, f_synth,'r','LineWidth',1.5);
|
| title(['谐波项数 N = ',num2str(N)]);
|
| legend('理想方波','合成波形');
|
| ylim([-0.2,1.2]);
|
| grid on;
|
| end
|
| end
|