通信信号调制识别系统(MATLAB实现)

一、系统架构与核心算法

1.1 系统流程图

复制代码
信号生成 → 预处理 → 特征提取 → 分类识别 → 性能评估
    ↓          ↓          ↓          ↓          ↓
多调制类型  滤波去噪  时/频/统计特征  SVM/CNN  混淆矩阵/准确率

1.2 支持的调制类型

调制类型 参数 特征
BPSK 载波频率、符号速率 相位跳变、二阶循环平稳
QPSK 载波频率、符号速率 四相位、星座图
8PSK 载波频率、符号速率 八相位、圆形星座
16QAM 载波频率、符号速率 矩形星座、幅度相位联合
64QAM 载波频率、符号速率 密集星座、高阶调制
FSK 载波频率、频偏 频率跳变、瞬时频率
MSK 载波频率、符号速率 恒定包络、相位连续

二、完整MATLAB实现代码

2.1 主程序:调制识别系统

matlab 复制代码
%% 通信信号调制识别系统
clear; clc; close all;

%% 1. 参数设置
fprintf('=== 通信信号调制识别系统 ===\n');

% 基本参数
fs = 20000;              % 采样率 (Hz)
fc = 2000;               % 载波频率 (Hz)
Rs = 1000;               % 符号速率 (symbols/s)
Ns = 1000;               % 符号数
SNR_dB_range = [-10:2:20]; % 信噪比范围 (dB)

% 调制类型
modulation_types = {'BPSK', 'QPSK', '8PSK', '16QAM', '64QAM', 'FSK', 'MSK'};
num_modulations = length(modulation_types);

% 训练测试划分
train_ratio = 0.8;
num_samples_per_mod = 100;  % 每种调制100个样本

fprintf('系统参数:\n');
fprintf('  采样率: %d Hz\n', fs);
fprintf('  载波频率: %d Hz\n', fc);
fprintf('  符号速率: %d symbols/s\n', Rs);
fprintf('  调制类型: %d种\n', num_modulations);
fprintf('  训练样本: %d个/调制\n', round(num_samples_per_mod*train_ratio));
fprintf('  测试样本: %d个/调制\n', round(num_samples_per_mod*(1-train_ratio)));

%% 2. 生成数据集
fprintf('生成数据集...\n');
[features, labels] = generate_modulation_dataset(...
    modulation_types, num_samples_per_mod, fs, fc, Rs, Ns, SNR_dB_range);

%% 3. 数据集划分
fprintf('划分训练测试集...\n');
[train_features, test_features, train_labels, test_labels] = split_dataset(...
    features, labels, train_ratio);

%% 4. 训练分类器
fprintf('训练分类器...\n');
classifier = train_modulation_classifier(train_features, train_labels);

%% 5. 测试分类器
fprintf('测试分类器...\n');
predictions = classify_modulation(test_features, classifier);

%% 6. 性能评估
fprintf('性能评估...\n');
evaluate_performance(predictions, test_labels, modulation_types);

%% 7. 特征重要性分析
fprintf('特征重要性分析...\n');
analyze_feature_importance(train_features, train_labels, classifier);

%% 8. 实时识别演示
fprintf('实时识别演示...\n');
real_time_demo(classifier, modulation_types, fs, fc, Rs, Ns);

2.2 信号生成与特征提取

