通信信号调制识别所用数据集生成代码 Matlab自动生成数据集,打标签,绘制不同训练策略和不同训练样本数量的对比曲线图,可以绘制模型在测试集上的虚警率,精确率和平均误差。 可以绘制不同信噪比下测试集各个参数的直方图。 注释非常全 可自动生成任意图片数量的yolo数据集(包含标签坐标信息) 每张图的信号个数 每张图的信号种类 信号的频率 信号的时间长度 信号的信噪比 是否经过瑞利衰落信道 以上的参数都可以根据自己的需求在代码中自行更改。 现代码中已有AM FM 2PSK 2FSK DSB,5种信号。 每张图的信号个数,种类,信噪比,时间长度均是设定范围内随机 可以画出不同训练策略,不同训练样本数量的对比曲线图 可以计算验证集的精确率,虚警率,评论参数误差并且画出曲线图 可以画出各个参数在不同信噪比之下的直方图
function [signal, params] = generate_signal() % 信号基础参数 mod_types = {'AM', 'FM', '2PSK', '2FSK', 'DSB'}; snr_range = [-5:5:20]; % 单位dB duration = 0.1 + rand()*0.3; % 0.1~0.4秒 % 随机选择调制类型 selected_mod = mod_types{randi(length(mod_types))}; % 生成基带信号 t = 0:1/1e4:duration; carrier_freq = 1e3 + 500*randn(); % 随机载波频率 switch selected_mod case 'AM' mod_index = 0.3 + 0.4*rand(); signal = (1 + mod_index*sin(2*pi*10*t)).*cos(2*pi*carrier_freq*t); case '2FSK' freq_dev = 50 + 100*rand(); signal = cos(2*pi*carrier_freq*t + 2*pi*freq_dev*cumsum(randn(size(t)))); % 其他调制类型生成逻辑... end % 添加信道效应 if rand() > 0.5 % 50%概率添加瑞利衰落 signal = add_rayleigh_fading(signal); end % 添加高斯噪声 signal = awgn(signal, snr_range(randi(length(snr_range)))); end这段代码是信号生成器的心脏——随机选择调制方式、生成时域信号、添加信道效应。重点注意载波频率的随机化处理,避免模型过拟合到固定频点。瑞利衰落信道的概率设置可以自由调整,建议训练集和测试集采用不同的概率分布来验证模型鲁棒性。
把信号装进YOLO的框里
生成目标检测数据集的关键在于时频图定位:
function generate_yolo_labels(signal, img_index) [s, f, t] = spectrogram(signal, 256, 224, 256, 1e4); spectrogram_image = mat2gray(20*log10(abs(s))); % 检测时频域中的信号区域 mask = imbinarize(spectrogram_image, 'adaptive'); [~, regions] = bwlabel(mask); % YOLO标签生成 fid = fopen(sprintf('labels/%04d.txt', img_index), 'w'); for i = 1:regions.NumObjects centroid = regionprops(regions, 'Centroid').Centroid; x_center = centroid(1)/size(spectrogram_image,2); y_center = (size(spectrogram_image,1)-centroid(2))/size(spectrogram_image,1); fprintf(fid, '%d %.4f %.4f %.4f %.4f\n',... class_id, x_center, y_center,... region_width, region_height); end fclose(fid); end这里的黑魔法在时频图二值化处理——通过自适应阈值分割提取信号区域。注意YOLO坐标需要归一化到[0,1]区间,且y坐标要翻转(图像坐标系与矩阵坐标系相反)
训练监控可视化
性能曲线绘制才是调参党的快乐源泉:
function plot_training_curves(logs) % 双Y轴绘制精度和虚警率 yyaxis left plot(logs.val_accuracy, 'LineWidth',2) ylabel('Accuracy') yyaxis right plot(logs.false_alarm_rate, '--', 'LineWidth',2) ylabel('False Alarm') % 误差棒显示标准差 errorbar(1:length(logs), logs.param_error, logs.error_std,... 'Color',[0.5 0.5 0.5], 'LineStyle','none'); legend('Accuracy', 'False Alarm', 'Error Std') set(gca, 'FontSize',12) end这个绘图模板可以同时监控三个关键指标:分类准确率、虚警率和参数估计误差。误差棒能直观显示模型在不同信噪比下的稳定性,当误差棒突然变长时,说明该SNR区间需要更多训练数据。
参数直方图的正确打开方式
function snr_histogram(data, param) snr_levels = -10:5:20; color_map = jet(length(snr_levels)); figure('Position', [200 200 800 400]) for i = 1:length(snr_levels) hist_data = data(data.snr == snr_levels(i), param); histogram(hist_data, 'FaceColor',color_map(i,:),... 'Normalization','probability') hold on end colorbar('Ticks',linspace(0,1,length(snr_levels)),... 'TickLabels',snr_levels) xlabel(param) title(['Parameter Distribution vs SNR: ' param]) end用jet色系映射不同SNR对应的分布,colorbar直接显示SNR值对应颜色。当某个SNR的直方图出现双峰分布时,说明模型在该信噪比下参数估计存在歧义,可能需要调整特征提取策略。