ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MATLAB实现ASK无线通信系统仿真:从参数设置到误码率分析

MATLAB实现ASK无线通信系统仿真:从参数设置到误码率分析 简介利用MATLAB设计并仿真无线通信系统的完整方案主要面向通信工程专业学生及MATLAB仿真入门者解决ASK调制在噪声信道下的建模与验证问题。资源围绕单音频信源产生、振幅键控调制和加性高斯白噪声信道展开覆盖信号生成、调制映射、AWGN加噪、多径信道模拟、相干解调以及误码率统计等典型环节压缩包内仅含1个MATLAB脚本.m文件整体体积仅3KB结构轻量适合逐行阅读并修改参数。已有150人浏览学习。脚本以正弦波生成单音频模拟信号通过改变载波振幅来映射二进制数据完成ASK调制并借助awgn函数在二径信道模型上叠加高斯白噪声最终绘出解调器输出性能与信噪比的关系曲线读者可据此调整载波频率、码元速率等参数对比不同SNR下的误码率也可作为课程设计或通信原理实验的参考模板深化对ASK调制和相干解调原理的理解。1. 把 rar 里的 ASK 无线通信系统变成 MATLAB 能跑的链路先从题目顺序开始从网盘或课程平台下到一个没有说明文档的 rar解压后往往只有一句话利用 MATLAB 设计并仿真无线通信系统模拟信源为单音频信号模拟调制方式为 ASK信道噪声为加性高斯白噪声。这类题目的考察点不在“会搜代码”而在能不能把一句口语化成参数和模块单音频是载波的模拟形态ASK 实际是数字调制AWGN 决定误码率曲线的下限。直接拿正弦波和随机比特做乘法加噪声后解调确实能出波形但若不做包络判决和 SNR 换算BER 会离理论值差出一大截。下面按课程设计最常见的完整做法把参数设定、MATLAB 脚本、Simulink 框图、误码率验证和几个容易翻车的细节全部过一遍。适合正在做通信仿真作业或者想快速用 MATLAB 把 ASK 链路复现出来的人。2. 参数先行单音频信源、ASK 调制和 AWGN 信道的建模口径模拟调制方式为 ASK意味着信源是把二进制比特“刻”在载波幅度上。这里最容易出现的理解偏差是把单音频信号直接当成基带信息。单音频在仿真里应当承担载波角色真正的信息比特需要用通断键控的方式去控制它。建模仿真之前先把采样率、符号速率、载波频率和信噪比换算定死后面所有代码才不会来回改参数。2.1 单音频信源数字化采样率、载波频率与每符号采样数MATLAB 里不可能处理连续时间信号单音频信源必须先采样。常见的课程设计配置是载波频率 fc4000 Hz符号速率 Rs2000 Baud采样率 fs40000 Hz。这样每个符号占 20 个采样点一个载波周期占 10 个采样点既保证波形可看又满足 Nyquist 采样。更重要的是每个符号周期内正好有偶数个载波周期符号与符号之间相位自然连续后续做相干解调不会引入相位跳变带来的额外损失。参数初始化直接放在脚本头部即可% init_system.m fs 40000; % 采样率 40 kHz fc 4000; % 单音频载波频率 4 kHz Rs 2000; % 符号速率 2000 Baud sps fs / Rs; % 每符号采样点数固定为 20逻辑说明fc 和 sps 的配合决定了每个符号内能看到几段完整的正弦波sps 还直接影响后续仿真的数据量和 AWGN 的功率换算。这里让 fs/fc10意味着载波每个周期被采 10 个点画波形和计算眼图都足够。参数说明载波频率不要取 fs 的一半附近否则成形滤波器会没有过渡带sps 也不宜小于 10否则包络检波后的积分结果抖动会很大。2.2 OOK/ASK 信号与相干、非相干解调的差异2ASK 在题目默认等概率信源时通常退化为 OOK也就是通断键控比特 1 发送单音频比特 0 发送零幅度。这样写出的发射信号表达式为s(t) A m(t) cos(2π fc t)其中 A 是载波振幅m(t) 是 0/1 的矩形脉冲序列。接收端有两条路线一条是相干解调需要本地载波与接收信号相乘后低通滤波另一条是包络检波直接取接收信号幅度再判决。相干解调的理论误码率更低但在没有载波同步模块的仿真里相干接收的相偏问题比 AWGN 本身更麻烦。包络检波不需要恢复载波对初相不敏感因此课程设计和工程验证里更常用。解调方式判决依据理论误码率OOK相干解调乘本地载波后积分与 A·Tb/2 比较Q(sqrt(Eb/N0))包络检波包络采样值与阈值比较0.5·exp(-Eb/(2N0))从表达式能看出包络检波在高信噪比下比相干解调差 1 到 3 dB这个差距在后面的 BER 曲线里应能复现。如果仿真跑出来的差距远大于 3 dB问题一般不在解调方式而在噪声功率或判决阈值的换算。2.3 在 MATLAB 的 awgn 函数中换算 EbN0 与 SNRAWGN 信道在 MATLAB 里最直接的做法是awgn函数但awgn只能按 SNR 加噪声题目给的是信噪比概念实际衡量通信系统通常用 Eb/N0。两者必须先换算否则画出的误码率曲线和理论值完全对不上。% 由目标 Eb/N0 换算 awgn 的 SNR EbNo_dB 8; snr_dB EbNo_dB 10*log10(2*Rs/fs); rx awgn(tx, snr_dB, measured);逻辑说明snr_dB 的计算里出现了2*Rs/fs这是实数带通采样的结果。接收端按采样率 fs 采集带通信号噪声功率分布在 fs 的带宽范围内而单个比特只占用 1/Rs 秒所以信噪比换算要乘上这个比例。measured参数会让 awgn 先测量 tx 的均值功率再按 snr_dB 生成噪声避免手动计算信号幅度带来的舍入误差。参数说明如果改为复基带仿真snr_dB 的计算公式要去掉系数 2如果使用成形滤波器改变了平均功率仍建议保留measured不要直接填固定 signalpower。提示理论 Eb/N0 越高需要的num_bits越多。目标是 10^-4 以下的 BER仿真比特数至少要到 1e6否则曲线尾部落不下去。3. 用 MATLAB 脚本搭建可运行的 ASK 通信链路并把 BER 算出来参数定完后整条链路可以浓缩成一个函数文件。函数输入是目标 Eb/N0输出是实测 BER。这样做的最大好处是后续跑多个 Eb/N0 点时不需要反复修改主脚本循环调用同一个函数即可。3.1 最小闭环代码从随机源、单音频开关到包络判决下面这个函数把随机比特生成、OOK 调制、AWGN 信道、包络检波、符号判决和误码率统计全部包含进去% ask_awgn_chain.m % 输入 EbNo_dB返回当前信噪比下的 OOK 误码率 function ber ask_awgn_chain(EbNo_dB) fs 40000; fc 4000; Rs 2000; sps fs / Rs; num_bits 1e6; rng(1); % 固定随机种子保证结果可复现 bits randi([0 1], num_bits, 1); % 等概率随机二进制信源 t (0:sps-1). / fs; % 一个符号内的采样时刻 carrier sin(2*pi*fc*t); % 单音频载波信号 % kron 将每个比特复制成一段 carrier 或全零块 tx kron(bits, carrier); % 由 Eb/N0 换算实际 SNR并加高斯白噪声 snr_dB EbNo_dB 10*log10(2*Rs/fs); rx awgn(tx, snr_dB, measured); % 包络检波取绝对值后按符号积分等效为匹配滤波 r_mat reshape(abs(rx), sps, num_bits); env mean(r_mat, 1).; % 简单阈值判决取发射包络高低两个电平的中间值 th (max(env) min(env)) * 0.5; bits_rx env th; ber mean(bits_rx ~ bits); end逻辑说明kron(bits, carrier)的内部逻辑是把每个 bit 与整个 carrier 波形相乘比特 1 得到一段完整正弦比特 0 得到零向量这样的向量化写法比 for 循环快一个数量级也避免手写repmat时把采样顺序绕错。reshape(abs(rx), sps, num_bits)把接收采样流重新整理成“每列一个符号”的矩阵mean(..., 1)在列方向求平均等价于一个简单的符号积分器对 AWGN 有平滑作用。阈值采用实测高电平和低电平中值在噪声不太大时接近最佳判决门限。参数说明num_bits1e6时一次运行约几秒钟如果机器内存紧张可降到 2e5但 BER 曲线在高信噪比段会抖动明显。3.2 运行循环并画出与理论曲线对照的误码率图把函数放进循环就能在同一个图里叠加理论曲线从而马上看出仿真链路是否正常% run_ber_compare.m EbNo_dB 0:2:12; ber_sim zeros(size(EbNo_dB)); for k 1:length(EbNo_dB) ber_sim(k) ask_awgn_chain(EbNo_dB(k)); end ber_theory berawgn(EbNo_dB, ook, noncoherent); figure; semilogy(EbNo_dB, ber_sim, o, LineWidth, 1.5); hold on; grid on; semilogy(EbNo_dB, ber_theory, -, LineWidth, 1.2); legend(仿真包络检波, 理论非相干OOK); xlabel(Eb/N0 (dB)); ylabel(BER);逻辑说明berawgn(EbNo_dB, ook, noncoherent)会直接给出 OOK 非相干解调的理论误码率不需要自己编公式。仿真值与理论值在高信噪比段应当误差在一个数量级以内。若仿真曲线明显更差优先检查 threshold 是否因为噪声被抬高若仿真曲线比理论还好则考虑有没有把随机比特信息“泄漏”给接收端。用于汇报的结果大致如下方表格所示数值会因随机种子略有浮动Eb/N0 (dB)仿真 BER包络检波理论 BER非相干 OOK0约 0.310.3034约 0.100.1078约 0.0140.01412约 3.8e-43.8e-43.3 三个容易让 BER 对不上的坑初相位、成形滤波和阈值第一个坑是初相位。sin(2*pi*fc*t)的初始相位固定为 0每个符号周期结束时恰好又回到同一相位所以连续符号之间没有相位跳变。如果改成sin(2*pi*fc*t rand*2*pi)相干解调会立刻变差包络检波受影响较小。第二个坑是成形滤波。题目没提脉冲成形但如果加上了根升余弦滤波器发射信号的平均功率和符号间干扰都会变awgn的信噪比换算公式需要重新推导。第三个坑是阈值。max(env)在低信噪比时可能被噪声尖峰拉到接近min(env)导致阈值偏大。若追求更高精度可以先发一段训练序列在接收端估计两个电平的均值后再判决。4. Simulink 仿真与波形验证让 ASK 链路面向报告输出MATLAB 脚本适合跑 BER但最后提交课程设计报告时Simulink 框图更直观。Simulink 做 ASK 仿真的选型并不复杂关键在于离散采样时间的搭配很多“仿真发散”和 Scope 里波形异常都源于采样时间不匹配。4.1 Simulink 模块选型与采样时间设置常见做法是将单音频载波设为 Sine Wave 模块随机比特用 Bernoulli Binary Generator 模块再经过 Zero-Order Hold 把符号速率数据保持到载波采样率最后用 Product 模块相乘。AWGN 可以使用 Communications Toolbox 里的 AWGN Channel 模块也可以退化为 Random Number 模块叠加在加法器上。模块推荐参数Bernoulli Binary GeneratorProbability0.5Sample time1/RsZero-Order HoldSample time1/fsSine WaveAmplitude1FrequencyfcSample time1/fsRandom NumberMean0Variance 按 SNR 换算Scope采样点数设为 sps 的整数倍连线顺序是Bernoulli 信号经 Zero-Order Hold 后与 Sine Wave 相乘得到 OOK 信号再与 Random Number 相加送入解调侧的绝对值和均值模块。Simulink 里没有直接叫“包络检波”的模块用 Abs 和 Discrete-Time Integrator 组合即可。注意Random Number 的 Sample time 务必与载波采样率一致否则噪声带宽被隐式改变BER 会偏。4.2 用 eyediagram 导出眼图并叠加理论 BERSimulink 跑完后应当把接收波形导出到工作空间而不是只在 Scope 里肉眼看。可以在模型设置中勾选“Signal logging”或者给接收信号接一个 To Workspace 模块。% 从工作空间读回 Simulink 记录的解调前信号 rx logsout{2}.Values.Data(:); % 绘制眼图横轴按一个符号周期展开 eyediagram(rx, 2*sps, Rs); title(OOK 接收端眼图Eb/N0 8 dB);逻辑说明eyediagram的第一个参数是接收信号向量第二个参数是每个眼图横向覆盖的采样点数取2*sps能看到两个相邻符号的叠加第三个参数是符号速率让横轴时间与符号周期对齐。在 Eb/N0 较高时眼图中央会出现明显的矩形张开区噪声增大后张开区会收窄门限附近采样点会越来越密。这个图比 BER 数字更适合放进答辩 PPT。4.3 仿真发散、波形变红和 NaN 的排查顺序Simulink 里最容易撞见三类问题波形全是红色Scope 输出 NaN或者仿真中途发散。红色波形通常表示信号源或求解器不能处理当前采样时间。第一步先检查 Zero-Order Hold 的 Sample time 是否等于 1/fs第二步检查 Bernoulli Binary Generator 的 Sample time 是否等于 1/Rs第三步把 Random Number 先断开看发射链路本身有没有 NaN。如果模型用的是连续 Sine Wave 加离散随机信号Scope 里的波形会因求解器步长不同而出现毛刺。推荐把模型求解器改为固定步长离散求解器步长直接设为 1/fs。这样整个模型是一条严格同步的数据流和脚本仿真的时间关系完全一致。若此时仍出现 NaN多为 AWGN Channel 模块里的输入功率参数填了 0 或负数改成Signal to noise ratio (Eb/N0)并如实填写 Rs 即可。5. 把 ASK 仿真做到接近理论下限的三个涨分技巧前几章已经能跑通完整链路但课程设计要拿高分通常需要在结尾体现出“我知道自己的仿真好在哪里、差在哪里”。这三件事比单纯堆参数更有说服力。5.1 同时画出相干与非相干理论线直接标注仿真落在哪条线上berawgn(EbNo_dB, ook, coherent)和berawgn(EbNo_dB, ook, noncoherent)两条线之间大约差 1 到 3 dB。把仿真曲线画出来后用一条短的图例说明“本次仿真采用包络检波所以跟随非相干理论线”。如果采用相干解调就要留意本地载波相位问题直接乘sin(2*pi*fc*t)是理想相干而实际系统里存在相位偏移仿真会偏向非相干线。报告里能写清这一点说明确实理解了解调器的边界。5.2 增加一个符号定时偏移扫描很多作业只仿真理想符号同步但工程上采样点不会总是落在符号正中间。可以把接收采样向量整体循环移动若干点再重新做包络积分和判决找出 BER 随偏移量变化的曲线% timing_offset_test.m offset 3; rx_shifted circshift(rx, offset); r_mat reshape(abs(rx_shifted), sps, num_bits); env_shifted mean(r_mat, 1).; bits_rx env_shifted th; ber_shifted mean(bits_rx ~ bits);逻辑说明circshift会把整个采样序列向前移动 offset 个采样点等效于符号定时提前或滞后。当 offset 接近 0 或 sps 时每个比特积分窗正好对准发射符号BER 最小当 offset 接近 sps/2 时积分窗跨在两个符号边界上BER 急剧上升。把 offset 从 0 扫到 sps-1选择使 BER 最低的那个偏移量就完成了一个最基础的符号同步过程。这类实验数据放进报告比单纯说“采用包络检波”更有工程感。5.3 用实际 rayleigh 信道模块做扩展但先保持 AWGN 为对照组如果还有余力可以在 AWGN 链路后面串联一个多径衰落模块。这时不是直接对比衰落信道和 AWGN 的 BER因为二者信噪比口径不同正确做法是让两者使用同样的 Eb/N0并把 AWGN 这条曲线作为上界。这样既没有把题目的“加性高斯白噪声”丢掉又展示了系统设计能力。本文还有配套的精品资源点击获取
返回列表