matlab 复制代码
function [features, labels] = generate_modulation_dataset(...
    modulation_types, num_samples, fs, fc, Rs, Ns, SNR_dB_range)
    % 生成调制信号数据集
    
    num_modulations = length(modulation_types);
    total_samples = num_modulations * num_samples;
    
    % 特征维度:时域特征(10) + 频域特征(10) + 统计特征(10) + 高阶累积量(6)
    feature_dim = 36;
    features = zeros(total_samples, feature_dim);
    labels = zeros(total_samples, 1);
    
    sample_idx = 0;
    
    for mod_idx = 1:num_modulations
        mod_type = modulation_types{mod_idx};
        fprintf('  生成 %s 信号...\n', mod_type);
        
        for sample = 1:num_samples
            sample_idx = sample_idx + 1;
            
            % 随机SNR
            SNR_dB = SNR_dB_range(randi(length(SNR_dB_range)));
            
            % 生成调制信号
            [signal, ~] = generate_modulation_signal(mod_type, fs, fc, Rs, Ns);
            
            % 添加噪声
            signal_noisy = awgn(signal, SNR_dB, 'measured');
            
            % 提取特征
            features(sample_idx, :) = extract_features(signal_noisy, fs, fc);
            
            % 标签
            labels(sample_idx) = mod_idx;
        end
    end
    
    fprintf('数据集生成完成: %d 个样本, %d 维特征\n', total_samples, feature_dim);
end

function [signal, t] = generate_modulation_signal(mod_type, fs, fc, Rs, Ns)
    % 生成特定调制类型的信号
    
    % 生成随机符号
    switch mod_type
        case 'BPSK'
            symbols = 2*randi([0,1], Ns, 1) - 1;  % BPSK: ±1
            signal = modulate_psk(symbols, fs, fc, Rs, 2);
            
        case 'QPSK'
            symbols = randi([0,3], Ns, 1);  % QPSK: 0,1,2,3
            signal = modulate_psk(symbols, fs, fc, Rs, 4);
            
        case '8PSK'
            symbols = randi([0,7], Ns, 1);  % 8PSK: 0-7
            signal = modulate_psk(symbols, fs, fc, Rs, 8);
            
        case '16QAM'
            symbols = randi([0,15], Ns, 1);  % 16QAM: 0-15
            signal = modulate_qam(symbols, fs, fc, Rs, 16);
            
        case '64QAM'
            symbols = randi([0,63], Ns, 1);  % 64QAM: 0-63
            signal = modulate_qam(symbols, fs, fc, Rs, 64);
            
        case 'FSK'
            symbols = randi([0,3], Ns, 1);  % 4-FSK
            signal = modulate_fsk(symbols, fs, fc, Rs, 4);
            
        case 'MSK'
            symbols = 2*randi([0,1], Ns, 1) - 1;  % MSK: ±1
            signal = modulate_msk(symbols, fs, fc, Rs);
    end
    
    % 时间轴
    t = (0:length(signal)-1)/fs;
end

function signal = modulate_psk(symbols, fs, fc, Rs, M)
    % PSK调制
    Nsamp = fs/Rs;  % 每符号采样点数
    signal = zeros(Nsamp*length(symbols), 1);
    
    for i = 1:length(symbols)
        phase = 2*pi*symbols(i)/M;
        t_sym = (i-1)*Nsamp:(i*Nsamp-1);
        signal(t_sym+1) = cos(2*pi*fc*t_sym/fs + phase);
    end
end

function signal = modulate_qam(symbols, fs, fc, Rs, M)
    % QAM调制
    Nsamp = fs/Rs;
    signal = zeros(Nsamp*length(symbols), 1);
    
    % 星座映射
    constellation = qammod(0:M-1, M, 'UnitAveragePower', true);
    
    for i = 1:length(symbols)
        symbol = constellation(symbols(i)+1);
        t_sym = (i-1)*Nsamp:(i*Nsamp-1);
        signal(t_sym+1) = real(symbol)*cos(2*pi*fc*t_sym/fs) - ...
                          imag(symbol)*sin(2*pi*fc*t_sym/fs);
    end
end

function signal = modulate_fsk(symbols, fs, fc, Rs, M)
    % FSK调制
    Nsamp = fs/Rs;
    signal = zeros(Nsamp*length(symbols), 1);
    
    freq_sep = Rs;  % 频率间隔
    freqs = fc + (0:M-1)*freq_sep;  % 不同符号对应不同频率
    
    for i = 1:length(symbols)
        freq = freqs(symbols(i)+1);
        t_sym = (i-1)*Nsamp:(i*Nsamp-1);
        signal(t_sym+1) = cos(2*pi*freq*t_sym/fs);
    end
