MATLAB实现ASK无线通信系统仿真:从参数设置到误码率分析
2026/9/11 23:36:29 网站建设 项目流程

简介:利用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 里不可能处理连续时间信号,单音频信源必须先采样。常见的课程设计配置是:载波频率 fc=4000 Hz,符号速率 Rs=2000 Baud,采样率 fs=40000 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/fc=10,意味着载波每个周期被采 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 与 SNR

AWGN 信道在 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_bits=1e6时一次运行约几秒钟;如果机器内存紧张,可降到 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(非相干 OOK)
0约 0.310.303
4约 0.100.107
8约 0.0140.014
12约 3.8e-43.8e-4

3.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 GeneratorProbability=0.5,Sample time=1/Rs
Zero-Order HoldSample time=1/fs
Sine WaveAmplitude=1,Frequency=fc,Sample time=1/fs
Random NumberMean=0,Variance 按 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 导出眼图,并叠加理论 BER

Simulink 跑完后应当把接收波形导出到工作空间,而不是只在 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 这条曲线作为上界。这样既没有把题目的“加性高斯白噪声”丢掉,又展示了系统设计能力。

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询