尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

MATLAB实现DSB双边带调制解调仿真:从原理到代码的完整指南

MATLAB实现DSB双边带调制解调仿真:从原理到代码的完整指南 简介一份面向通信工程专业学生的MATLAB DSB系统仿真课程设计报告主要围绕抑制载波双边带调幅DSB系统的调制与解调原理展开完整实现了基于Matlab编程和Simulink建模两种方式的系统仿真。压缩包内共1个docx文档大小约1.89MB包含课程设计报告从摘要到参考文献的标准结构第一章引言阐述设计目的与意义第二章介绍Matlab与Simulink的功能特点第三章从时域和频域推导DSB信号的调制、解调原理第四章给出基于Matlab编程的调制、高斯白噪声信道、解调仿真代码与波形第五章搭建Simulink整体模型并展示各关键点波形第六章进行结果分析最后附心得体会与参考文献。已有392人学习下载适合正在完成通信原理课程设计或需要快速理解DSB系统仿真的本科生学习参考。报告不仅提供了可直接运行的代码和建模思路还通过Simulink模型直观呈现信源、载波、乘法器、高斯白噪声信道、低通滤波等模块的连接与输出波形帮助读者系统掌握模拟通信系统仿真的完整流程。1. 为什么我推荐用MATLAB做DSB仿真一次把课程设计吃透又到了一年两度的通信原理课程设计季后台私信里问DSB双边带调制仿真的人明显多了起来。大家的诉求高度一致老师要求用MATLAB把DSB调制解调系统完整仿真出来给出波形图、频谱图最好再分析一下噪声对系统的影响但课本翻了好几遍代码却不知道从哪一行开始写。说实话DSB这个选题在通信原理课程设计里属于“性价比”非常高的一类。它比AM普通调幅多了一个“抑制载波”的细节要理解比FM调频少了一大堆非线性分析的门槛比SSB单边带又不需要额外啃频域滤波的希尔伯特变换。一套MATLAB代码写下来调制、解调、加噪、滤波、频谱分析、性能评估这些通信系统的核心环节全都覆盖到了老师想看的知识点一个不少而且整个仿真链路逻辑清晰不像某些课题调了半天参数波形还是糊成一团。可以说选DSB做课程设计是一个成熟且稳妥的决策。这篇博文我会直接给出一个完整的仿真方案从原理推导到代码实现再到波形分析按我实际做项目时的思路来写。你不需要是MATLAB高手只要懂一点矩阵运算基础跟着走完全能自己跑出结果。代码块我会直接给全参数也给全你自己在MATLAB里粘贴运行就能看到完整的调制解调链路。2. 动手写代码之前先把DSB的调制解调链路在纸上跑通2.1 调制端信号和载波相乘电路上就是一个乘法器DSB调制的基本表达式很简单假设基带信号为 m(t)角频率为 ω_c 的载波为 cos(ω_c t)调制后的输出就是s(t) m(t) · cos(ω_c t)关键在于“抑制载波”四个字。AM调制的时候我们会在表达式里额外加一个直流偏置 A_0让包络比较容易看出来方便用包络检波器解调。但DSB不加这个直流分量也就是说载波分量被完全抑制掉了表达式的每一项都是上下两个边带的贡献。这样带来的直接好处是功率效率高——发射机的功率全部用来传送有用信息而不是浪费在没有任何信息量的载波上。代价是解调端不能用简单的包络检波必须用相干解调也就是本地要恢复出一个和发送端同频同相的载波再做一次乘法运算。在MATLAB里实现调制本质上就是对离散采样点做逐点的乘法运算。你不需要真的搭一个乘法器电路只需要保证采样率够高、频率参数设置合理乘法做完之后频谱自然就是课本上画的那个样子。2.2 解调端本地载波相乘加低通滤波缺一不可相干解调的数学过程是接收信号 r(t) 再乘一次本地载波v(t) s(t) · cos(ω_c t) m(t) · cos²(ω_c t) 0.5·m(t) 0.5·m(t)·cos(2ω_c t)这个式子里藏着一个关键信息乘完本地载波之后信号被分成了两部分前半部分是恢复出来的基带信号乘了个0.5系数后半部分是频谱搬到了 2ω_c 附近的高频分量。所以低通滤波器在这里不是可选项而是必需品。没有滤波器时域波形看起来就是“一团纠缠在一起的高频振荡”你会怀疑自己是不是哪里写错了。低通滤波器的设计是整个仿真里最讲究的一个环节后面我会单独展开说。2.3 噪声用AWGN信道模拟真实传输环境课程设计如果只做调制解调而无噪声分析那充其量算完成了一半。实际通信系统里信号经过信道必然叠加噪声最常见的模型就是加性高斯白噪声AWGN。噪声功率谱在整个频带内均匀分布幅度服从高斯分布。在MATLAB里用 awgn 函数就可以直接给信号添加指定信噪比的噪声。信噪比的设置有两种方式指定SNR数值或者指定噪声功率。实操中建议先固定信噪比为一个定值比如15dB然后观察解调波形质量再用循环扫描不同信噪比画出解调输出信噪比随输入信噪比变化的曲线这样一来课程设计的“性能分析”部分也顺利交差了。3. 仿真参数设置为什么我的波形图看起来是错的课程设计里最让新手崩溃的事情不是代码报错而是代码跑通了、图也画出来了但波形看起来跟课本完全不像。轻则波形包络不对重则频谱全乱连判断依据都没有。99%的情况问题都出在参数设计上而不是代码逻辑上。3.1 采样率决定你的信号“真实感”的下限采样率是所有仿真参数的基石。我在验证代码时发现很多同学直接 fs 1000然后载波也选 100Hz前者刚好是后者的10倍看起来满足了奈奎斯特采样定理采样率大于信号最高频率两倍但仿真出来的波形十分“粗糙”包络看起来不像正弦波反而像锯齿波。这是为什么因为正弦波要画得光滑每个周期起码得有20到50个采样点才行。10倍采样率就意味着一个载波周期只有10个点用 plot 函数连线的时候点与点之间是直线正弦曲线的弧度全靠那10个点撑当然看起来一棱一棱的。我的建议是载波频率设为 fc 100Hz采样率设成 fs 10000Hz 或者更高这样每个载波周期有100个采样点画出来的波形才够顺滑。基带信号的频率建议设为 fm 5Hz 或10Hz载波频率至少是基带频率的10倍以上这样调制的效果在时域波形上能看得很清晰。3.2 频率参数选择载波、基带、采样率的黄金配比在很多课程设计的参考代码里载波频率和采样率的比例经常是个“拍脑袋”的参数。有些代码里 fc 1000fs 100000跑出来的波形确实很漂亮但问题是频谱图的横轴刻度太大DSB边带只有几百赫兹的带宽在几千赫兹尺度的频谱图上挤成一团根本看不出“双层边带”的结构。我自己调配出来的常用参数组合是这样的基带信号频率 fm 10Hz载波频率 fc 100Hz采样率 fs 2000Hz采样时长 t 1s这样载波频率是基带频率的10倍频谱图上两个边带中心分别在90Hz和110Hz基带中心在10Hz三者分得非常开边带结构的细节一览无余。而且2000Hz的采样率对于一个100Hz的载波来说已经绰绰有余每个载波周期有20个点配合插值效果画出来的图已经足够美观。还有一点很多人没想到FFT频谱分析时要让频谱图看起来“干净”时域信号的长度最好能整除载波和基带的周期。采样时长取1秒、采样频率取2000Hz时采样点数为2000个点能够正好覆盖整数个基带周期和整数个载波周期这样FFT分析的频谱泄漏会被压到最低出来的频谱图最干净。4. 完整MATLAB仿真代码从信源生成到性能分析4.1 信源、载波与调制模块十行代码搞定DSB下面是整个仿真的核心代码段我按功能模块拆开讲% 参数设置 fs 2000; % 采样率 2000Hz t 0 : 1/fs : 1-1/fs; % 1秒时长 fm 10; % 基带信号频率 10Hz fc 100; % 载波频率 100Hz % 基带信号与载波 mt 2 * cos(2*pi*fm*t); % 基带信号幅度设为2 ct cos(2*pi*fc*t); % 载波信号 st mt .* ct; % DSB调制信号这里基带信号幅度我特意设成2而不是常见的1原因是解调输出会有一个0.5倍衰减幅度大一点在波形对比时视觉上更明显也方便看包络的恢复情况。当然幅度取多少完全不影响DSB系统的本质特性只是画图美观的考虑。4.2 加噪与相干解调滤波器设计是核心中的核心% 添加高斯白噪声信噪比15dB snr 15; r awgn(st, snr, measured); % 相干解调接收信号乘本地载波 demod r .* ct; % 低通滤波器设计 [f_b, f_a] butter(10, 0.2, low); % 归一化截止频率 截止频率 / (fs/2) 20/1000 0.02 不对这里要仔细想停一下上面这一段我把滤波器设计故意写了个“错误值”来演示一个常见陷阱。butter 函数的第二个参数是归一化截止频率范围是0到1对应实际角频率从0到奈奎斯特频率fs/2 1000Hz。如果我们想让截止频率在30Hz左右归一化截止频率就是 30/1000 0.03。代码里的0.2对应的实际截止频率是200Hz这会把载波频率附近的成分放进来根本滤不干净。正确的滤波器设计如下% 正确设计低通截止频率设为 40Hz Wn 40 / (fs/2); % 归一化截止频率 [b, a] butter(8, Wn, low); mt_hat filter(b, a, demod); % 滤波后即恢复信号为什么截止频率取40Hz因为基带信号在10Hz而解调后的高频分量在 2fc - fm 190Hz 到 2fc fm 210Hz 附近。40Hz刚好介于两者之间既能完整保留基带信号又能把高频分量彻底滤除。滤波器阶数选8阶或者10阶都行阶数越高过渡带越窄但相位延迟也越大这一段用8阶比较均衡。4.3 频域分析用FFT看清“双边带”的真实面貌调制信号和时间信号看多了容易昏头频域才是通信人的“主战场”。FFT分析代码如下% 频域分析 N length(st); f (0 : N-1) * fs / N; % 频率轴 % 取单边谱 S_spectrum abs(fft(st)) / N * 2; S_spectrum(1) S_spectrum(1) / 2; % 绘制频谱 figure; plot(f(1:N/2), S_spectrum(1:N/2)); xlabel(频率/Hz); ylabel(幅度); title(DSB调制信号频谱);这里有一个细节fft 得到的频谱是双边谱能量分布在正负频率各一半画单边谱的时候要乘以2直流分量第1个点不乘。这个细节如果不注意画出来的频谱幅度差一半看起来非常不专业答辩的时候容易被老师逮住追问。4.4 性能分析信噪比扫描与误码率对比如果只做一个固定信噪比的仿真那课程设计的“性能分析”部分就太单薄了。我建议加一段信噪比扫描代码snr_range 0 : 2 : 20; mse_values zeros(size(snr_range)); for k 1 : length(snr_range) r_k awgn(st, snr_range(k), measured); demod_k r_k .* ct; mt_hat_k filter(b, a, demod_k); % 计算均方误差评估解调质量 mse_values(k) mean((mt - mt_hat_k).^2); end figure; plot(snr_range, 10*log10(mse_values), o-); xlabel(输入信噪比/dB); ylabel(解调信号MSE/dB); title(解调质量随信噪比变化);这一段代码跑出来的图可以非常直观地说明一个问题随着信噪比上升解调输出的均方误差下降解调质量越来越好。把这个图放进课程设计报告里整个系统的性能分析就完整了。5. 复现过程中最常见的四个坑我踩过希望你跳过代码本身不难但我在帮学弟学妹debug的过程中发现有几个问题是出现频率极高的。这里一次性给大家交个底。5.1 滤波器相位延迟解调信号和原信号对不上怎么办这是最容易被忽视的问题。用 filter 或 butter 这一类的IIR滤波器做低通滤波信号会有相位延迟把恢复的信号和原始基带信号放在同一张图里对比时两条曲线存在明显的水平偏移很多同学以为是自己代码写错了。这其实是正常现象。要避免这种尴尬有两个方案用 filtfilt 代替 filter进行零相位滤波信号在时域上不会有偏移波形对齐效果完美。绘图时手动对齐数据点将恢复信号平移滤波器延迟的采样点数。我倾向于用 filtfilt一行代码就能解决问题mt_hat filtfilt(b, a, demod);注意 filtfilt 对信号的起始和结束端有额外的处理一般仿真场景直接用它替换 filter 不会有任何问题。5.2 本地载波相位失配噪声之外的另一种“失真源”你可能会想如果本地载波不是完全同频同相解调效果会怎样这也是老师在答辩时最爱追问的一个问题。我建议你在报告中主动加上一小段“相位偏移对解调性能的影响”phase_offset pi/6; % 30度相位偏移 ct_local cos(2*pi*fc*t phase_offset); demod_phase r .* ct_local; mt_hat_phase filtfilt(b, a, demod_phase);由于 cos(ω_c t φ) 乘接收信号后除了期望的基带分量还有一个带 2ω_c 的高频项和一个与相位相关的衰减因子 cos φ。当 φ 不等于0时解调信号幅度衰减为原来的 cos φ这就是相位失配带来的功率损失。在DSB里30度相位偏移会导致约13.4%的幅度损失虽然波形形状不变但信号功率下降了。这一段分析如果写进报告会显得你对系统原理的理解非常扎实。5.3 频谱泄漏为什么我的FFT频谱图有“毛刺”频谱图上出现非预期的毛刺几乎都是FFT点数与信号周期没有对齐造成的。解决办法其实很朴素保证采样时长是基带和载波周期的整数倍。比如上面用1秒采样时长对10Hz和100Hz来说都是整数倍周期基本不会出现严重的频谱泄漏。如果信号长度本来就不对齐可以用 hann 窗函数先加窗再做FFT虽然主瓣会变宽但旁瓣能量被有效抑制频谱更干净。对于课程设计这种场景第一种方案就够用了。加窗是工程实践里才必需的手段不必把问题复杂化。5.4 图形窗口的排列多张图混在一起看不清怎么办很多同学会把调制波形、解调波形、频谱图、噪声图全部画在同一个 figure 里结果一张图叠一张图完全没法看。我的建议是每个关键结果都单独开一个 figure并且用 subplot 按逻辑分组展示。比如调制端的时域波形和频谱放同一张图、解调端的时域波形和频谱放另一张图每一张图用 title 和 legend 标注清楚答辩演示时一目了然。6. 从课程设计到系统思维MATLAB仿真做完之后还能做什么代码跑通、报告写完、答辩结束你的DSB仿真就算暂时告一段落了。但站在一个过来人的角度看这门课程设计其实是你第一次把“通信原理”从数学公式变成可视化波形这个从抽象到具象的过程价值远不止一个学分。以下几个方向是我强烈建议你课后继续尝试的扩展实验把基带信号从单音余弦换成一段语音观察DSB解调后语音能否听清亲身体验“边带承载信息”的直观感受。改用方波作为基带信号频谱上观察方波的高次谐波在调制后如何分布在频带内这对理解带宽概念非常有帮助。对比DSB-SC与普通AM在相同信噪比下的解调质量用同一套仿真框架画两条曲线定量感受“抑制载波”带来的功率效率提升。尝试用 Simulink 搭一个图形化的DSB模型拖拽模块之间连上线就能仿真从代码思维切换到框图思维对理解系统级设计也有帮助。我个人在实际操作中体会最深的一点是仿真最大的价值不是“得到一个正确的结果”而是“改一个参数、看一个波形变化、再想一个为什么”。带着这个习惯去做仿真你的收获会远超课程设计本身。这次DSB的完整仿真链路跑通之后你再去碰AM、SSB、FM的代码会发现很多模块是可以直接复用的通信系统的设计思路是相通的。本文还有配套的精品资源点击获取
返回列表