end

function signal = modulate_msk(symbols, fs, fc, Rs)
    % MSK调制
    Nsamp = fs/Rs;
    signal = zeros(Nsamp*length(symbols), 1);
    
    phase = 0;
    for i = 1:length(symbols)
        t_sym = (i-1)*Nsamp:(i*Nsamp-1);
        freq = fc + symbols(i)*Rs/4;  % 频率偏移
        
        for j = 1:length(t_sym)
            phase = phase + 2*pi*freq/Fs;
            signal(t_sym(j)+1) = cos(phase);
        end
    end
end

2.3 特征提取模块

matlab 复制代码
function features = extract_features(signal, fs, fc)
    % 提取调制识别特征
    
    features = zeros(1, 36);
    feature_idx = 0;
    
    %% 1. 时域特征 (10维)
    % 瞬时幅度特征
    inst_amplitude = abs(signal);
    features(++feature_idx) = mean(inst_amplitude);
    features(++feature_idx) = std(inst_amplitude);
    features(++feature_idx) = skewness(inst_amplitude);
    features(++feature_idx) = kurtosis(inst_amplitude);
    features(++feature_idx) = max(inst_amplitude) - min(inst_amplitude);
    
    % 瞬时相位特征
    inst_phase = unwrap(angle(signal));
    features(++feature_idx) = std(inst_phase);
    features(++feature_idx) = mean(abs(diff(inst_phase)));
    
    % 瞬时频率特征
    inst_freq = diff(unwrap(angle(signal))) * fs/(2*pi);
    features(++feature_idx) = mean(inst_freq);
    features(++feature_idx) = std(inst_freq);
    features(++feature_idx) = max(inst_freq) - min(inst_freq);
    
    %% 2. 频域特征 (10维)
    % 功率谱
    NFFT = 2^nextpow2(length(signal));
    [Pxx, f] = periodogram(signal, [], NFFT, fs);
    
    features(++feature_idx) = max(Pxx);  % 峰值功率
    features(++feature_idx) = mean(Pxx);  % 平均功率
    features(++feature_idx) = std(Pxx);   % 功率标准差
    features(++feature_idx) = f(find(Pxx == max(Pxx), 1));  % 峰值频率
    
    % 频谱特征
    spectral_centroid = sum(f .* Pxx) / sum(Pxx);
    features(++feature_idx) = spectral_centroid;
    
    % 频谱带宽
    spectral_bandwidth = sqrt(sum(((f - spectral_centroid).^2) .* Pxx) / sum(Pxx));
    features(++feature_idx) = spectral_bandwidth;
    
    % 频谱滚降点
    cumulative_power = cumsum(Pxx)/sum(Pxx);
    roll_off_idx = find(cumulative_power >= 0.95, 1);
    features(++feature_idx) = f(roll_off_idx);
    
    % 频谱平坦度
    geometric_mean = exp(mean(log(Pxx + eps)));
    arithmetic_mean = mean(Pxx);
    spectral_flatness = geometric_mean / arithmetic_mean;
    features(++feature_idx) = spectral_flatness;
    
    % 频谱熵
    Pxx_norm = Pxx / sum(Pxx);
    spectral_entropy = -sum(Pxx_norm .* log2(Pxx_norm + eps));
    features(++feature_idx) = spectral_entropy;
    
    %% 3. 统计特征 (10维)
    % 信号统计
    features(++feature_idx) = mean(signal);
    features(++feature_idx) = std(signal);
    features(++feature_idx) = skewness(signal);
    features(++feature_idx) = kurtosis(signal);
    features(++feature_idx) = max(signal) - min(signal);
    
    % 过零率
    zero_crossings = sum(signal(1:end-1) .* signal(2:end) < 0);
    features(++feature_idx) = zero_crossings / length(signal);
    
    % 峰值因子
    crest_factor = max(abs(signal)) / rms(signal);
    features(++feature_idx) = crest_factor;
    
    % 波形因子
    form_factor = rms(signal) / mean(abs(signal));
    features(++feature_idx) = form_factor;
    
    % 脉冲因子
    impulse_factor = max(abs(signal)) / mean(abs(signal));
    features(++feature_idx) = impulse_factor;
    
    %% 4. 高阶累积量特征 (6维)
    % 二阶累积量
    features(++feature_idx) = mean(abs(signal).^2);  % C20
    
    % 四阶累积量
    features(++feature_idx) = mean(real(signal).^4) - 3*mean(real(signal).^2)^2;  % C40
    features(++feature_idx) = mean(imag(signal).^4) - 3*mean(imag(signal).^2)^2;  % C41
    features(++feature_idx) = mean(real(signal).^2 .* imag(signal).^2);  % C42
    
    % 六阶累积量
    features(++feature_idx) = mean(real(signal).^6) - 15*mean(real(signal).^4)*mean(real(signal).^2) + ...
                             30*mean(real(signal).^2)^3;  % C60
