QPSK调制在瑞利、高斯和莱斯信道下的MATLAB仿真

QPSK调制在不同信道条件下性能仿真的MATLAB实现

%% QPSK在瑞利、高斯和莱斯信道下的仿真
clear; close all; clc;

%% 仿真参数设置
numBits = 1e6;              % 传输的比特数
SNR_dB = 0:2:20;           % 信噪比范围(dB)
numSNR = length(SNR_dB);    % 信噪比点数

% 莱斯信道参数
K_dB = 3;                   % 莱斯K因子(dB)
K = 10^(K_dB/10);           % 线性K因子

%% 初始化误码率存储
BER_AWGN = zeros(1, numSNR);
BER_Rayleigh = zeros(1, numSNR);
BER_Rician = zeros(1, numSNR);

%% 主仿真循环
for snr_idx = 1:numSNR
    fprintf('处理 SNR = %d dB...\n', SNR_dB(snr_idx));
    
    % 当前SNR值
    SNR = 10^(SNR_dB(snr_idx)/10);
    
    % 初始化误码计数器
    error_AWGN = 0;
    error_Rayleigh = 0;
    error_Rician = 0;
    
    %% 数据生成和调制
    % 生成随机二进制数据
    data_bits = randi([0 1], 1, numBits);
    
    % QPSK调制
    modulated_symbols = qpsk_modulate(data_bits);
    
    %% 信道传输
    % 高斯白噪声信道
    received_AWGN = awgn_channel(modulated_symbols, SNR);
    
    % 瑞利衰落信道
    received_Rayleigh = rayleigh_channel(modulated_symbols, SNR);
    
    % 莱斯衰落信道
    received_Rician = rician_channel(modulated_symbols, SNR, K);
    
    %% 解调和误码率计算
    % 高斯信道
    decoded_bits_AWGN = qpsk_demodulate(received_AWGN);
    error_AWGN = sum(data_bits ~= decoded_bits_AWGN);
    
    % 瑞利信道
    decoded_bits_Rayleigh = qpsk_demodulate(received_Rayleigh);
    error_Rayleigh = sum(data_bits ~= decoded_bits_Rayleigh);
    
    % 莱斯信道
    decoded_bits_Rician = qpsk_demodulate(received_Rician);
    error_Rician = sum(data_bits ~= decoded_bits_Rician);
    
    %% 存储误码率
    BER_AWGN(snr_idx) = error_AWGN / numBits;
    BER_Rayleigh(snr_idx) = error_Rayleigh / numBits;
    BER_Rician(snr_idx) = error_Rician / numBits;
end

%% 理论误码率计算
% 高斯信道的理论QPSK误码率
theory_BER_AWGN = 0.5 * erfc(sqrt(10.^(SNR_dB/10)/sqrt(2)));

% 瑞利信道的理论误码率
theory_BER_Rayleigh = 0.5 * (1 - sqrt(10.^(SNR_dB/10)./(1 + 10.^(SNR_dB/10))));

%% 绘制结果
figure('Position', [100, 100, 1200, 800]);

% 误码率曲线
subplot(2,2,1);
semilogy(SNR_dB, BER_AWGN, 'bo-', 'LineWidth', 2, 'MarkerSize', 6);
hold on;
semilogy(SNR_dB, BER_Rayleigh, 'rs-', 'LineWidth', 2, 'MarkerSize', 6);
semilogy(SNR_dB, BER_Rician, 'g^-', 'LineWidth', 2, 'MarkerSize', 6);
semilogy(SNR_dB, theory_BER_AWGN, 'b--', 'LineWidth', 1.5);
semilogy(SNR_dB, theory_BER_Rayleigh, 'r--', 'LineWidth', 1.5);
grid on;
xlabel('信噪比 (dB)');
ylabel('误码率 (BER)');
title('QPSK在不同信道下的性能比较');
legend('高斯信道(仿真)', '瑞利信道(仿真)', '莱斯信道(仿真)', ...
       '高斯信道(理论)', '瑞利信道(理论)', 'Location', 'southwest');
set(gca, 'FontSize', 12);

% 星座图展示 (选择SNR=10dB的情况)
snr_demo = 10;
demo_SNR = 10^(snr_demo/10);

% 生成演示数据
demo_bits = randi([0 1], 1, 1000);
demo_symbols = qpsk_modulate(demo_bits);

