当前位置: 首页 > 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.jsqmd.com/news/993686/

相关文章:

  • 昇腾CANN ops-cv仓库实战指南:5分钟在昇腾NPU上跑通CV算子与端到端推理pipeline
  • 洛雪音乐音源终极指南:免费解锁全网无损音乐的完整教程
  • 超元力玻璃剧场轻量化落地体系,构筑文旅业态长效运营新基石
  • 昆明社区回收店测评:家门口小店靠谱吗?实测结果意外 - 奢侈品回收评测
  • 曲靖装修公司怎么选靠谱?本地口碑前十强 - 装修新知
  • 工艺智能如何解决制造业多品种小批量生产痛点
  • 华硕笔记本性能调优神器:5步掌握G-Helper完整使用指南
  • 基于内存补丁技术的企业级消息防撤回完整解决方案深度解析
  • 2026 韶关黄金回收价位盘点 全城实体门店综合测评 - 靖昱黄金回收
  • Meiam.System日志系统深度剖析:NLog集成与全局异常拦截最佳实践
  • Bloxstrap终极教程:5个必知功能与快速上手指南
  • ThreeJS 体渲染进阶:用噪声与FBM构建动态体积云
  • 格力空调 24 小时官方售后维修中心 全国统一服务热线:4009-918812 - 资讯速览
  • 国内激光清障仪主流厂家实力排行及核心资质盘点 - 奔跑123
  • 开源5G革命:UERANSIM如何重塑无线网络测试范式
  • 2026年6月最新版湘西第三方CMACNAS甲醛检测治理机构口碑名单:万清CMA检测中心等5家公司深度测评万清CMA检测中心TOP1推荐 - 一修哥咨询
  • 3个关键步骤:如何用AI生成专业级数学定理解释视频
  • 从零到一:手把手教你打造STC89C52RC最小系统板
  • DVR机箱有哪些类型?
  • 昇腾CANN计算机视觉专用算子库ops-cv快速上手实战教程:从环境配置到image/objdetect类接口调用的全步骤可复现操作指南
  • 天若OCR本地版:Windows用户必备的离线文字识别利器
  • 2026年6月最新版张掖第三方CMACNAS甲醛检测治理机构口碑名单:万清CMA检测中心等5家公司深度测评万清CMA检测中心TOP1推荐 - 一修哥咨询
  • 2026年6月最新|GEO获客公司权威排名,TOP5 大起底,精密制造 / 汽配 / 新能源怎么选? - 商业新知
  • 国内空气呼吸器供应商排行及选型核心参考 - 起跑123
  • 如何用RP-Soundboard让Teamspeak 3语音聊天更有趣:新手完全指南
  • 面向企业知识库问答的 RAG 落地实践:大模型如何从“会聊天”变成“懂业务”
  • 2026年6月最新版西安第三方CMACNAS甲醛检测治理机构口碑名单:万清CMA检测中心等5家公司深度测评万清CMA检测中心TOP1推荐 - 一修哥咨询
  • 如何在10分钟内彻底掌握Etcher镜像烧录工具的核心用法
  • SD-PPP:Photoshop AI插件终极免费指南,让设计创作更智能高效
  • 魔兽争霸3现代硬件兼容性终极解决方案:5分钟告别画面拉伸与帧率限制