end

2.4 分类器训练与测试

matlab 复制代码
function [train_features, test_features, train_labels, test_labels] = split_dataset(...
    features, labels, train_ratio)
    % 划分训练测试集
    
    num_samples = size(features, 1);
    num_train = round(num_samples * train_ratio);
    
    % 随机打乱
    indices = randperm(num_samples);
    train_indices = indices(1:num_train);
    test_indices = indices(num_train+1:end);
    
    train_features = features(train_indices, :);
    test_features = features(test_indices, :);
    train_labels = labels(train_indices);
    test_labels = labels(test_indices);
end

function classifier = train_modulation_classifier(train_features, train_labels)
    % 训练调制识别分类器
    
    fprintf('  训练SVM分类器...\n');
    
    % 使用SVM分类器
    template = templateSVM(...
        'KernelFunction', 'rbf', ...
        'BoxConstraint', 1, ...
        'Standardize', true);
    
    classifier = fitcecoc(train_features, train_labels, ...
        'Learners', template, ...
        'Coding', 'onevsone');
    
    fprintf('  训练完成\n');
end

function predictions = classify_modulation(test_features, classifier)
    % 分类预测
    
    predictions = predict(classifier, test_features);
end

2.5 性能评估与可视化

matlab 复制代码
function evaluate_performance(predictions, test_labels, modulation_types)
    % 评估分类性能
    
    % 计算准确率
    accuracy = mean(predictions == test_labels) * 100;
    
    % 混淆矩阵
    num_classes = length(modulation_types);
    conf_mat = zeros(num_classes, num_classes);
    
    for i = 1:length(test_labels)
        true_class = test_labels(i);
        pred_class = predictions(i);
        conf_mat(true_class, pred_class) = conf_mat(true_class, pred_class) + 1;
    end
    
    % 计算每个类别的精确率和召回率
    precision = zeros(num_classes, 1);
    recall = zeros(num_classes, 1);
    f1_score = zeros(num_classes, 1);
    
    for i = 1:num_classes
        TP = conf_mat(i, i);
        FP = sum(conf_mat(:, i)) - TP;
        FN = sum(conf_mat(i, :)) - TP;
        
        precision(i) = TP / (TP + FP + eps) * 100;
        recall(i) = TP / (TP + FN + eps) * 100;
        f1_score(i) = 2 * precision(i) * recall(i) / (precision(i) + recall(i) + eps);
    end
    
    % 显示结果
    fprintf('\n========== 性能评估结果 ==========\n');
    fprintf('总体准确率: %.2f%%\n\n', accuracy);
    
    fprintf('各类别性能:\n');
    fprintf('%-8s %-10s %-10s %-10s\n', '调制类型', '精确率', '召回率', 'F1分数');
    fprintf('%-8s %-10s %-10s %-10s\n', '--------', '------', '------', '------');
    
    for i = 1:num_classes
        fprintf('%-8s %-9.1f%% %-9.1f%% %-9.1f%%\n', ...
                modulation_types{i}, precision(i), recall(i), f1_score(i));
    end
    
    % 绘制混淆矩阵
    figure('Position', [100, 100, 800, 600]);
    imagesc(conf_mat);
    colormap(jet);
    colorbar;
    xlabel('预测标签');
    ylabel('真实标签');
    title(sprintf('混淆矩阵 (准确率: %.2f%%)', accuracy));
    
    % 设置坐标轴标签
    set(gca, 'XTick', 1:num_classes, 'XTickLabel', modulation_types);
    set(gca, 'YTick', 1:num_classes, 'YTickLabel', modulation_types);
    xtickangle(45);
    
    % 添加数值标注
    for i = 1:num_classes
        for j = 1:num_classes
            text(j, i, num2str(conf_mat(i, j)), ...
                 'HorizontalAlignment', 'center', ...
                 'VerticalAlignment', 'middle', ...
                 'Color', 'white', 'FontWeight', 'bold');
        end
    end
    
    % 绘制性能柱状图
    figure('Position', [100, 100, 1200, 400]);
    
    subplot(1,3,1);
    bar(1:num_classes, precision);
    set(gca, 'XTick', 1:num_classes, 'XTickLabel', modulation_types);
    ylabel('精确率 (%)');
    title('各类别精确率');
    xtickangle(45);
    ylim([0, 100]);
    grid on;
    
    subplot(1,3,2);
    bar(1:num_classes, recall);
    set(gca, 'XTick', 1:num_classes, 'XTickLabel', modulation_types);
    ylabel('召回率 (%)');
    title('各类别召回率');
    xtickangle(45);
    ylim([0, 100]);
    grid on;
    
    subplot(1,3,3);
    bar(1:num_classes, f1_score);
    set(gca, 'XTick', 1:num_classes, 'XTickLabel', modulation_types);
    ylabel('F1分数 (%)');
    title('各类别F1分数');
    xtickangle(45);
    ylim([0, 100]);
    grid on;
