当前位置: 首页 > news >正文

第【15】期--基于支持向量机(svm) 的M-QAM信号判决实现-maltab完整代码

摘要

本技术报告针对数字通信系统中 M‑QAM 调制在非线性失真信道下的符号检测问题,对比了KNN判决与基于支持向量机(SVM)的分类检测性能,实验结果表明:在高 SNR(≥ 26 dB)区域,KNN 的误码率因系统性星座扭曲而稳定在约 0.25,无法随 SNR 提高而下降;相比之下,SVM 的 BER 可降至 10⁻⁵ 以下,展现出对非线性失真的强大适应能力。

1 研究背景

在数字通信系统中,发送端将二进制比特流映射为一个个符号(比如QAM星座点),经过信道传输后,接收端收到的信号已经不再是理想的星座点——它被噪声污染、被信道扭曲。接收机的核心任务之一,就是根据这些“带噪”的观测值,猜出发射端原本发送的是哪个符号。这个过程叫做判决,也叫检测。如果我们把每个QAM符号看作二维平面(实部为横轴,虚部为纵轴)上的一个点,那么判决问题就变成了一个标准的分类问题:已知一组理想的类别中心(星座点),给定一个被噪声扰动后的观测点,判断它应该属于哪一个类别。

传统判决的思路非常直接:哪个星座点离接收点最近,就判给谁。这就是“最小欧氏距离判决”。之所以这样选,背后有坚实的数学支撑:在加性高斯白噪声信道下,这种判决能使错误概率最小化,因此、也被称为“最大似然判决”。换句话说,如果接收点离A很近,却离B很远,那么它原本是A的可能性要比是B的可能性大得多。因此,选最近的那个,从概率上讲是最合理的。

1.1 传统硬判决

传统硬判决的原理:

硬判决数学本质是最大似然估计在高斯噪声下的简化形式。虽然硬判决会丢弃信道提供的软信息,导致纠错编码的性能损失,但由于其实现简单、功耗低,在信噪比较高或对成本敏感的系统中仍然广泛使用。

此外,KNN算法是一种基于实例的机器学习算法,它的核心思想是利用已有的训练数据集,根据样本之间的距离度量找到最近的 K 个邻居样本,并根据邻居的类别信息对测试样本进行分类。

值得注意的是,硬判决和K=1时的KNN思想一致,也就是说,K=1 KNN就是通信里硬判决的另一种名字。

1.2 SVM

SVM算法是一种经典的机器学习算法,主要用于分类和回归问题。它的基本思想是通过寻找一个最优的超平面,在不同类别的样本中建立一个有效的决策边界。
在SVM算法中,将各个样本点在空间中的位置表示为特征向量,根据这些特征向量的线性组合,在不同的维度上建立了多条超平面。其中能够最好地区分各个类别并且离各个类别之间的空隙最大的超平面,被称为“最大间隔超平面”。

1.3 总结

  • KNN判决 = 最小欧氏距离 = AWGN下的最优硬判决。简单、快速、无需训练。
  • SVM判决 = 通过训练超平面进行分类。更通用,可处理非线性、非高斯场景,但计算开销大。

2 仿真流程

2.1 awgn下 SVM和KNN的性能


  • 可以看到二者性能差不多,验证了所用svm的有效性。

2.2 非线性失真下SVM和KNN的ber对比

对发送信号进行非线性失真变换后

模拟功率放大器,当输入信号幅度接近或超过功放 的线性工作区,放大器会进入饱和区,导致输出信号幅度被压缩。

接收的黑点聚集在红色方块周围,说明实际接收分布与理想星座点严重偏离。

  • KNN 以蓝色圆圈为参考,会将外圈的黑点错误地判给蓝色圆圈对应的符号(例如将接收的外圈点判给内圈理想点),导致系统性的符号错误。
  • SVM 以红色方块为参考,可以正确分类黑点,因此在高 SNR 下几乎无误码。
  • KNN下,外圈点经过失真后落到了内圈理想点附近,导致欧氏距离判决错误。而 SVM 因为训练时使用了失真后的簇中心,可以构建弯曲的决策边界,从而正确分类。


