news 2026/9/5 12:38:10

MATLAB实战:从零构建AM/FM调制解调系统与性能分析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MATLAB实战:从零构建AM/FM调制解调系统与性能分析

1. 从零理解AM/FM调制原理

第一次接触通信调制时,我被那些数学公式绕得头晕。直到用MATLAB画出波形图,才真正明白调制就是在玩"载波变形记"。想象载波是个快递小哥,调制信号是要送的包裹,调制过程就是把包裹"绑"在小哥身上。

AM调幅就像让快递小哥变胖变瘦。假设载波是cos(2πfct),调制信号是m(t),标准AM信号公式就是:

s_AM = (A + m(t)) .* cos(2πfct); % A是直流偏置

这个公式的妙处在于:包络线(A+m(t))完全复现了原始信号。我常用来演示的案例是:

fc = 1000; % 载波频率1kHz fm = 50; % 音频50Hz t = 0:1/48000:0.1; % 48kHz采样率 m = 0.8*cos(2*pi*fm*t); % 调制信号 s_AM = (1 + m) .* cos(2*pi*fc*t);

画出来的波形就像被50Hz正弦波捏扁搓圆的载波,用envelope函数可以完美提取包络。

FM调频则是让快递小哥加速减速。瞬时频率随m(t)变化:

phi = 2*pi*fc*t + 2*pi*kf*cumsum(m)*dt; % 相位积分 s_FM = cos(phi); % kf是频偏常数

这里有个坑:cumsum(m)*dt实现了对m(t)的积分运算,当初我忘了乘采样间隔dt,结果频偏完全不对。FM的频谱更复杂,用MATLAB的spectrogram函数能看到频率随时间波动。

2. 手把手搭建AM调制系统

2.1 标准AM调制实战

先看完整代码框架:

function [s_AM, t] = am_modulate(fc, fm, fs, duration) % 参数设置 t = 0:1/fs:duration-1/fs; m = 0.9*cos(2*pi*fm*t); % 避免过调制 % 调制核心代码 carrier = cos(2*pi*fc*t); s_AM = (1 + m) .* carrier; % 可视化 figure; subplot(2,1,1); plot(t, s_AM); hold on; plot(t, 1+m, 'r--'); % 显示包络 title('AM调制波形'); % 频谱分析 [f, PSD] = my_fft(s_AM, fs); subplot(2,1,2); plot(f, PSD); title('AM信号频谱'); end

关键点在于:

  1. 调制指数β=0.9(留10%余量防过调)
  2. my_fft是自写函数,比直接fft多了幅值校准

2.2 解调方案对比测试

我对比过三种解调方法:

  1. 包络检波(最简单):
envelope = abs(hilbert(s_AM)) - 1; % 希尔伯特变换
  1. 相干解调(需载波同步):
coherent = s_AM .* cos(2*pi*fc*t); demod = lowpass(coherent, fm, fs);
  1. 数字正交解调(抗频偏最强):
I = s_AM .* cos(2*pi*fc*t); Q = -s_AM .* sin(2*pi*fc*t); demod = sqrt(I.^2 + Q.^2);

实测发现当载波存在1%频偏时,相干解调信噪比下降20dB,而数字正交法仅下降3dB。不过计算量会大3倍,这是典型的性能与复杂度权衡。

3. FM调制系统实现技巧

3.1 窄带FM与宽带FM

FM系统有两个工作模式:

% 窄带FM(β<0.3) beta = 0.2; s_NBFM = cos(2*pi*fc*t + beta*sin(2*pi*fm*t)); % 宽带FM(β>1) beta = 5; s_WBFM = cos(2*pi*fc*t + beta*sin(2*pi*fm*t));

窄带FM频谱类似AM但有相位跳变,宽带FM会产生大量边频。用MATLAB的freqdev函数可以测量实际频偏。

3.2 解调中的微分陷阱

FM解调本质是相位微分,但直接数值微分会放大噪声。我的改进方案:

% 传统微分法 diff_phase = diff(unwrap(angle(hilbert(s_FM)))); demod = [0 diff_phase]/(2*pi*kf); % 改进的平滑微分 [b,a] = butter(4, 2*fm/fs); demod = filtfilt(b, a, diff_phase);

实测显示平滑微分能使信噪比提升15dB以上。此外,锁相环解调在强噪声下表现更好,但MATLAB实现较复杂,需要phased.PhaseLockedLoop对象。

4. 性能分析与实战建议

4.1 抗噪声能力实测

在相同信道条件下(SNR=10dB):

  • AM系统误码率约1e-2
  • FM系统可达1e-4
  • SSB介于两者之间

测试代码框架:

noisy_signal = awgn(s_AM, 10, 'measured'); ber = sum(abs(demod - m) > 0.5)/length(m);

4.2 参数选择经验

  1. 载波频率:至少8倍信号最高频率(防混叠)
  2. 采样率:建议4倍载频以上
  3. 滤波器设计
% AM解调用的低通滤波器 b = fir1(50, 2*fm/fs, 'low');
  1. 调试技巧:总是先测试单频信号(如1kHz正弦波),再过渡到实际语音信号。

最后分享一个血泪教训:曾因没加unwrap函数导致相位解调跳变,调试了整整两天。现在我的代码里一定会加上:

phase = unwrap(angle(hilbert(signal))); % 防相位跳变
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/1 21:56:24

【51单片机】1.2 如何实现按键?

目录 一、独立/矩阵按键 二、定时器原理 一、独立/矩阵按键 单片机往往是检测状态而不是检测过程按键消抖&#xff1a; 1.延时10ms&#xff08;不建议这种方法&#xff09; 2.定时器消抖&#xff0c;定时2ms检测&#xff0c;如下红色部分独立按键&#xff1a;主循环while(1&am…

作者头像 李华
网站建设 2026/9/1 5:46:01

【51单片机】1.9 AD转换原理

A/D Analog to Digital Converter主要指标&#xff1a;1.ADC的位数&#xff1a;1个n位的ADC表示这个ADC共有2的n次方个刻度2.基准源&#xff1a;基准电压&#xff0c;是ADC的参考标准; 类似一个尺子,尺子的长度&#xff0c;所以采集的电压不能超过这个值 3.分辨率&#xff1a;…

作者头像 李华
网站建设 2026/8/31 11:27:31

AI软件工厂设计模式:从多Agent协作到稳定流程落地

最近看了一眼“AI软件工厂设计模式直播第71期”这个主题&#xff0c;第一反应是&#xff1a;设计模式这种东西&#xff0c;在 AI 编程越来越成熟的今天&#xff0c;还有必要专门开直播讲吗&#xff1f;但再往下想&#xff0c;你会发现事情没那么简单。传统设计模式解决的是“代…

作者头像 李华
网站建设 2026/9/1 7:38:07

TouchGFX按键控制光圈移动:STM32F746的MVP架构与刷新机制解析

先交代一下这个活儿是怎么来的。手头有一块基于 STM32F746 的 RGB 屏开发板&#xff0c;4.3 寸 480272 分辨率&#xff0c;最初的需求一句话就能说完&#xff1a;做一个模拟相机取景器的界面&#xff0c;屏幕中间显示一个光圈&#xff0c;然后用板子上的方向键去控制这个光圈移…

作者头像 李华