1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
% ======================== 绘制时域波形图=======================
Fs = 1000; % 总的采样率
N = 1024; % 总的子载波数
T = N / Fs; % 信号绘制为一个周期的长度
x = 0 : 1/Fs : T-1/Fs; % 生成时间向量,用于绘制波形
Numscr = 4; % 绘制的子载波数量
s_data = 1; % 初始相位
y = zeros(Numscr, numel(x)); % 初始化存储每个子载波的复数值的矩阵
ini_phase = repmat(s_data, 1, numel(x)); % 生成与时间长度相匹配的初始相位向量
for k = 0 : Numscr-1 % 循环遍历要绘制的子载波数量
for n = 0 : numel(x)-1 % 循环遍历时间序列
y(k+1, n+1) = ini_phase(n+1) * exp(1i * 2 * pi * k * n / N); % 计算每个时间点上每个子载波的复数值
end
end

figure(1);
plot(x, real(y)); % 绘制时域波形
xlabel('时间/s');
ylabel('幅度/V');

% ======================== 绘制频域波形图=======================
f = (-Fs/2 : Fs/numel(x) : Fs/2-Fs/numel(x));
a = 20;
y1 = zeros(Numscr, a * N);
y_combined = horzcat(y, y1); % 水平拼接两个矩阵
f = (-Fs/2 : Fs/((a+1)*N) : (Fs/2-Fs/((a+1)*N)));
y_fft = zeros(Numscr, (a+1)*N);
for k = 1 : Numscr
y_fft(k, :) = real(fftshift(fft(y_combined(k,:)))) / N; % 计算每个子载波的频谱
end

figure(2)
plot(f, y_fft(1,:), f, y_fft(2,:), f, y_fft(3,:), f, y_fft(4,:));
grid on;
xlim([-10, 10]); % 将 x 轴范围限制在 -10 到 10 之间
xlabel('频率/Hz');
ylabel('幅度/V');

绘制时域波形图

  1. 定义采样率Fs、子载波数N、信号周期T、时间向量x、子载波数量Numscr、初始相位s_data
  2. 初始化一个矩阵y来存储每个子载波的复数值,以及一个初始相位向量ini_phase
  3. 使用双重循环计算每个子载波在每个时间点的复数值。外循环遍历子载波数量,内循环遍历时间序列。计算公式为y(k+1, n+1) = ini_phase(n+1) * exp(1i * 2 * pi * k * n / N)
  4. 使用plot函数绘制时域波形,x轴为时间s,y轴为幅度V

绘制频域波形图

  1. 定义频率向量f,扩展因子a,并初始化一个更大的矩阵y1来扩展y矩阵。
  2. 使用horzcat函数水平拼接yy1矩阵,得到y_combined
  3. 重新定义频率向量f以匹配扩展后的矩阵。
  4. 初始化一个矩阵y_fft来存储每个子载波的频谱。
  5. 使用循环计算每个子载波的频谱,通过对y_combined的每一行应用fft函数,然后使用fftshift函数进行频谱移位,并除以N进行归一化。
  6. 使用plot函数绘制频域波形图,x轴为频率Hz,y轴为幅度V。限制x轴范围在-10到10之间。

总结

生成特定的时间序列和相应的复数值,来模拟和绘制四个子载波的时域波形。然后,通过对这些波形进行傅里叶变换,绘制出它们的频域波形图。