% 高斯信道星座图
subplot(2,2,2);
demo_received_AWGN = awgn_channel(demo_symbols, demo_SNR);
plot(real(demo_received_AWGN), imag(demo_received_AWGN), 'b.');
hold on;
plot(real(demo_symbols), imag(demo_symbols), 'ro', 'MarkerSize', 8, 'LineWidth', 2);
grid on;
axis equal;
xlabel('同相分量 (I)');
ylabel('正交分量 (Q)');
title('高斯信道星座图');
legend('接收符号', '发送符号');
set(gca, 'FontSize', 10);

% 瑞利信道星座图
subplot(2,2,3);
demo_received_Rayleigh = rayleigh_channel(demo_symbols, demo_SNR);
plot(real(demo_received_Rayleigh), imag(demo_received_Rayleigh), 'r.');
hold on;
plot(real(demo_symbols), imag(demo_symbols), 'bo', 'MarkerSize', 8, 'LineWidth', 2);
grid on;
axis equal;
xlabel('同相分量 (I)');
ylabel('正交分量 (Q)');
title('瑞利信道星座图');
legend('接收符号', '发送符号');
set(gca, 'FontSize', 10);

% 莱斯信道星座图
subplot(2,2,4);
demo_received_Rician = rician_channel(demo_symbols, demo_SNR, K);
plot(real(demo_received_Rician), imag(demo_received_Rician), 'g.');
hold on;
plot(real(demo_symbols), imag(demo_symbols), 'bo', 'MarkerSize', 8, 'LineWidth', 2);
grid on;
axis equal;
xlabel('同相分量 (I)');
ylabel('正交分量 (Q)');
title('莱斯信道星座图');
legend('接收符号', '发送符号');
set(gca, 'FontSize', 10);

%% 显示性能比较表格
fprintf('\n=== QPSK在不同信道下的性能比较 ===\n');
fprintf('SNR(dB)\t高斯信道\t瑞利信道\t莱斯信道\n');
fprintf('------------------------------------------------\n');
for i = 1:numSNR
    fprintf('%d\t%.2e\t%.2e\t%.2e\n', ...
            SNR_dB(i), BER_AWGN(i), BER_Rayleigh(i), BER_Rician(i));
end

%% QPSK调制函数
function modulated_symbols = qpsk_modulate(bits)
    % 将比特流重组为2比特一组
    reshaped_bits = reshape(bits, 2, []);
    
    % 映射到QPSK星座点
    % 映射规则: 00 -> 1+j, 01 -> 1-j, 11 -> -1-j, 10 -> -1+j
    I = 1 - 2 * reshaped_bits(1, :);      % 同相分量
    Q = 1 - 2 * reshaped_bits(2, :);      % 正交分量
    
    modulated_symbols = (I + 1j * Q) / sqrt(2);  % 归一化功率
end

%% QPSK解调函数
function decoded_bits = qpsk_demodulate(symbols)
    % 判决
    I_decision = real(symbols) < 0;
    Q_decision = imag(symbols) < 0;
    
    % 重组为比特流
    decoded_bits = zeros(1, 2*length(symbols));
    decoded_bits(1:2:end) = I_decision;
    decoded_bits(2:2:end) = Q_decision;
end

%% 高斯白噪声信道
function received_signal = awgn_channel(signal, SNR_linear)
    % 计算信号功率
    signal_power = mean(abs(signal).^2);
    
    % 计算噪声功率
    noise_power = signal_power / SNR_linear;
    
    % 生成复高斯噪声
    noise = sqrt(noise_power/2) * (randn(size(signal)) + 1j*randn(size(signal)));
    
    % 添加噪声
    received_signal = signal + noise;
end

%% 瑞利衰落信道
function received_signal = rayleigh_channel(signal, SNR_linear)
    % 生成瑞利衰落系数 (独立同分布)
    % 实部和虚部都是零均值、方差为0.5的高斯分布
    h = (randn(size(signal)) + 1j*randn(size(signal))) / sqrt(2);
    
    % 信号通过衰落信道
    faded_signal = signal .* h;
    
    % 计算信号功率
    signal_power = mean(abs(faded_signal).^2);
    
    % 计算噪声功率
    noise_power = signal_power / SNR_linear;
    
    % 生成复高斯噪声
    noise = sqrt(noise_power/2) * (randn(size(signal)) + 1j*randn(size(signal)));
    
    % 添加噪声
    received_signal = faded_signal + noise;
    
    % 理想信道估计下的均衡
    received_signal = received_signal ./ h;