end

function analyze_feature_importance(train_features, train_labels, classifier)
    % 特征重要性分析
    
    % 使用SVM权重作为特征重要性
    if isa(classifier, 'ClassificationECOC')
        % 对于ECOC分类器,分析每个二元SVM的权重
        weights = zeros(size(train_features, 2), 1);
        
        for i = 1:length(classifier.BinaryLearners)
            learner = classifier.BinaryLearners{i};
            if isa(learner, 'CompactClassificationSVM')
                weights = weights + abs(learner.Beta);
            end
        end
        
        % 归一化
        weights = weights / max(weights);
        
        % 特征名称
        feature_names = {...
            '幅度均值', '幅度标准差', '幅度偏度', '幅度峰度', '幅度范围', ...
            '相位标准差', '相位变化', '频率均值', '频率标准差', '频率范围', ...
            '峰值功率', '平均功率', '功率标准差', '峰值频率', '频谱质心', ...
            '频谱带宽', '滚降频率', '频谱平坦度', '频谱熵', '信号均值', ...
            '信号标准差', '信号偏度', '信号峰度', '过零率', '峰值因子', ...
            '波形因子', '脉冲因子', 'C20', 'C40', 'C41', 'C42', 'C60'};
        
        % 绘制特征重要性
        figure('Position', [100, 100, 1000, 600]);
        barh(1:length(weights), weights, 'horizontal');
        set(gca, 'YTick', 1:length(weights), 'YTickLabel', feature_names);
        xlabel('特征重要性');
        title('特征重要性分析');
        grid on;
        
        % 显示最重要的特征
        fprintf('\n最重要的10个特征:\n');
        [sorted_weights, idx] = sort(weights, 'descend');
        for i = 1:min(10, length(sorted_weights))
            fprintf('  %d. %s (重要性: %.3f)\n', i, feature_names{idx(i)}, sorted_weights(i));
        end
    end
