
简介面向电子科大通信工程课程设计压缩包内容围绕基于带通采样结构的双边带调幅DSB数字收发机设计展开整合仿真代码、实验报告与配套硬件工程。压缩包共55个文件整体约1018KB核心内容包括MATLAB仿真脚本用于实现DSB调制及低通滤波多个Keil工程源码与编译产物覆盖LED、数码管、定时器、计数器等现代电子系统综合实验另附一份完整的数字无线电课程设计实验报告便于对照学习。已有327人学习下载。借助这份资料读者可掌握带通采样结构下的DSB调制与解调仿真流程理解数字收发机的分层实现思路并参考实验报告中的目的、原理、方法与结果分析提升课程设计完成效率与报告写作质量也为后续通信系统仿真实践打下基础。1. 带通采样 DSB 收发机的设计切入点把 10MHz 的射频信号直接送进 ADC采样率至少得 20MHz 起步但若是只关心某个 4MHz 宽的频带带通采样能用 8MHz 甚至更低的采样率把信号完整搬回基带这正是数字无线电里性价比最高的接收结构之一。电子科大这份数字无线电课程设计的核心就是让学生用 MATLAB 把「带通采样 DSB 调制解调」完整走一遍从 DSB.m 的调制端生成到 LPF_1.m 的滤波器设计再到 DSB_SC.m 的抑制载波变体最终形成一个可仿真的数字收发机链路。适合正在做通信原理课程设计、或者想搞懂软件无线电接收前端采样率到底怎么定的人也适合想把 MATLAB 脚本改成可复用仿真框架的工程师。2. 带通采样与 DSB 调制的基本原理2.1 带通采样在数字收发机中的直角坐标定位数字收发机和模拟收发机的根本区别在于中频或射频信号被提前数字化而带通采样结构要解决的核心问题是对于一个中心频率为 f_c、带宽为 B 的带通信号如何选择采样率 f_s使得频谱搬移后不发生混叠同时还能保留完整的边带信息。传统低通采样的思路是用 f_s ≥ 2f_H 去覆盖整个信号频谱范围当信号中心频率很高时这会导致 ADC 速率急剧上升。带通采样利用的是频谱的周期延拓特性采样后的数字频谱在 f_s 的整数倍处产生镜像只要选择恰当的 f_s使原始频谱的某个镜像恰好落在零频附近就能用远低于 2f_H 的采样率完成数字化。这个过程在数学上可表述为假设信号频谱占据区间 [f_L, f_H]则无混叠带通采样的约束为2f_H / (n1) ≤ f_s ≤ 2f_L / n其中 n 为满足 f_s ≥ 2B 的任意正整数B f_H - f_L。这里 n 的选取直接决定采样后的频谱搬移位置。当 n 取较大值时f_s 更接近 2B但过渡带要求变得更苛刻。换言之带通采样是在降低采样率和增加抗混叠滤波器阶数之间做权衡这在数字收发机设计里属于最前端的系统级决策直接决定后端 DSP 的处理复杂度。以课程报告中常见的参数为例若信号中心频率 10MHz、带宽 2MHz那么 n 4 时 f_s 可取 5MHz 左右频谱搬移后落在 0-2MHz 范围后端只需一个截止 2.2MHz 的低通滤波器就能提取完整边带信息。DSB 信号的两个边带包含相同信息带通采样后相位关系依然保持解调端可以通过乘以同频同相载波再低通来恢复原信号。2.2 DSB 调制的频谱结构与采样率的匹配DSB双边带调幅在时域上表示为 m(t) 与载波 cos(2πf_c t) 的乘积其频谱特性是基带信号频谱被搬移到 ±f_c 处上下边带对称但相位相反。DSB 与常规 AM 的关键区别是不传输载波分量发射功率全部用于边带传输但代价是在接收端必须重建相干载波否则解调后的信号会发生相位失真甚至完全抵消。在数字收发机仿真中DSB 调制需要两个步骤一是基带信号不能直接送乘法器必须先做抽样率转换使其与采样率匹配二是时域乘法在离散域表现为逐点相乘因此载波 NCO 的相位步进必须与采样率严格对应。MATLAB 中的典型做法是设定采样率 f_s那么载波序列为 cos(2π * f_c/f_s * (0:N-1))当 f_c 相对 f_s 不是整数倍时这个相位序列会跨多个周期频谱上表现为精确的单根谱线。带通采样与 DSB 结合时有一个容易被忽略的约束DSB 信号的总带宽是基带信号带宽的两倍上下边带各一份因此在选带通采样参数时B 应取 2 倍基带带宽。若基带信号是 1kHz 的音频DSB 信号带宽就是 2kHz采样率至少要大于 4kHz 才能保证边带不混叠。而课程设计里常见的做法是把基带信号通过载波调制到几百 kHz 的中频再用带通采样搬回基带附近便于直接观察频谱搬移效果。滤波器 LPF_1.m 在这里起到两个作用发射端滤除调制产生的镜像频率之外接收端还要用它从乘积检波器的输出中提取基带信号。低通滤波器的截止频率应略高于基带最高频率阻带衰减至少要 40dB 以上否则相邻频谱分量会泄漏进基带导致解调信噪比下降。3. 基于 MATLAB 的 DSB 数字收发机仿真链路搭建3.1 系统参数与上下变频链路规划搭建完整链路前先把参数规划好。假设基带信号为 1kHz 单音载波频率 850kHz系统采样率 8MHz这样带通采样比 n 取 4 时采样后频谱搬移在 0-2MHz 之间可以清晰观察混叠前后的变化。整个链路需要四个模块调制端、信道叠加、带通采样接收端、解调与滤波。以下是完整的 MATLAB 仿真脚本实现从 DSB 调制到带通采样解调的闭环流程% 参数定义 fs 8e6; % 系统采样率 8MHz fc 850e3; % 载波频率 850kHz fm 1e3; % 基带信号 1kHz fs_band 2e6; % 带通采样率 2MHz N 8192; % 样点数 % 基带信号与载波 t (0:N-1)/fs; m_t cos(2*pi*fm*t); carrier cos(2*pi*fc*t); % DSB 调制时域相乘 dsb_signal m_t .* carrier; % 带通采样前的抗混叠滤波巴特沃斯带通 [b, a] butter(6, [fc-2*fm, fc2*fm]/(fs/2), bandpass); dsb_filtered filter(b, a, dsb_signal); % 带通采样间隔抽取 dsb_sampled dsb_filtered(1:fs/fs_band:end); fs_new fs / (fs/fs_band); % 实际采样率 % 数字下变频乘以本地载波 t_new (0:length(dsb_sampled)-1)/fs_new; f_lo fc - fs_band*floor(fc/fs_band); % 镜像频率计算 lo cos(2*pi*f_lo*t_new); mix_out dsb_sampled .* lo; % 低通滤波提取基带 lpf_cutoff 2*fm / (fs_new/2); [b_lpf, a_lpf] butter(5, lpf_cutoff, low); recovered filter(b_lpf, a_lpf, mix_out);这段脚本的逻辑是首先生成基带单音信号与载波通过时域乘法完成 DSB 调制然后经过带通抗混叠滤波器目的是抑制带外噪声和镜像频率接着做整数倍抽取等效于以 2MHz 速率对模拟信号采样最后乘以本地恢复载波并低通滤波得到基带信号。关键参数 f_lo 的计算是带通采样的精髓所在当 f_c 大于 fs_band 的整数倍时采样后的频谱镜像会把载波搬到 f_lo f_c - fs_band * floor(f_c/fs_band) 的位置。本例中 f_c 850kHzfs_band 2MHzf_lo 850kHz因为 850kHz 本身小于 2MHz抽取后频谱依然在 850kHz本地振荡器频率与之一致才能正确搬回基带。3.2 频谱观察与混叠边界验证链路搭好后验证频谱搬移正确与否是仿真成败的关键。先观察调制端的频谱再对比采样后的频谱位置确认带通采样是否如理论预期那样把信号搬到了目标频带。下面是频谱分析代码% 频谱分析函数 plot_spectrum (sig, fs, title_str) ... plot(linspace(-fs/2, fs/2, length(sig)), ... fftshift(abs(fft(sig)))/length(sig), LineWidth, 1.2); figure; subplot(3,1,1); plot_spectrum(dsb_signal, fs, 原始 DSB 调制信号); xlabel(频率 (Hz)); ylabel(幅度); grid on; subplot(3,1,2); plot_spectrum(dsb_filtered, fs, 带通滤波后抑制带外噪声); xlabel(频率 (Hz)); ylabel(幅度); grid on; subplot(3,1,3); plot_spectrum(dsb_sampled, fs_new, 带通采样后频谱镜像); xlabel(频率 (Hz)); ylabel(幅度); grid on; % 观察解调输出 figure; plot((0:length(recovered)-1)/fs_new, recovered, b); xlabel(时间 (s)); ylabel(幅度); title(解调恢复信号); grid on;第一幅原始信号频谱中可以看到 850kHz 载波两侧各有 1kHz 的边带幅度对称。第二幅经过带通滤波后远离载波的噪声分量被压制但边带结构不变。第三幅是带通采样后的频谱此时横轴范围变为 ±1MHzfs_new/2原先在 850kHz 的信号直接以镜像形式出现。由于 fc 小于采样率的一半信号位置不变若 fc 大于 fs_band/2则需要重新计算镜像频率。比较dsb_signal和dsb_sampled的频谱可以验证混叠边界条件当 fc 靠近 fs_band/2 时上下边带可能部分重叠这在频谱图上表现为边带不对称。课程报告中应记录 fc 取不同值时频谱的变化以此验证带通采样定理的边界条件。3.3 LPF_1.m 中 FIR 滤波器设计参数的意义LPF_1.m 实现的是接收端的低通滤波器。在带通采样结构中低通滤波器决定了解调信号的质量——通带要平坦以保持基带波形不失真阻带衰减要足够大以抑制混叠噪声。课程代码里基于窗函数法设计 FIR 滤波器其核心参数包括阶数、截止频率和窗函数类型。% LPF_1.m 设计示例窗函数法 FIR 低通 function h LPF_1(N, f_cut, fs, wtype) % N: 阶数f_cut: 截止频率fs: 采样率wtype: 窗类型 fc_norm f_cut / (fs/2); % 归一化截止频率 n 0:N-1; hd 2*fc_norm * sinc(2*fc_norm*(n-(N-1)/2)); % 理想脉冲响应 switch wtype case hamming w 0.54 - 0.46*cos(2*pi*n/(N-1)); case hann w 0.5 - 0.5*cos(2*pi*n/(N-1)); case kaiser beta 5.0; w kaiser(N, beta); end h hd .* w; % 加窗截断 end这里的核心计算是理想脉冲响应hd由截止频率的归一化值决定。sinc函数对应理想低通滤波器的时域表示加窗的目的在于截断滤波器的非因果无限长脉冲响应典型有 Hamming、Hann、Kaiser 窗等其中 Kaiser 窗可以通过 beta 参数同时控制通带纹波和阻带衰减。滤波器阶数 N 的选取要平衡过渡带宽度和计算开销N 越大过渡带越窄但群延迟也越大在实时系统中会造成更大的处理延迟。课程设计中 N 取 64 或 128 比较合适既能获得约 40dB 的阻带衰减又不至于让 MATLAB 仿真速度过慢。f_cut应设为基础带宽加一点余量比如基带是 1kHzf_cut 设在 1.5kHz 左右最合适。参数化设计的好处在于修改 f_cut 可以适配不同基带信号带宽修改窗类型则能对比旁瓣抑制效果的差异。课程报告中可以将 Hamming 和 Kaiser 窗的输出对比图放入实验分析部分借此说明滤波器设计参数对解调质量的实际影响。3.4 DSB_SC.m 的抑制载波与相干解调DSB_SC.m 与 DSB.m 的区别在调制端前者完全抑制载波后者可能保留少量载波分量用于接收端同步。抑制载波的优势是发射功率全部用于边带传输但解调端必须自己重建频率和相位都同步的本地载波否则无法正确解调。% DSB_SC.m 抑制载波调制与相干解调 fc 100e3; % 载波 100kHz fs 400e3; % 采样率 400kHz4 倍过采样 t 0:1/fs:0.01-1/fs; m sin(2*pi*2e3*t); % 基带 2kHz 正弦 % 抑制载波调制 dsb_sc m .* cos(2*pi*fc*t); % 相干解调假设本地载波精确同步 demod dsb_sc .* cos(2*pi*fc*t); % 低通滤波恢复基带 fc_lpf 5e3 / (fs/2); [b, a] butter(5, fc_lpf, low); m_rec filter(b, a, demod); % 对比恢复信号与原始信号幅度差 gain_ratio max(abs(m_rec)) / max(abs(m)); disp([幅度恢复比: , num2str(gain_ratio)]);相干解调的关键操作是乘以同频同相载波。时域上两个相同频率的载波相乘会产生一个 2 倍频分量和直流分量低通滤波器去掉高频部分后基带信号被恢复。幅度恢复比反映滤波器的增益误差理想情况下为 1实际因滤波器通带纹波会有少量偏差。DSB_SC 在带通采样接收结构中的优势是载波完全不存在采样后的频谱干净利落不需要额外的载波泄漏抑制手段。但课程设计中要注意若用带通采样结构接收 DSB_SC 信号本地振荡器的频率偏移会直接导致解调后信号产生频偏表现为基带信号的频率偏移。模拟方法可以在调制端加固定频偏观察解调信号的频率变化加深对相干解调敏感性的理解。4. 仿真结果分析、参数影响与常见排错4.1 正常输出波形与频谱特征对照完整的收发链路仿真运行后应当得到如表所示的预期特征。对照这些特征可以快速判断系统是否正常工作。观测点预期特征异常表现排查方向调制端频谱载波两侧各有一条边带幅度对称边带不对称基带信号与载波频率设置冲突带通采样后频谱信号位于低频镜像无重叠出现杂散峰检查 f_s 是否满足带通采样约束混频输出频谱基带分量 2 倍载频分量出现奇次谐波查看数字混频是否引入非线性低通滤波后波形与基带信号同频幅度比例一致波形失真或幅度衰减调整滤波器阶数与截至频率频谱搬移方向边带位置对应 f_lo 计算值频率偏差核对 f_lo 公式中的取整运算以上特征是课程报告中「实验数据与结果分析」章节的重要组成部分。注意载波频率接近 f_s/2 时的频谱反转现象这是带通采样特有的坑当载波落在 (f_s/2, f_s) 区间时采样后频谱会发生倒置边带相对位置互换。若要正确解调本地载波相位也要相应反转或者在后端做频谱翻转处理。4.2 滤波器参数与带通采样频率的联动调节滤波器的截止频率和带通采样率是系统参数中关联度最高的两个量。带通采样率决定频谱搬移后边带与零频的间隔这个间隔又直接决定低通滤波器的过渡带宽度约束。例如采样率为 2MHz信号带宽 2kHz边带与零频之间间隔达几十 kHz滤波器设计余量充足若采样率压缩到 100kHz边带几乎贴近零频低通滤波器的过渡带必须非常陡峭否则基带信号与镜像边带产生严重串扰。实际调试中我一般会写一个参数扫描脚本固定调制端参数循环改变带通采样率和滤波器阶数绘制解调信噪比的曲面图。代码结构如下% 参数扫描改变 fs_band 与滤波器阶数 fs_band_list [1.5e6, 2e6, 2.5e6, 3e6]; N_list [32, 64, 128]; snr_matrix zeros(length(fs_band_list), length(N_list)); for i 1:length(fs_band_list) for j 1:length(N_list) % 调用链路仿真函数传入不同参数 snr_matrix(i, j) dsb_link_sim(fs_band_list(i), N_list(j)); end end % 绘制结果 imagesc(snr_matrix); xlabel(滤波器阶数); ylabel(带通采样率); colorbar; title(不同参数组合下的解调信噪比);增加滤波器阶数或提高采样率都能改善信噪比但代价是仿真耗时和滤波器群延迟。在课程报告中记录这组扫描结果能直观说明「带宽利用率与系统复杂度」的权衡关系也正好呼应带通采样结构的设计初衷。4.3 频谱混叠、边带翻转与滤波器截止频率不足的判据排错是课程设计中最花时间的环节这里总结三个最常见的问题和对应的判据。频谱混叠采样后 power spectrum 中除了目标镜像还能看到来自更高频段的寄生分量。判据是这些寄生分量与目标信号的距离恰好等于 f_s 的整数倍。解决方法提高带通采样率或增大抗混叠滤波器阶数。注意一个容易忽略的点模拟前端噪声也必须被带通滤波器限制否则噪声混叠进基带后无法被后端低通滤波器去除。边带翻转采样后观察边带频谱若原来在上边带的频率现在位于下边带说明发生了频谱倒置。这在用带通采样接收多通道信号时尤其容易踩坑。解决办法是在数字域做一次频谱翻转将采样序列交替取反乘以 (-1)^n即可将频谱搬移 f_s/2 并翻转。滤波器截止频率不足解调后波形虽然频率正确但幅度明显偏小且叠加了高频纹波。这说明低通滤波器截止频率设置过低滤掉了一部分有效边带能量。判据是恢复信号幅度随基带频率变化明显低频分量大、高频分量小。修正方法是把截止频率提高到基带最高频率的 1.2-1.5 倍但要同时验证不会引入邻道干扰。4.4 课程报告配套的 51 单片机示例与 MATLAB 仿真联动说明压缩包里还有一批现代电子系统综合实验的 C51 工程文件LED、数码管、定时器、计数器这些是硬件实验的配套代码用来实现基带信号的产生、显示或简单控制。它们在数字无线电课程设计中的角色是让 DSB 调制端的基带信号除了 MATLAB 仿真之外还能通过单片机的 DAC 或 PWM 输出真实模拟信号然后将输出信号直接送到示波器或 ADC 模块观察带通采样后的效果。不过要注意8051 单片机的主频有限直接做实时的 DSB 调制不现实常见的做法是把预先算好的基带采样点存在 ROM 表里通过定时器中断周期输出到 DAC。这一方式帮助学生建立「软件生成的数字信号变成真实模拟信号」的桥接认知。C51 工程里的 timer 模式设置正好对应采样周期的管理——TH0/TL0的初值决定了定时中断间隔即 DAC 输出的刷新率。在课程报告中可以这样处理两者的关联MATLAB 负责调制解调算法验证和参数扫描C51 工程验证基带信号产生与硬件输出环节的真实性。两者结合展示差异MATLAB 仿真是理想信道单片机示波器则是实际信道包含噪声和幅度失真。这种对比恰好是数字无线电收发机设计中「仿真-实物验证」闭环的体现。5. 用幅度谱峰值检测快速验证解调链路的正确性带通采样收发机仿真调试到后期最耗时的环节往往是确认「解调出的信号是不是正确的那一路」。当频谱图上一片复杂时直接用峰值检测法锁定基带频率是判断链路是否正确的快捷手段。% 基于 Goertzel 算法的基带频率检测 function [f_est, amp] goertzel_detect(x, fs, f_target, bw) % f_target: 期望检测的中心频率 % bw: 搜索带宽的一半 f_search linspace(f_target-bw, f_targetbw, 200); amp zeros(size(f_search)); for k 1:length(f_search) fk f_search(k); % 计算目标频率处的 DFT 幅值 coeff 2*cos(2*pi*fk/fs); s0 0; s1 0; s2 0; for n 1:length(x) s0 x(n) coeff*s1 - s2; s2 s1; s1 s0; end amp(k) sqrt(s1^2 s2^2 - coeff*s1*s2); end [~, idx] max(amp); f_est f_search(idx); end % 对解调输出执行检测 f_est goertzel_detect(recovered, fs_new, 1000, 100); disp([检测到基带频率: , num2str(f_est/1e3), kHz]);Goertzel 算法在不做完整 FFT 的情况下计算单个频率点的幅度比 FFT 效率高得多适合嵌入式实时频谱检测。这段代码在基带频率附近做精细搜索输出估计值和对应幅度然后判断估计值是否等于输入基带频率——若误差在 1Hz 以内说明从调制、采样、混频到滤波全链路正确若偏差明显则多半是本地载波频率计算有误返回到 f_lo 的公式重新核验。此方法还能用于评估载波同步精度人为给本地载波加 10Hz 频偏运行检测算法得到基带频率偏移约 10Hz恰好等于 carrier offset 的值由此量化系统对同步误差的敏感程度。配合带通采样结构的抽取比设计检查表使用几秒之内就能定位到底是参数问题还是代码逻辑问题这也是我做这类仿真时留在工具链里的最后一道自查工序。本文还有配套的精品资源点击获取