AM调制是通信专业非常重要的一个知识点。今天我们使用MATLAB编程实现AM调制。
我们实现输入一个载波信号的频率与调制信号的频率后,再输入调幅度,得到已调信号的波形与包络信号的波形,再使用FFT算法分析出已调信号的频谱图。
源代码:
调制函数的编写:
function AM_modulation(m, fm, fc)
% 参数设置
fs = 10*fc; % 自适应采样频率(满足奈奎斯特准则)
T = 2; % 信号持续时间(秒)
t = 0:1/fs:T-1/fs; % 时间向量
% 验证调制参数合理性
if m < 0
error('调制指数不能为负数');
end
if fm >= fc
warning('调制频率接近或超过载波频率可能影响调制效果');
end
% 生成调制信号和已调信号
modulating_signal = m * cos(2*pi*fm*t);
carrier = cos(2*pi*fc*t);
am_signal = (1 + modulating_signal) .* carrier;
envelope = 1 + modulating_signal;
envelope1 = -(1 + modulating_signal);
% 绘制时域波形(增强可视化)
figure('Name','AM调制时域分析','NumberTitle','off');
ax1 = subplot(2,1,1);
plot(t, am_signal, 'Color', [0 0.4470 0.7410], 'LineWidth', 1.2);
hold on;
plot(t, envelope, 'r--', 'Color', [0.8500 0.3250 0.0980], 'LineWidth', 1.5);
plot(t, envelope1, 'r--', 'Color', [0.8500 0.3250 0.0980], 'LineWidth', 1.5);
title(['AM时域波形 m=', num2str(m), ', f_m=', num2str(fm), 'Hz, f_c=', num2str(fc), 'Hz']);
xlabel('时间 (s)');
ylabel('幅度');
legend('已调信号','理论包络','Location','best');
grid on;
xlim([0 3/fm]); % 显示3个调制周期
% 局部放大观察细节
ax2 = subplot(2,1,2);
plot(t, am_signal, 'Color', [0 0.4470 0.7410], 'LineWidth', 1.2);
hold on;
plot(t, envelope, '--', 'Color', [0.8500 0.3250 0.0980], 'LineWidth', 1.5);
plot(t, envelope1, '--', 'Color', [0.8500 0.3250 0.0980], 'LineWidth', 1.5);
title('局部放大');
xlabel('时间 (s)');
ylabel('幅度');
xlim([0 1/fm]); % 显示1个调制周期
grid on;
linkaxes([ax1,ax2],'y'); % 同步纵坐标范围
% 高级频谱分析(手动实现FFT)
N = length(am_signal);
fft_data = zeros(1,N);
% 离散傅里叶变换实现
for k = 1:N/2+1
cos_term = cos(2*pi*(k-1)*(0:N-1)/N);
sin_term = -sin(2*pi*(k-1)*(0:N-1)/N);
fft_data(k) = sum(am_signal.*(cos_term + 1i*sin_term));
end
P2 = abs(fft_data/N);
P1 = P2(1:N/2+1);
P1(2:end-1) = 2*P1(2:end-1);
f = fs*(0:(N/2))/N;
% 频谱可视化(动态范围调整)
figure('Name','AM频谱分析','NumberTitle','off');
stem(f, P1, 'filled', 'MarkerSize',4, 'Color',[0.6350 0.0780 0.1840]);
title(['信号频谱 f_c=',num2str(fc),'±',num2str(fm),'Hz']);
xlabel('频率 (Hz)');
ylabel('幅度');
grid on;
% 自动设置频率显示范围
freq_span = max(10*fm, 2*fc); % 自适应频率范围
xlim([max(0,fc-3*fm) fc+3*fm]);
xticks(unique([fc-fm, fc, fc+fm, linspace(fc-3*fm,fc+3*fm,5)]));
% 标注主要频率成分
hold on;
[~,idx] = max(P1);
text(f(idx), P1(idx), sprintf('%.1fHz\n%.2f',f(idx),P1(idx)),...
'VerticalAlignment','bottom');
annotation('textbox',[0.15 0.7 0.2 0.1],'String',...
sprintf('频率分辨率:%.2fHz',fs/N),'EdgeColor','none');
end
脚本的编写:
% 常规调制
input_m=input('请输入调制指数:');
input_fm=input('请输入调制信号频率:');
input_fc=input('请输入载波信号频率:');
AM_modulation(input_m, input_fm, input_fc)
导出图片
输入参数后,生成相应的波形:
导出包络波形和调制波形:
导出的频谱图: