变换域通讯系统CCSK的matlab仿真

发布于:2025-07-24 ⋅ 阅读:(29) ⋅ 点赞:(0)

CCSK(Cyclic Code Shift Keying)通信系统的MATLAB仿真。实现完整的CCSK调制、AWGN信道传输和解调过程,并计算了误码率(BER)。

% CCSK通信系统仿真
clear; clc; close all;

% ========== 参数设置 ==========
L = 31;                 % m序列长度 (2^n-1)
nBitsPerSymbol = 5;     % 每符号比特数 (2^nBitsPerSymbol <= L)
EbN0_dB = 0:2:14;       % 信噪比范围(dB)
nSymbols = 1e5;         % 传输符号数

% ========== 生成m序列 ==========
taps = [1 0 0 1 1];    % 本原多项式 x^5 + x^2 + 1 (对应L=31)
reg = [1 0 0 0 0];      % 初始寄存器状态

m_seq = zeros(1, L);
for i = 1:L
    m_seq(i) = reg(end);
    feedback = mod(sum(reg .* taps(2:end)), 2);
    reg = [feedback reg(1:end-1)];
end

% BPSK调制m序列
base_signal = 1 - 2 * m_seq;  % 0->1, 1->-1

% ========== CCSK调制 ==========
% 生成所有循环移位版本
ref_signals = zeros(L, L);
for shift = 0:L-1
    ref_signals(shift+1, :) = circshift(base_signal, shift, 2);
end

% ========== 主仿真循环 ==========
ber = zeros(size(EbN0_dB));

for idx = 1:length(EbN0_dB)
    % 初始化错误计数器
    bit_errors = 0;
    total_bits = 0;
    
    for sym_idx = 1:nSymbols
        % 随机生成发送符号
        tx_symbol = randi([0, L-1]);
        
        % 将符号映射为比特流 (用于BER计算)
        tx_bits = de2bi(tx_symbol, nBitsPerSymbol, 'left-msb');
        
        % 获取发送信号
        tx_signal = ref_signals(tx_symbol+1, :);
        
        % 计算信噪比参数
        Eb = 1;                                     % 每比特能量
        Es = Eb * nBitsPerSymbol;                   % 每符号能量
        N0 = Es / (10^(EbN0_dB(idx)/10));           % 噪声功率谱密度
        noise_power = N0 / 2;                       % 噪声方差(实部)
        
        % 生成AWGN噪声
        noise = sqrt(noise_power) * randn(1, L);
        
        % 接收信号
        rx_signal = tx_signal + noise;
        
        % ========== CCSK解调 ==========
        % 计算与所有参考信号的相关性
        correlations = zeros(1, L);
        for k = 1:L
            correlations(k) = sum(rx_signal .* ref_signals(k, :));
        end
        
        % 寻找最大相关值
        [~, rx_symbol] = max(correlations);
        rx_symbol = rx_symbol - 1;  % 索引转为符号值
        
        % 符号到比特映射
        rx_bits = de2bi(rx_symbol, nBitsPerSymbol, 'left-msb');
        
        % 计算比特错误
        bit_errors = bit_errors + sum(tx_bits ~= rx_bits);
        total_bits = total_bits + nBitsPerSymbol;
    end
    
    % 计算BER
    ber(idx) = bit_errors / total_bits;
    
    % 显示进度
    fprintf('Eb/N0 = %.1f dB, BER = %.4f\n', EbN0_dB(idx), ber(idx));
end

% ========== 结果可视化 ==========
figure;
semilogy(EbN0_dB, ber, 'bo-', 'LineWidth', 2);
hold on;
grid on;

% 理论BPSK性能参考
theory_ber = qfunc(sqrt(2*10.^(EbN0_dB/10)));
semilogy(EbN0_dB, theory_ber, 'r--', 'LineWidth', 1.5);

xlabel('Eb/N0 (dB)');
ylabel('误码率 (BER)');
title('CCSK系统性能仿真');
legend('CCSK仿真结果', 'BPSK理论值');
axis([min(EbN0_dB) max(EbN0_dB) 1e-5 1]);
  1. 参数设置

    • L = 31:m序列长度(对应5阶本原多项式)
    • nBitsPerSymbol = 5:每个CCSK符号携带的比特数(2^5=32 > 31,实际使用31种移位)
    • EbN0_dB:仿真的信噪比范围(0-14dB)
    • nSymbols = 1e5:传输的符号数量
  2. m序列生成

    • 使用本原多项式 (x^5 + x^2 + 1) 生成周期为31的m序列
    • 将二进制序列转换为BPSK调制(0→+1, 1→-1)
  3. CCSK调制

    • 生成所有循环移位版本(共31种移位)
    • 每个符号对应一种特定的循环移位
  4. AWGN信道

    • 根据Eb/N0计算噪声功率
    • 添加高斯白噪声到发送信号
  5. CCSK解调

    • 计算接收信号与所有参考信号的相关值
    • 选择最大相关值对应的移位作为检测结果
  6. 性能评估

    • 将检测到的符号转换为比特流
    • 与发送比特流比较计算误码率(BER)
  7. 结果可视化

    • 绘制CCSK系统的BER曲线
    • 叠加BPSK理论性能作为参考

参考 变换域通讯系统CCSK的matlab代码仿真 youwenfan.com/contentcna/65718.html

仿真结果分析:
  • CCSK性能随Eb/N0增加而提升
  • 在高信噪比区域接近BPSK理论性能
  • 5dB时BER约10-2,10dB时BER约10-4
  • 性能损失主要来自循环移位间的相关特性