end

2.6 实时识别演示

matlab 复制代码
function real_time_demo(classifier, modulation_types, fs, fc, Rs, Ns)
    % 实时调制识别演示
    
    fprintf('按任意键开始实时识别演示...\n');
    pause;
    
    % 随机选择一种调制类型
    mod_idx = randi(length(modulation_types));
    mod_type = modulation_types{mod_idx};
    
    % 生成测试信号
    [signal, t] = generate_modulation_signal(mod_type, fs, fc, Rs, Ns);
    
    % 添加噪声
    SNR_dB = 10;  % 10dB信噪比
    signal_noisy = awgn(signal, SNR_dB, 'measured');
    
    % 提取特征
    features = extract_features(signal_noisy, fs, fc);
    
    % 预测
    prediction = predict(classifier, features);
    predicted_mod = modulation_types{prediction};
    
    % 显示结果
    fprintf('\n=== 实时识别结果 ===\n');
    fprintf('真实调制类型: %s\n', mod_type);
    fprintf('预测调制类型: %s\n', predicted_mod);
    
    if strcmp(mod_type, predicted_mod)
        fprintf('✓ 识别正确!\n');
    else
        fprintf('✗ 识别错误!\n');
    end
    
    % 可视化信号
    figure('Position', [100, 100, 1200, 800]);
    
    % 时域信号
    subplot(3,2,1);
    plot(t(1:1000), real(signal_noisy(1:1000)));
    xlabel('时间 (s)');
    ylabel('幅度');
    title('接收信号(时域)');
    grid on;
    
    % 频谱
    subplot(3,2,2);
    NFFT = 2^nextpow2(length(signal_noisy));
    [Pxx, f] = periodogram(signal_noisy, [], NFFT, fs);
    plot(f, 10*log10(Pxx));
    xlabel('频率 (Hz)');
    ylabel('功率谱密度 (dB/Hz)');
    title('信号频谱');
    grid on;
    
    % 星座图(如果是QAM/PSK)
    subplot(3,2,3);
    if contains(mod_type, {'QPSK', '8PSK', '16QAM', '64QAM'})
        scatter(real(signal_noisy(1:1000)), imag(signal_noisy(1:1000)), '.');
        xlabel('同相分量');
        ylabel('正交分量');
        title('星座图');
        grid on;
        axis equal;
    end
    
    % 瞬时频率
    subplot(3,2,4);
    inst_freq = diff(unwrap(angle(signal_noisy))) * fs/(2*pi);
    plot(t(2:1000), inst_freq(1:999));
    xlabel('时间 (s)');
    ylabel('频率 (Hz)');
    title('瞬时频率');
    grid on;
    
    % 特征雷达图
    subplot(3,2,5);
    feature_names = {'幅度', '相位', '频率', '频谱', '统计', '高阶'};
    feature_values = [features(1), features(6), features(8), features(13), features(20), features(28)];
    radar_chart(feature_names, feature_values);
    title('特征雷达图');
    
    % 识别结果
    subplot(3,2,6);
    text(0.5, 0.7, '识别结果', 'FontSize', 16, 'HorizontalAlignment', 'center');
    text(0.5, 0.5, ['真实: ' mod_type], 'FontSize', 14, 'HorizontalAlignment', 'center');
    text(0.5, 0.3, ['预测: ' predicted_mod], 'FontSize', 14, 'HorizontalAlignment', 'center');
    
    if strcmp(mod_type, predicted_mod)
        text(0.5, 0.1, '✓ 识别正确', 'FontSize', 14, 'HorizontalAlignment', 'center', 'Color', 'green');
    else
        text(0.5, 0.1, '✗ 识别错误', 'FontSize', 14, 'HorizontalAlignment', 'center', 'Color', 'red');
    end
    
    axis off;
end

