资讯动态

MATLAB手写升余弦滤波器与眼图建模实战

发布时间:2026/9/13 18:37:04 来源:尧图企业网站定制
简介本资源是一套面向通信原理初学者与进阶学习者的MATLAB实践代码集聚焦数字基带传输系统核心实验环节涵盖升余弦滚降滤波器设计、最佳基带系统建模、基带信号眼图生成以及OOK、2PSK、2FSK、MPSK、DSB、SSB、VSB等多种调制解调算法实现。资源共52个文件以39个.m主程序文件为核心含信号生成、滤波、匹配滤波、误码率计算等关键模块12个.asv备份脚本便于版本回溯1个HTML格式的综合说明页提供快速入口整体压缩包仅29KB轻量易部署。已有716人下载学习所有代码均经作者实测校正可直接运行并支持参数调整与结果可视化配套注释清晰特别适合课程设计、仿真实验及通信系统原理理解深化。1. 这不是MATLAB练习题而是通信原理基带系统建模的实操入口如果你正在学《通信原理》课程手头有教材里“升余弦滚降滤波器”“眼图观测”“2PSK/2FSK基带信号生成”这些概念但始终卡在“知道定义却画不出波形、调不出眼图、分不清滚降系数α对带宽和ISI的影响”那么这套MATLAB程序就是你缺的那块拼图。它不依赖Simulink图形界面全部用脚本实现从时域脉冲成形、信道加噪、接收端匹配滤波到最终绘制眼图和星座图每一步都可调试、可修改、可嵌入自己的实验报告。适合通信工程本科生做课程设计、研究生复现经典基带系统、工程师快速验证调制参数对误码性能的影响。重点不是“跑通”而是理解为什么升余弦滚降能抑制码间干扰为什么最佳基带系统要求发送接收滤波器的联合频响是理想低通眼图张开度如何量化这些答案全藏在可逐行执行的MATLAB代码逻辑里。2. 升余弦滚降滤波器的设计与频域特性验证升余弦滚降Raised Cosine Roll-off不是数学玩具它是数字基带传输中平衡带宽效率与抗码间干扰ISI能力的核心工具。其频谱形状由滚降系数α0 ≤ α ≤ 1决定α0时为理想奈奎斯特滤波器零ISI但物理不可实现α1时带宽最宽但时域拖尾衰减最快。MATLAB中不依赖Toolbox也能精确构造关键在于理解其时域冲激响应公式$$ h_{rc}(t) \frac{\sin(\pi t / T_b) \cos(\alpha \pi t / T_b)}{(\pi t / T_b) (1 - (2\alpha t / T_b)^2)} $$其中 $T_b$ 是码元周期。直接计算该表达式在 $t0$ 和 $t \pm T_b/(2\alpha)$ 处存在奇点必须用极限处理——这正是初学者常报错Division by zero的根源。2.1 手动构造升余弦脉冲响应无通信工具箱依赖以下代码在MATLAB R2018b及以上版本中可直接运行生成长度为N的离散升余弦脉冲function h_rc rcosdesign_manual(alpha, span, sps, Ts) % alpha: 滚降系数典型值0.25, 0.35, 0.5 % span: 脉冲展宽倍数单位码元如10表示取±5个码元范围 % sps: 每码元采样点数samples per symbol建议≥8 % Ts: 码元周期秒如Ts1e-6对应1Mbps速率 N 2 * span * sps 1; % 总采样点数保证中心对称 t (-span:sps:span) * Ts; % 时域向量单位秒 h_rc zeros(size(t)); % 避开t0和分母为零点 idx_zero find(abs(t) 1e-12); if ~isempty(idx_zero) h_rc(idx_zero) 1; % t0处极限值为1 end idx_nonzero find(abs(t) 1e-12); t_nz t(idx_nonzero); denom (pi * t_nz / Ts) .* (1 - (2*alpha*t_nz/Ts).^2); num sin(pi * t_nz / Ts) .* cos(alpha * pi * t_nz / Ts); h_rc(idx_nonzero) num ./ denom; % 归一化使能量为1便于后续卷积功率控制 h_rc h_rc / sqrt(sum(h_rc.^2) * Ts); end提示此函数未调用rcosdesign()完全自主实现适用于无通信工具箱环境如部分高校机房或嵌入式MATLAB部署。sps参数直接影响时域分辨率——若设为4眼图将严重失真实践中建议sps ≥ 16以准确捕捉脉冲过零点。2.2 验证频域响应是否符合升余弦定义仅看时域波形不够必须验证其频域是否满足升余弦滚降谱。使用fft计算并绘制归一化幅度谱alpha 0.35; span 6; sps 16; Ts 1e-6; h_rc rcosdesign_manual(alpha, span, sps, Ts); f linspace(-1/(2*Ts), 1/(2*Ts), length(h_rc)); % 归一化频率轴Hz H_rc fftshift(fft(h_rc)); H_rc_mag abs(H_rc); figure; plot(f, H_rc_mag / max(H_rc_mag)); xlabel(Frequency (Hz)); ylabel(Normalized |H(f)|); title(sprintf(Raised Cosine Spectrum (\\alpha %.2f), alpha)); grid on; % 标出理论带宽边界B (1\\alpha)/(2T_s) B_theory (1alpha)/(2*Ts); hold on; plot([-B_theory, -B_theory], [0,1], r--, LineWidth,1.2); plot([B_theory, B_theory], [0,1], r--, LineWidth,1.2); legend(Simulated, Theoretical Bandwidth B);2.2.1 关键参数说明与调试建议参数含义典型取值调试影响alpha滚降系数0.25窄带、0.5折中、0.8强抗噪α越小带宽越窄但时域拖尾越长眼图闭合风险升高span脉冲截断长度码元数4~10span4时ISI显著span12计算量陡增但收益递减sps每码元采样点数8最低可用、16推荐、32高精度sps不足会导致FFT频谱泄漏无法准确验证滚降特性注意若绘图显示频谱在f ±(1α)/(2Ts)处未平滑归零而是出现振荡说明span或sps不足需增大二者之一。这是MATLAB数值计算中窗效应的直接体现非代码错误。3. 构建端到端数字基带传输系统并生成眼图眼图是基带系统健康状况的“心电图”。它不直接显示比特流而是将多个码元周期的波形在示波器触发下叠加显示从而直观暴露码间干扰ISI、噪声、定时抖动等问题。MATLAB中生成眼图的关键在于正确对齐采样点并按码元周期进行水平堆叠。常见错误是直接用eyediagram()函数却不理解其内部采样逻辑导致眼图扭曲。3.1 完整基带链路建模发送→信道→接收以下脚本构建一个完整的2PSK基带系统注意此处为基带非带通故2PSK即±1映射% 参数设置 M 2; % 二进制 k log2(M); % 每符号比特数 Ns 1000; % 符号数 sps 16; % 每符号采样点数 Ts 1e-6; % 码元周期 alpha 0.35; % 1. 生成随机比特流并映射为2PSK基带符号±1 bits randi([0,1], 1, Ns*k); symbols 2*bits - 1; % {0→-1, 1→1} % 2. 升余弦成形滤波发送滤波器 h_tx rcosdesign_manual(alpha, 6, sps, Ts); tx_signal upsample(symbols, sps); % 插值 tx_filtered filter(h_tx, 1, tx_signal); % 成形 % 3. 加性高斯白噪声信道SNR20dB EbN0_dB 20; Eb mean(tx_filtered.^2) * Ts * sps; % 每比特能量 N0 Eb / (10^(EbN0_dB/10)); noise sqrt(N0/2) * (randn(size(tx_filtered)) 1i*randn(size(tx_filtered))); % 注意基带系统中噪声为实数此处用复数仅为示意实际应为 real(noise_real) rx_noisy real(tx_filtered) sqrt(N0/2)*randn(size(tx_filtered)); % 4. 匹配滤波接收端升余弦滤波器 h_rx h_tx; % 最佳基带系统要求h_tx * h_rx h_rc_total此处取相同 rx_matched filter(h_rx, 1, rx_noisy); % 5. 采样判决定时恢复简化为理想同步 % 取每个符号周期的中心点第sps/2个采样点 rx_downsampled rx_matched(sps/2 : sps : end); decisions sign(rx_downsampled); % 硬判决3.2 手动绘制眼图理解eyediagram背后的机制MATLAB内置eyediagram()函数封装了复杂逻辑但手动实现能彻底掌握原理。核心是将接收信号按sps点为一组横向堆叠显示% 提取用于眼图的信号段取中间500符号避免边缘效应 start_idx floor(length(rx_matched)/3); end_idx start_idx 500*sps; signal_for_eye rx_matched(start_idx:end_idx); % 重塑为矩阵每行一个码元周期sps列共N_eye行 N_eye floor(length(signal_for_eye) / sps); eye_matrix reshape(signal_for_eye(1:N_eye*sps), sps, N_eye); % 绘制眼图 figure; plot(eye_matrix, Color, [0.2 0.2 0.2], LineWidth, 0.3); hold on; % 绘制平均眼图轮廓增强可读性 mean_eye mean(eye_matrix, 1); plot(mean_eye, r-, LineWidth, 1.5); xlabel(Time (samples)); ylabel(Amplitude); title(sprintf(Eye Diagram for 2PSK, \\alpha%.2f, SNR%.1fdB, alpha, EbN0_dB)); grid on;3.2.1 眼图关键特征解读与量化方法眼图中可直接读取的工程指标包括眼高Eye Height眼图在采样时刻横轴中点的垂直张开度单位V。越大表示噪声容限越高。眼宽Eye Width眼图在幅度过零点附近的水平张开度反映定时抖动容忍度。抖动Jitter过零点在时间轴上的标准差单位秒。以下代码自动计算眼高和抖动% 计算眼高采样点第sps/2个处的幅度范围 sample_point floor(sps/2); amplitudes_at_sample eye_matrix(:, sample_point); eye_height max(amplitudes_at_sample) - min(amplitudes_at_sample); % 计算抖动找每个波形过零点位置线性插值 zero_crossings zeros(N_eye, 1); for i 1:N_eye y eye_matrix(i, :); % 找第一个过零区间 idx find(y(1:end-1).*y(2:end) 0, 1); if ~isempty(idx) % 线性插值求精确过零点 x1 idx; x2 idx1; y1 y(idx); y2 y(idx1); zero_crossings(i) x1 - y1*(x2-x1)/(y2-y1); else zero_crossings(i) NaN; end end jitter_rms std(zero_crossings(~isnan(zero_crossings))); fprintf(Eye Height %.4f V, Jitter RMS %.3f samples\n, eye_height, jitter_rms);提示若眼图完全闭合eye_height ≈ 0优先检查alpha是否过大导致带宽过宽引入过多噪声或span是否过小ISI未充分抑制。不要急于调高SNR——先确保基带成形正确。4. 2FSK基带信号生成与频谱对比分析2FSK二进制频移键控在基带实现中并非直接生成两个正弦波而是通过正交载波调制低通滤波等效为基带复信号。但为简化教学常用“频率切换”法用两个不同频率的正弦波分别代表0和1再经升余弦滤波整形。这种方法虽非严格基带但能清晰展示频谱分离特性且与硬件直接对应。4.1 基于频率切换的2FSK信号构造区别于2PSK的±1映射2FSK需定义两个基带频率 $f_0$ 和 $f_1$。关键约束是频差 $\Delta f |f_1 - f_0|$ 必须足够大以保证两频谱主瓣不重叠。最小频差由码元速率 $R_b 1/T_s$ 决定通常取 $\Delta f \geq 0.75 R_b$。% 2FSK参数 f0 1e6; % 0码元对应频率Hz f1 1.75e6; % 1码元对应频率HzΔf 0.75e6 0.75/Ts t_symbol 0:Ts/sps:Ts-Ts/sps; % 一个码元内的时间向量 % 生成单个码元的2FSK波形未滤波 symbol_waveforms zeros(2, length(t_symbol)); symbol_waveforms(1,:) cos(2*pi*f0*t_symbol); % 0码元 symbol_waveforms(2,:) cos(2*pi*f1*t_symbol); % 1码元 % 对整个比特流生成2FSK信号 fsk_signal []; for i 1:length(bits) idx bits(i)1; % bits0→idx1, bits1→idx2 fsk_signal [fsk_signal, symbol_waveforms(idx,:)]; end % 升余弦滤波平滑频率切换瞬态 h_fsk rcosdesign_manual(0.25, 4, sps, Ts); fsk_filtered filter(h_fsk, 1, upsample(fsk_signal, sps));4.2 2PSK与2FSK频谱对比为什么2FSK更抗窄带干扰使用pwelch计算功率谱密度PSD直观对比二者频谱结构% 计算PSD使用相同参数保证可比性 [pxx_psk, f_psk] pwelch(tx_filtered, hamming(2048), [], 4096, 1/Ts); [pxx_fsk, f_fsk] pwelch(fsk_filtered, hamming(2048), [], 4096, 1/Ts); figure; subplot(2,1,1); plot(f_psk, 10*log10(pxx_psk)); title(2PSK Power Spectral Density); ylabel(PSD (dB/Hz)); xlim([0, 3e6]); grid on; subplot(2,1,2); plot(f_fsk, 10*log10(pxx_fsk)); title(2FSK Power Spectral Density); xlabel(Frequency (Hz)); ylabel(PSD (dB/Hz)); xlim([0, 3e6]); grid on; % 标出2FSK的两个主瓣中心 hold on; plot([f0 f0], ylim, r--, LineWidth,1); plot([f1 f1], ylim, r--, LineWidth,1); legend(PSD, f_0, f_1);4.2.1 频谱特征差异与工程选型依据特性2PSK2FSK频谱形态单主瓣能量集中主瓣宽度≈ $2R_b(1\alpha)$双主瓣中心距≈ $\Delta f$每个主瓣宽度≈ $R_b(1\alpha)$抗窄带干扰弱干扰落入主瓣即导致大量误码强只要干扰不同时覆盖两个主瓣可被接收机区分带宽效率高仅需 $R_b(1\alpha)$ 带宽低至少需 $2R_b(1\alpha) \Delta f$$\Delta f$ 占主导适用场景高速、带宽受限信道如光纤、5G NR低速、多径/窄带干扰严重信道如电力线通信、水声通信注意若2FSK频谱中两主瓣严重重叠$\Delta f$ 过小则无法通过滤波器分离此时误码率趋近于0.5。务必在设计阶段用上述PSD图验证频谱分离度。5. 最佳基带系统验证匹配滤波器增益与误码率仿真“最佳基带系统”的核心判据是在加性高斯白噪声AWGN下使输出信噪比SNR最大化。理论证明当发送滤波器 $H_t(f)$ 与接收滤波器 $H_r(f)$ 满足 $|H_t(f) H_r(f)|^2 \text{const} \cdot \text{rect}(f/B)$ 时达到最大SNR。升余弦滚降系统中令 $H_t(f) H_r(f) \sqrt{H_{rc}(f)}$ 即为平方根升余弦SRRC此时联合响应为 $H_{rc}(f)$。但教学中常简化为 $H_t H_r H_{rc}$虽非严格最优但实现简单且性能接近。5.1 匹配滤波器增益验证时域卷积 vs 频域相乘匹配滤波器的本质是发送脉冲的时域翻转共轭。对实信号即 $h_r(t) h_t(-t)$。验证其增益是否达理论最大值% 计算匹配滤波后SNR提升 % 噪声方差已知sigma2_n N0/2 sigma2_n N0/2; % 接收端匹配滤波器输出噪声功率 % 理论sigma2_out sigma2_n * sum(h_rx.^2) * Ts 连续时间等效 noise_out_var sigma2_n * sum(h_rx.^2) * Ts; % 信号分量在匹配滤波后峰值理想无ISI时 % 理论峰值 sum(h_tx .* h_rx) * A此处A1h_txh_rx peak_signal sum(h_tx .* h_rx) * Ts; % 计算理论匹配滤波SNR增益 snr_in Eb / sigma2_n; % 输入SNR每比特 snr_out_theory (peak_signal)^2 / noise_out_var; gain_theory snr_out_theory / snr_in; fprintf(Theoretical Matched Filter Gain %.2f (%.1f dB)\n, gain_theory, 10*log10(gain_theory));5.2 误码率BER蒙特卡洛仿真与理论曲线对比最后用统计方法验证系统性能是否逼近理论极限2PSK在AWGN下BER $Q(\sqrt{2E_b/N_0})$EbN0_vec 0:2:12; ber_sim zeros(size(EbN0_vec)); ber_theory zeros(size(EbN0_vec)); for i 1:length(EbN0_vec) EbN0_dB EbN0_vec(i); EbN0 10^(EbN0_dB/10); % 重用前述链路仅改SNR N0 Eb / EbN0; noise sqrt(N0/2) * randn(size(tx_filtered)); rx_noisy tx_filtered noise; rx_matched filter(h_rx, 1, rx_noisy); rx_downsampled rx_matched(sps/2 : sps : end); decisions sign(rx_downsampled); % 统计误码数忽略前100符号同步误差 errors sum(decisions(101:end) ~ symbols(101:end)); ber_sim(i) errors / (length(symbols)-100); % 理论BER ber_theory(i) qfunc(sqrt(2*EbN0)); end % 绘制对比图 figure; semilogy(EbN0_vec, ber_sim, bo-, LineWidth,1.5, MarkerSize,6); hold on; semilogy(EbN0_vec, ber_theory, r--, LineWidth,2); xlabel(E_b/N_0 (dB)); ylabel(Bit Error Rate (BER)); title(BER Performance of 2PSK Baseband System); legend(Simulation, Theory Q(\sqrt{2E_b/N_0})); grid on;5.2.1 仿真结果可信度判断要点若仿真曲线整体高于理论线约0.5~1dB属正常因有限符号数、滤波器截断、定时误差。若在高SNR区10dB仍高出2dB以上需检查✓sps是否≥16低采样率导致判决点偏移✓span是否≥6ISI未充分抑制✓ 噪声功率计算是否准确N0 Eb/EbN0中Eb是否为滤波后信号实际能量曲线在低SNR区4dB剧烈波动属统计误差增加Ns至5000可改善。关键技巧在调试BER曲线时先固定EbN010dB运行单次仿真用histogram(decisions(101:end) - symbols(101:end))查看误码分布——若误码集中在某几个符号位置说明ISI未消除若均匀分布则问题在噪声建模或判决门限。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价