通过在基带模拟该非线性传统 KNN(基于理想星座)出现错误平层(BER≈0.25),而 SVM 通过学习失真后的星座中心,可大幅降低误码率。

部分代码:

%%0. 初始化 program_tic=tic;init_tic=tic;close all;clc;clearvars-exceptprogram_tic init_tic;% 程序配置参数 debug_mode=true;debug_plot=false;function_timing=true;iffunction_timing, timings=struct();end % 调制、量化与检测参数 modulation_order=4;oversampling_factor=1;% 避免欠量化,降低量化噪声 quantization_method="midrise";detection_method="svm";% 编码参数 generator_polynomial=[1011];block_size=4;%4apply_fec=true;% 系统的 SNR_dB max_SNR_dB=20;%if(modulation_order==4||modulation_order==16||modulation_order==64)% max_SNR_dB=20;%else% max_SNR_dB=10* log10(modulation_order);%256-QAM: ~24, 1K-QAM: ~30 % end % 定义 SNR 范围 SNR_dB_range_theoretical=10:0.1:round(max_SNR_dB);SNR_dB_range_experimental=10:1:round(max_SNR_dB);% 定义噪声方差 sigma_w2=1e-2;iffunction_timing timings.init_time=toc(init_tic);fprintf("[0 - 初始化] 耗时:%.6f 秒\n", timings.init_time);end % 将 BER 向量预置为零 ber_theoretical=zeros(size(SNR_dB_range_theoretical));ber_experimental=zeros(size(SNR_dB_range_experimental));%%1. 生成正弦波 sine_wave_creation_tic=tic;A=1;f0=1;% 动态调制参数 periods_to_transmit=400000;samples_per_period=max(modulation_order, modulation_order * log2(modulation_order));% TODO: 或许可以去掉 max()% 奈奎斯特速率:fs>=2* f0 fs=f0 * samples_per_period;Ts=1/ fs;Tmax=periods_to_transmit / f0;% 量化参数 levels=oversampling_factor * modulation_order;bits_per_symbol=log2(modulation_order);bits_per_sample=log2(levels);% 离散样本总数 total_samples=ceil(fs * Tmax);% 根据现有样本可以传输的 QAM 符号数 symbols_to_transmit=floor((total_samples*bits_per_sample)/bits_per_symbol);num_of_bits_needed=symbols_to_transmit*bits_per_symbol;[cont_t,cont_sine_wave]=create_sine_wave(A,f0,Tmax,debug_plot);if function_timing timings.sine_wave_creation_time=toc(sine_wave_creation_tic);fprintf("[1-正弦波生成] 耗时:%.6f 秒\n",timings.sine_wave_creation_time);end%%2.应用理想低通(抗混叠)滤波器 filter_tic=tic;%2.1. 定义滤波器规格 fpass=f0*1.5;%通带频率(完全保留1Hz 正弦波)[Hz] fstop=f0*5;%阻带频率(滤除高频噪声)[Hz] Apass=3;%最大通带衰减(行业标准)[dB] Astop=40;%最小阻带衰减(良好滤波效果)[dB]%2.2. 设计滤波器%[b,a,fnyquist,normalized_fpass,normalized_fstop,lowest_order,cutoff_freqs]=create_butterworth_filter(fpass,fstop,Apass,Astop,fs,debug_mode);%2.3. 对初始连续正弦波进行零相位滤波%filtered_sine_wave=apply_filter(b,a,cont_sine_wave,true,[],A,cont_t);if function_timing timings.filter_time=toc(filter_tic);fprintf("[2-滤波器设计与应用] 耗时:%.6f 秒\n",timings.filter_time);end%%3.采样(离散时间信号) sampling_tic=tic;sampled_t=linspace(0,Tmax,round(Tmax/Ts)+1);%时间向量(离散/采样时间) sampled_signal=sample_signal(cont_t,cont_sine_wave,sampled_t,"linear",debug_plot,[],A);if function_timing timings.sampling_time=toc(sampling_tic);fprintf("[3-采样] 耗时:%.6f 秒\n",timings.sampling_time);end%%4.量化 quantization_tic=tic;[~,~,indices,quantized_signal]=quantize_signal(A,levels,sampled_t,sampled_signal,quantization_method,debug_plot,[],cont_t,cont_sine_wave);if function_timing timings.quantization_time=toc(quantization_tic);fprintf("[4-量化] 耗时:%.6f 秒\n",timings.quantization_time);end%%5.信源编码(将量化电平转换为二进制比特流) encoding_tic=tic;[encoded_bit_stream,bit_padding,padding_length,~]=encode_signal(levels,indices,bits_per_symbol,generator_polynomial,block_size,apply_fec,debug_mode);if function_timing timings.encoding_time=toc(encoding_tic);fprintf("[5-编码] 耗时:%.6f 秒\n",timings.encoding_time);end%%6.信道调制(M-QAM – 符号映射以供传输) SNR_loop_tic=tic;for i=1:length(SNR_dB_range_experimental)modulation_tic=tic;SNR_dB=SNR_dB_range_experimental(i)%6.1. 生成 QAM 星座 [levels_per_axis,IQ_levels,I,Q,symbols,Es,Eb,symbol_map,gray_labels]=generate_QAM_constellation(modulation_order,SNR_dB,sigma_w2);%6.2. 调制信号 [bit_pairs,symbol_indices,~,transmitted_signal]=modulate_signal(encoded_bit_stream,symbol_map,gray_labels,modulation_order,true,[]);if function_timing timings.modulation_time=toc(modulation_tic);fprintf("[6-调制] 耗时:%.6f 秒\n",timings.modulation_time);end%%7.添加复高斯噪声 noise_tic=tic;%7.1. 生成复高斯噪声 [~,~,~,cg_noise,~]=generate_cg_noise(sigma_w2,transmitted_signal,debug_mode);%7.2. 由于可能存在方差偏差,进行方差归一化 [~,~,~,~,~,~,cg_noise_normalized,~]=normalize_cg_variance(cg_noise,sigma_w2,debug_mode);%7.3. 对发射信号施加噪声 received_signal=apply_noise(transmitted_signal,cg_noise_normalized,true);if function_timing timings.noise_time=toc(noise_tic);fprintf("[7-加噪声] 耗时:%.6f 秒\n",timings.noise_time);end%%8.解调(符号检测) detection_tic=tic;[detected_indices,symbol_map_2D,received_signal_2D]=detect_symbols(symbol_map,received_signal,detection_method);if function_timing timings.detection_time=toc(detection_tic);fprintf("[8-符号检测] 耗时:%.6f 秒\n",timings.detection_time);end%%9.比特流恢复(从检测到的索引恢复比特) recovery_tic=tic;[recovered_bit_stream,recovered_padded_bit_stream,detected_bits]=decode_symbol_indices(detected_indices,gray_labels,bit_padding,padding_length,generator_polynomial,block_size,apply_fec,true);if function_timing timings.recovery_time=toc(recovery_tic);fprintf("[9-比特恢复] 耗时:%.6f 秒\n",timings.recovery_time);end%%10.误码率比较(实测 vs 理论) ber_tic=tic;min_length=min(length(encoded_bit_stream),length(recovered_bit_stream));ber_experimental(i)=sum(encoded_bit_stream(1:min_length)~=recovered_bit_stream(1:min_length))/ min_length;iffunction_timing timings.ber_time=toc(ber_tic);fprintf("[10 - BER 计算] 耗时:%.6f 秒\n", timings.ber_time);end end % 实测 BER 计算循环结束 Eb_N0_dB=zeros(length(SNR_dB_range_theoretical));% 理论 BER 计算fori=1:length(SNR_dB_range_theoretical)SNR_dB=SNR_dB_range_theoretical(i);Es=sigma_w2 *10^(SNR_dB /10);Eb=Es / bits_per_symbol;Eb_N0=Eb / sigma_w2;Eb_N0_dB(i)=10* log10(Eb_N0);% 对4-QAM 效果很好;对高阶 QAM,实测结果只在较高 SNR 时收敛 erfn_arg=sqrt((3*bits_per_symbol/(2*(modulation_order-1)))*(Eb_N0));Pe=(4/ bits_per_symbol)*(1-1/sqrt(modulation_order))* qfunc(erfn_arg);ber_theoretical(i)=Pe;end figure(18);semilogy(SNR_dB_range_theoretical, ber_theoretical,"b","LineWidth",1.5);hold on;semilogy(SNR_dB_range_experimental, ber_experimental,"r*","LineWidth",1.5);grid on;title(sprintf("%d-QAM 误码率对比 (σ_w^2 = %.0e)", modulation_order, sigma_w2));subtitle(sprintf("所需比特数: %d (%d 个周期)", num_of_bits_needed, periods_to_transmit));xlabel("E_b/N_0 [dB]");ylabel("BER");legend("理论 BER","实测 BER");timings.SNR_loop_time=toc(SNR_loop_tic);fprintf("[6...10 - SNR 循环] 耗时:%.6f 秒\n", timings.SNR_loop_time);timings.program_time=toc(program_tic);fprintf("\n===== 总运行时间:%.4f 秒 =====\n", timings.program_time);