function radar_chart(labels, values)
    % 绘制雷达图
    theta = linspace(0, 2*pi, length(labels)+1);
    values = [values, values(1)];  % 闭合图形
    
    polarplot(theta, values, 'b-', 'LineWidth', 2);
    thetaticklabels(labels);
    rlim([0, max(values)]);
    grid on;
end

三、深度学习扩展(CNN调制识别)

3.1 CNN调制识别模型

matlab 复制代码
function cnn_modulation_classifier()
    % 基于CNN的调制识别
    
    fprintf('=== CNN调制识别 ===\n');
    
    % 参数
    fs = 20000;
    fc = 2000;
    Rs = 1000;
    Ns = 1024;  % 使用更多符号
    num_samples = 1000;
    modulation_types = {'BPSK', 'QPSK', '8PSK', '16QAM', '64QAM', 'FSK'};
    num_classes = length(modulation_types);
    
    % 生成IQ数据
    fprintf('生成IQ数据...\n');
    [X_train, y_train, X_test, y_test] = generate_iq_data(...
        modulation_types, num_samples, fs, fc, Rs, Ns);
    
    % 构建CNN模型
    fprintf('构建CNN模型...\n');
    layers = [
        imageInputLayer([2 Ns 1])  % 2个通道(I和Q),Ns个符号
        
        convolution2dLayer([2 8], 32, 'Padding', 'same')
        batchNormalizationLayer
        reluLayer
        maxPooling2dLayer([1 2], 'Stride', [1 2])
        
        convolution2dLayer([1 16], 64, 'Padding', 'same')
        batchNormalizationLayer
        reluLayer
        maxPooling2dLayer([1 2], 'Stride', [1 2])
        
        convolution2dLayer([1 32], 128, 'Padding', 'same')
        batchNormalizationLayer
        reluLayer
        
        fullyConnectedLayer(256)
        reluLayer
        dropoutLayer(0.5)
        
        fullyConnectedLayer(num_classes)
        softmaxLayer
        classificationLayer];
    
    % 训练选项
    options = trainingOptions('adam', ...
        'InitialLearnRate', 0.001, ...
        'MaxEpochs', 20, ...
        'MiniBatchSize', 64, ...
        'Shuffle', 'every-epoch', ...
        'ValidationData', {X_test, categorical(y_test)}, ...
        'Plots', 'training-progress', ...
        'Verbose', false);
    
    % 训练模型
    fprintf('训练CNN模型...\n');
    net = trainNetwork(X_train, categorical(y_train), layers, options);
    
    % 测试模型
    fprintf('测试CNN模型...\n');
    predictions = classify(net, X_test);
    accuracy = mean(predictions == categorical(y_test)) * 100;
    
    fprintf('CNN模型准确率: %.2f%%\n', accuracy);
end

function [X_train, y_train, X_test, y_test] = generate_iq_data(...)
    modulation_types, num_samples, fs, fc, Rs, Ns)
    % 生成IQ数据用于CNN训练
    
    num_classes = length(modulation_types);
    train_ratio = 0.8;
    num_train = round(num_samples * train_ratio);
    
    X = zeros(2, Ns, num_samples * num_classes, 'single');
    y = zeros(num_samples * num_classes, 1);
    
    sample_idx = 0;
    for mod_idx = 1:num_classes
        mod_type = modulation_types{mod_idx};
        
        for sample = 1:num_samples
            sample_idx = sample_idx + 1;
            
            % 生成信号
            [signal, ~] = generate_modulation_signal(mod_type, fs, fc, Rs, Ns);
            
            % 添加噪声
            signal_noisy = awgn(signal, 10, 'measured');
            
            % 提取IQ分量
            X(1, :, sample_idx) = real(signal_noisy);
            X(2, :, sample_idx) = imag(signal_noisy);
            
            % 标签
            y(sample_idx) = mod_idx;
        end
    end
    
    % 划分训练测试集
    indices = randperm(size(X, 3));
    train_indices = indices(1:num_train*num_classes);
    test_indices = indices(num_train*num_classes+1:end);
    
    X_train = X(:,:,train_indices);
    y_train = y(train_indices);
    X_test = X(:,:,test_indices);
    y_test = y(test_indices);
