news 2026/9/12 11:56:12

基于MATLAB的带通采样DSB数字收发机设计与仿真实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于MATLAB的带通采样DSB数字收发机设计与仿真实现

简介:面向电子科大通信工程课程设计,压缩包内容围绕基于带通采样结构的双边带调幅(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 / (n+1) ≤ 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, fc+2*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 = 850kHz,fs_band = 2MHz,f_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 的边带,幅度对称。第二幅经过带通滤波后,远离载波的噪声分量被压制,但边带结构不变。第三幅是带通采样后的频谱,此时横轴范围变为 ±1MHz(fs_new/2),原先在 850kHz 的信号直接以镜像形式出现。由于 fc 小于采样率的一半,信号位置不变;若 fc 大于 fs_band/2,则需要重新计算镜像频率。

比较dsb_signaldsb_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应设为基础带宽加一点余量,比如基带是 1kHz,f_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; % 采样率 400kHz,4 倍过采样 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_target+bw, 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 的值,由此量化系统对同步误差的敏感程度。配合带通采样结构的抽取比设计检查表使用,几秒之内就能定位到底是参数问题还是代码逻辑问题,这也是我做这类仿真时留在工具链里的最后一道自查工序。

本文还有配套的精品资源,点击获取

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

项目管理三重境界:从工具依赖到心法修炼

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/12 11:54:40

AddFilter存储过滤框架:C++策略编排与Windows minifilter实战

简介:AddFilter存储过滤工具是一款面向IT系统管理员与存储工程师的轻量级实用工具,聚焦于数据写入前的策略化过滤与存储优化,适用于中小规模存储环境下的数据压缩、加密预处理及I/O性能调优等典型场景。资源包为RAR格式,共16个文件…

作者头像 李华
网站建设 2026/9/12 11:54:10

低代码地图Agent开发:Places+RoutePlan组件实战解析

1. 为什么需要低代码地图Agent?在传统的地图应用开发中,从地点搜索到路线规划的实现往往需要开发者处理大量底层API调用、数据解析和界面交互逻辑。以一个典型场景为例:用户搜索"北京西单大悦城",获取其经纬度后&#x…

作者头像 李华
网站建设 2026/9/12 11:51:42

工业以太网温湿度传感器:从TCP协议原理到Modbus TCP实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华