end

%% 莱斯衰落信道
function received_signal = rician_channel(signal, SNR_linear, K)
    % K: 莱斯K因子 (直射路径功率/散射路径功率)
    
    % 莱斯信道的确定性部分 (直射路径)
    deterministic_part = sqrt(K/(K+1));
    
    % 莱斯信道的随机部分 (散射路径)
    random_part = sqrt(1/(2*(K+1))) * (randn(size(signal)) + 1j*randn(size(signal)));
    
    % 总信道系数
    h = deterministic_part + random_part;
    
    % 信号通过衰落信道
    faded_signal = signal .* h;
    
    % 计算信号功率
    signal_power = mean(abs(faded_signal).^2);
    
    % 计算噪声功率
    noise_power = signal_power / SNR_linear;
    
    % 生成复高斯噪声
    noise = sqrt(noise_power/2) * (randn(size(signal)) + 1j*randn(size(signal)));
    
    % 添加噪声
    received_signal = faded_signal + noise;
    
    % 理想信道估计下的均衡
    received_signal = received_signal ./ h;
end

%% 额外的分析:不同K因子对莱斯信道的影响
figure('Position', [100, 100, 1000, 600]);

K_dB_values = [-10, 0, 5, 10];  % 不同的K因子(dB)
colors = ['r', 'g', 'b', 'm'];
styles = {'-', '--', ':', '-.'};

for k_idx = 1:length(K_dB_values)
    K_dB = K_dB_values(k_idx);
    K_linear = 10^(K_dB/10);
    
    BER_Rician_varyingK = zeros(1, numSNR);
    
    for snr_idx = 1:numSNR
        SNR = 10^(SNR_dB(snr_idx)/10);
        
        % 生成测试数据
        test_bits = randi([0 1], 1, 10000);
        test_symbols = qpsk_modulate(test_bits);
        
        % 莱斯信道传输
        received_symbols = rician_channel(test_symbols, SNR, K_linear);
        
        % 解调
        decoded_bits = qpsk_demodulate(received_symbols);
        
        % 计算误码率
        BER_Rician_varyingK(snr_idx) = sum(test_bits ~= decoded_bits) / length(test_bits);
    end
    
    semilogy(SNR_dB, BER_Rician_varyingK, [colors(k_idx) styles{k_idx}], ...
             'LineWidth', 2, 'DisplayName', sprintf('K = %d dB', K_dB));
    hold on;
end

% 添加高斯和瑞利作为参考
semilogy(SNR_dB, BER_AWGN, 'k-', 'LineWidth', 3, 'DisplayName', '高斯信道');
semilogy(SNR_dB, BER_Rayleigh, 'k--', 'LineWidth', 3, 'DisplayName', '瑞利信道');

grid on;
xlabel('信噪比 (dB)');
ylabel('误码率 (BER)');
title('不同K因子下莱斯信道的QPSK性能');
legend('Location', 'southwest');
set(gca, 'FontSize', 12);

仿真说明

1. 信道模型

  1. 高斯信道 (AWGN)

    • 只有加性高斯白噪声
    • 性能最好,作为参考基准
  2. 瑞利信道

    • 模拟多径衰落环境,无直射路径
    • 性能最差,需要更高的SNR
  3. 莱斯信道

    • 包含一个直射路径和多个散射路径
    • 性能介于高斯和瑞利之间

2. 关键参数

  • K因子: 莱斯信道中直射路径与散射路径的功率比
    • K = 0: 退化为瑞利信道
    • K → ∞: 接近高斯信道

3. 仿真输出

  1. 误码率曲线: 比较三种信道在不同SNR下的性能
  2. 星座图: 展示信号在三种信道中的分布
  3. 性能表格: 数值化的误码率比较
  4. K因子分析: 展示不同K值对莱斯信道性能的影响

4. 运行结果分析

  • 高斯信道性能最佳
  • 瑞利信道由于衰落影响性能最差
  • 莱斯信道性能取决于K因子大小
  • K因子越大,莱斯信道越接近高斯信道

参考代码 MATLAB的QPSK在瑞利、高斯和莱斯信道下仿真 www.youwenfan.com/contentcni/65524.html

展示了QPSK调制在不同无线信道环境下的性能特性,对于理解无线通信系统设计有重要参考价值。

posted @ 2025-10-13 11:37  康帅服  阅读(13)  评论(0)    收藏  举报