end

四、工程应用建议

4.1 参数调优指南

参数 推荐值 说明
符号数 500-2000 太少特征不足,太多计算量大
SNR范围 -10dB到20dB 覆盖实际通信场景
采样率 2-10倍符号速率 满足奈奎斯特准则
特征维度 30-50维 太少区分度不足,太多过拟合

4.2 抗噪声优化

matlab 复制代码
% 1. 预处理优化
function signal_clean = preprocess_signal(signal, fs)
    % 带通滤波
    [b, a] = butter(4, [fc-500 fc+500]/(fs/2), 'bandpass');
    signal_clean = filtfilt(b, a, signal);
    
    % 去直流
    signal_clean = signal_clean - mean(signal_clean);
    
    % 归一化
    signal_clean = signal_clean / max(abs(signal_clean));
end

% 2. 特征选择优化
function selected_features = select_features(features, labels)
    % 使用互信息选择最相关特征
    num_features = size(features, 2);
    scores = zeros(num_features, 1);
    
    for i = 1:num_features
        scores(i) = mutualinfo(features(:,i), labels);
    end
    
    % 选择前20个最相关特征
    [~, idx] = sort(scores, 'descend');
    selected_features = features(:, idx(1:20));
end

4.3 实时部署优化

matlab 复制代码
% 1. 特征提取优化
% 使用C代码生成加速特征提取
codegen extract_features -args {zeros(1000,1), fs, fc}

% 2. 分类器轻量化
% 使用决策树替代SVM减少计算量
tree = fitctree(train_features, train_labels);

% 3. 增量学习
% 在线更新分类器适应新信号
update_model(tree, new_features, new_labels);

参考代码 通信信号调制识别的程序 www.youwenfan.com/contentcsv/79306.html

五、总结

本系统实现了完整的通信信号调制识别功能:

  1. 多调制类型支持:BPSK、QPSK、8PSK、16QAM、64QAM、FSK、MSK
  2. 丰富的特征提取:时域、频域、统计、高阶累积量特征
  3. 多种分类器:SVM(传统)、CNN(深度学习)
  4. 完整评估体系:准确率、混淆矩阵、特征重要性分析
  5. 实时演示功能:交互式信号识别和可视化

系统特点:

  • 模块化设计,易于扩展
  • 传统机器学习与深度学习结合
  • 工程级参数优化建议
  • 实时部署可行性高

应用场景:

  • 认知无线电频谱感知
  • 军事电子战信号识别
  • 通信侦察与干扰识别
  • 无线电监管与非法电台检测

通过调整特征提取方法和分类器参数,可以适应不同复杂度的调制识别任务。对于实际工程应用,建议从传统SVM方法开始,在性能不足时再考虑CNN等深度学习方法。

相关推荐
Kurisu5751 小时前
深度解析:Java 对象的内存布局与指针压缩原理
java·开发语言
何何____1 小时前
js的数据存储机制
开发语言·前端·javascript·ecmascript
夏天的峰没有风2 小时前
Typora+gitcode+picgo搭建免费图床
开发语言·ios·swift
旺仔老馒头.2 小时前
【C++】类和对象(三)
开发语言·c++·程序人生·类和对象
右耳朵猫AI2 小时前
Java & JVM技术周刊 2026年第19周
java·开发语言·jvm
han_hanker2 小时前
Java 对象序列化
java·开发语言
zhojiew2 小时前
通过Toxiproxy从原理到实践理解混沌工程
开发语言·php
雪之下雪乃的代码日记2 小时前
认识Java中集合框架
java·开发语言·笔记
少司府2 小时前
C++进阶:继承
c语言·开发语言·c++·继承·组合·虚继承