第【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 个邻居样本并根据邻居的类别信息对测试样本进行分类。值得注意的是硬判决和K1时的KNN思想一致也就是说K1 KNN就是通信里硬判决的另一种名字。1.2 SVMSVM算法是一种经典的机器学习算法主要用于分类和回归问题。它的基本思想是通过寻找一个最优的超平面在不同类别的样本中建立一个有效的决策边界。在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_tictic;init_tictic;close all;clc;clearvars-exceptprogram_tic init_tic;% 程序配置参数 debug_modetrue;debug_plotfalse;function_timingtrue;iffunction_timing, timingsstruct();end % 调制、量化与检测参数 modulation_order4;oversampling_factor1;% 避免欠量化降低量化噪声 quantization_methodmidrise;detection_methodsvm;% 编码参数 generator_polynomial[1011];block_size4;%4apply_fectrue;% 系统的 SNR_dB max_SNR_dB20;%if(modulation_order4||modulation_order16||modulation_order64)% max_SNR_dB20;%else% max_SNR_dB10* log10(modulation_order);%256-QAM: ~24, 1K-QAM: ~30 % end % 定义 SNR 范围 SNR_dB_range_theoretical10:0.1:round(max_SNR_dB);SNR_dB_range_experimental10:1:round(max_SNR_dB);% 定义噪声方差 sigma_w21e-2;iffunction_timing timings.init_timetoc(init_tic);fprintf([0 - 初始化] 耗时%.6f 秒\n, timings.init_time);end % 将 BER 向量预置为零 ber_theoreticalzeros(size(SNR_dB_range_theoretical));ber_experimentalzeros(size(SNR_dB_range_experimental));%%1. 生成正弦波 sine_wave_creation_tictic;A1;f01;% 动态调制参数 periods_to_transmit400000;samples_per_periodmax(modulation_order, modulation_order * log2(modulation_order));% TODO: 或许可以去掉 max()% 奈奎斯特速率fs2* f0 fsf0 * samples_per_period;Ts1/ fs;Tmaxperiods_to_transmit / f0;% 量化参数 levelsoversampling_factor * modulation_order;bits_per_symbollog2(modulation_order);bits_per_samplelog2(levels);% 离散样本总数 total_samplesceil(fs * Tmax);% 根据现有样本可以传输的 QAM 符号数 symbols_to_transmitfloor((total_samples*bits_per_sample)/bits_per_symbol);num_of_bits_neededsymbols_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_timetoc(sine_wave_creation_tic);fprintf([1-正弦波生成] 耗时%.6f 秒\n,timings.sine_wave_creation_time);end%%2.应用理想低通抗混叠滤波器 filter_tictic;%2.1. 定义滤波器规格 fpassf0*1.5;%通带频率完全保留1Hz 正弦波[Hz] fstopf0*5;%阻带频率滤除高频噪声[Hz] Apass3;%最大通带衰减行业标准[dB] Astop40;%最小阻带衰减良好滤波效果[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_waveapply_filter(b,a,cont_sine_wave,true,[],A,cont_t);if function_timing timings.filter_timetoc(filter_tic);fprintf([2-滤波器设计与应用] 耗时%.6f 秒\n,timings.filter_time);end%%3.采样离散时间信号 sampling_tictic;sampled_tlinspace(0,Tmax,round(Tmax/Ts)1);%时间向量离散/采样时间 sampled_signalsample_signal(cont_t,cont_sine_wave,sampled_t,linear,debug_plot,[],A);if function_timing timings.sampling_timetoc(sampling_tic);fprintf([3-采样] 耗时%.6f 秒\n,timings.sampling_time);end%%4.量化 quantization_tictic;[~,~,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_timetoc(quantization_tic);fprintf([4-量化] 耗时%.6f 秒\n,timings.quantization_time);end%%5.信源编码将量化电平转换为二进制比特流 encoding_tictic;[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_timetoc(encoding_tic);fprintf([5-编码] 耗时%.6f 秒\n,timings.encoding_time);end%%6.信道调制M-QAM – 符号映射以供传输 SNR_loop_tictic;for i1:length(SNR_dB_range_experimental)modulation_tictic;SNR_dBSNR_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_timetoc(modulation_tic);fprintf([6-调制] 耗时%.6f 秒\n,timings.modulation_time);end%%7.添加复高斯噪声 noise_tictic;%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_signalapply_noise(transmitted_signal,cg_noise_normalized,true);if function_timing timings.noise_timetoc(noise_tic);fprintf([7-加噪声] 耗时%.6f 秒\n,timings.noise_time);end%%8.解调符号检测 detection_tictic;[detected_indices,symbol_map_2D,received_signal_2D]detect_symbols(symbol_map,received_signal,detection_method);if function_timing timings.detection_timetoc(detection_tic);fprintf([8-符号检测] 耗时%.6f 秒\n,timings.detection_time);end%%9.比特流恢复从检测到的索引恢复比特 recovery_tictic;[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_timetoc(recovery_tic);fprintf([9-比特恢复] 耗时%.6f 秒\n,timings.recovery_time);end%%10.误码率比较实测 vs 理论 ber_tictic;min_lengthmin(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_timetoc(ber_tic);fprintf([10 - BER 计算] 耗时%.6f 秒\n, timings.ber_time);end end % 实测 BER 计算循环结束 Eb_N0_dBzeros(length(SNR_dB_range_theoretical));% 理论 BER 计算fori1:length(SNR_dB_range_theoretical)SNR_dBSNR_dB_range_theoretical(i);Essigma_w2 *10^(SNR_dB /10);EbEs / bits_per_symbol;Eb_N0Eb / sigma_w2;Eb_N0_dB(i)10* log10(Eb_N0);% 对4-QAM 效果很好对高阶 QAM实测结果只在较高 SNR 时收敛 erfn_argsqrt((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_timetoc(SNR_loop_tic);fprintf([6...10 - SNR 循环] 耗时%.6f 秒\n, timings.SNR_loop_time);timings.program_timetoc(program_tic);fprintf(\n 总运行时间%.4f 秒 \n, timings.program_time);3 总结传统基于理想星座的几何判决在非线性信道中会遭遇性能天花板而机器学习方法如 SVM通过学习实际信道失真特性能够有效消除非线性误差实现高可靠检测。该结果为非线性环境下智能接收机设计提供了有力依据。源代码 出图所见即所得代码获取方式见VX公众号