3 总结

传统基于理想星座的几何判决在非线性信道中会遭遇性能天花板,而机器学习方法(如 SVM)通过学习实际信道失真特性,能够有效消除非线性误差,实现高可靠检测。该结果为非线性环境下智能接收机设计提供了有力依据。

  • 源代码 出图所见即所得,代码获取方式见VX公众号
http://www.rkmt.cn/news/1505448.html

相关文章:

  • 江苏纳米板隔热片供应商优选:奥创特新核心考量与实力解析 - 起跑123
  • 国内主流五恒系统厂家实测排行:技术与落地实力对比 - 起跑123
  • Magika AI文件类型检测系统架构解析与高性能实践指南
  • 慧荣SM2259XT2主控开卡全攻略:从固件下载到B0KB颗粒实战测试
  • 基于内存补丁技术的企业级消息防撤回完整解决方案深度解析
  • Bloxstrap终极教程:5个必知功能与快速上手指南
  • 开源5G革命:UERANSIM如何重塑无线网络测试范式
  • 昇腾CANN计算机视觉专用算子库ops-cv快速上手实战教程:从环境配置到image/objdetect类接口调用的全步骤可复现操作指南
  • 2026年6月最新版湘西第三方CMACNAS甲醛检测治理机构口碑名单:万清CMA检测中心等5家公司深度测评万清CMA检测中心TOP1推荐 - 一修哥咨询
  • 3个关键步骤:如何用AI生成专业级数学定理解释视频
  • 天若OCR本地版:Windows用户必备的离线文字识别利器
  • 2026年6月最新|GEO获客公司权威排名,TOP5 大起底,精密制造 / 汽配 / 新能源怎么选? - 商业新知
  • 国内空气呼吸器供应商排行及选型核心参考 - 起跑123
  • 魔兽争霸3现代硬件兼容性终极解决方案:5分钟告别画面拉伸与帧率限制
  • 2026 成都彩钻粉钻蓝钻回收,走访8家珠宝老店,稀有彩钻回收榜单 - 开心测评
  • 苏州闲置首饰变现推荐,透明估价不压价,全城覆盖极速到账 - 名奢变现站
  • 5步精通SkyWater PDK:开源芯片设计完整指南
  • 如何快速获取百度网盘真实下载地址:完整解析工具使用指南
  • 查找容器IP
  • Better Auth环境变量实战:从配置混乱到安全优雅的进化之路
  • N_m3u8DL-RE流媒体下载神器:3分钟掌握专业级视频下载技巧
  • 戴尔笔记本风扇控制技术深度探索:如何突破BIOS限制实现精准散热管理
  • 终极指南:如何在Windows、macOS和Linux上完全控制索尼耳机
  • 2026 张家口厨卫屋面地下室漏水测评 吉修匠 99.8 分五星榜首 - 吉修匠
  • 2026重庆钻石回收TOP5实测榜单:收的顶断层领跑无对手 - 奢侈品回收测评
  • UE5 场景光影 实战调优指南
  • 深度学习面试高频考点精讲
  • 2026年上海老房翻新装修公司深度横评:从增项陷阱到零增项保障的完整选型指南 - 企业名录优选推荐
  • 2026 东莞包包回收测评|五大正规品牌,专业处理闲置包 - 奢侈品回收测评
  • 7-Zip文件压缩软件:开源压缩技术的架构演进与性能优化