BPSK和QPSK调制下的数字带通传输系统仿真
系统模型
该仿真系统包括以下组件:
- 随机比特序列生成
- 信道编码(使用LDPC码)
- 调制(BPSK或QPSK)
- 带通传输信道(AWGN)
- 解调
- 信道解码
- 性能分析(BER计算)
MATLAB仿真
% 数字带通传输系统仿真 - BPSK和QPSK调制比较
clear all;
close all;
clc;
% 系统参数设置
modulationTypes = {'BPSK', 'QPSK'};  % 调制方式
n = 648;                            % 码字长度(简化版本,便于快速仿真)
k = 324;                            % 信息位长度
R = k/n;                            % 码率
numFrames = 100;                    % 仿真帧数
EbNoVec = 0:1:10;                   % Eb/No值范围 (dB)
maxNumErrs = 100;                   % 每点最大错误数
maxNumBits = 1e6;                   % 每点最大比特数
% 生成LDPC矩阵
H = dvbs2ldpc(R);                   % 使用DVB-S2标准的LDPC矩阵
encoder = comm.LDPCEncoder(H);      % 创建LDPC编码器
decoder = comm.LDPCDecoder(H);      % 创建LDPC解码器
% 初始化BER存储
berBPSK = zeros(size(EbNoVec));
berQPSK = zeros(size(EbNoVec));
% 进度指示
fprintf('仿真进度: 0%%');
% 主循环 - 对每种调制方式
for modType = 1:length(modulationTypes)
    modulation = modulationTypes{modType};
    
    % 根据调制方式确定参数
    if strcmp(modulation, 'BPSK')
        M = 2;      % 调制阶数
        kMod = 1;   % 每符号比特数
    else % QPSK
        M = 4;
        kMod = 2;
    end
    
    % 对每个Eb/No值进行仿真
    for ebnoIdx = 1:length(EbNoVec)
        ebno = EbNoVec(ebnoIdx);
        snr = ebno + 10*log10(kMod * R);  % 考虑码率和调制阶数的SNR
        
        % 初始化错误和比特计数器
        numErrs = 0;
        numBits = 0;
        frameCount = 0;
        
        % 循环直到收集足够的统计量
        while (numErrs < maxNumErrs) && (numBits < maxNumBits)
            % 生成随机数据
            data = randi([0 1], k, 1);
            
            % LDPC编码
            encodedData = encoder(data);
            
            % 调制
            if strcmp(modulation, 'BPSK')
                % BPSK调制: 0->1, 1->-1
                modSignal = 2*encodedData - 1;
            else
                % QPSK调制
                % 重组比特为符号
                reshapedData = reshape(encodedData, kMod, []);
                symbols = bi2de(reshapedData', 'left-msb')';
                % QPSK映射: 00->(1+1j), 01->(1-1j), 11->(-1-1j), 10->(-1+1j)
                modSignal = pskmod(symbols, M, pi/4, 'gray');
            end
            
            % 通过AWGN信道
            receivedSignal = awgn(modSignal, snr, 'measured');
            
            % 解调
            if strcmp(modulation, 'BPSK')
                % BPSK硬判决解调
                demodBits = receivedSignal > 0;
            else
                % QPSK解调
                demodSymbols = pskdemod(receivedSignal, M, pi/4, 'gray');
                demodBits = de2bi(demodSymbols, kMod, 'left-msb')';
                demodBits = demodBits(:);
            end
            
            % LDPC解码
            decodedData = decoder(demodBits);
            
            % 计算错误比特数
            errors = biterr(data, decodedData(1:k));
            numErrs = numErrs + errors;
            numBits = numBits + k;
            frameCount = frameCount + 1;
        end
        
        % 计算BER
        if strcmp(modulation, 'BPSK')
            berBPSK(ebnoIdx) = numErrs/numBits;
        else
            berQPSK(ebnoIdx) = numErrs/numBits;
        end
        
        % 更新进度
        progress = ((modType-1)*length(EbNoVec) + ebnoIdx) / (length(modulationTypes)*length(EbNoVec)) * 100;
        fprintf('\b\b\b\b%3.0f%%', progress);
    end
end
fprintf('\n仿真完成!\n');
% 理论BER曲线
theoryBER_BPSK = 0.5*erfc(sqrt(10.^(EbNoVec/10)));
theoryBER_QPSK = 0.5*erfc(sqrt(10.^(EbNoVec/10)));
% 绘制性能曲线
figure;
semilogy(EbNoVec, berBPSK, 'bo-', 'LineWidth', 2);
hold on;
semilogy(EbNoVec, theoryBER_BPSK, 'b--', 'LineWidth', 1.5);
semilogy(EbNoVec, berQPSK, 'ro-', 'LineWidth', 2);
semilogy(EbNoVec, theoryBER_QPSK, 'r--', 'LineWidth', 1.5);
grid on;
xlabel('Eb/No (dB)');
ylabel('误比特率 (BER)');
title('BPSK和QPSK调制下的LDPC编码系统性能');
legend('BPSK仿真', 'BPSK理论', 'QPSK仿真', 'QPSK理论');
% 添加编码增益分析
codingGainBPSK = zeros(size(EbNoVec));
codingGainQPSK = zeros(size(EbNoVec));
for i = 1:length(EbNoVec)
    % 找到理论曲线中与仿真BER相同的点
    [~, idx] = min(abs(theoryBER_BPSK - berBPSK(i)));
    codingGainBPSK(i) = EbNoVec(idx) - EbNoVec(i);
    
    [~, idx] = min(abs(theoryBER_QPSK - berQPSK(i)));
    codingGainQPSK(i) = EbNoVec(idx) - EbNoVec(i);
end
% 绘制编码增益
figure;
plot(EbNoVec, codingGainBPSK, 'b-o', 'LineWidth', 2);
hold on;
plot(EbNoVec, codingGainQPSK, 'r-s', 'LineWidth', 2);
grid on;
xlabel('Eb/No (dB)');
ylabel('编码增益 (dB)');
title('LDPC编码在不同调制方式下的编码增益');
legend('BPSK', 'QPSK');
% 显示特定Eb/No点的BER值
fprintf('\n在Eb/No = 4dB时的性能:\n');
idx = find(EbNoVec == 4);
if ~isempty(idx)
    fprintf('BPSK BER: %.2e\n', berBPSK(idx));
    fprintf('QPSK BER: %.2e\n', berQPSK(idx));
end
参考代码 调制方式为BPSK和QPSK下的数字带通传输系统仿真 www.youwenfan.com/contentcne/101331.html
扩展分析
除了基本的BER性能,还可以进行以下扩展分析:
- 
频谱效率比较: % 计算频谱效率 spectralEfficiencyBPSK = R * log2(2); % 比特/秒/Hz spectralEfficiencyQPSK = R * log2(4); fprintf('BPSK频谱效率: %.2f bps/Hz\n', spectralEfficiencyBPSK); fprintf('QPSK频谱效率: %.2f bps/Hz\n', spectralEfficiencyQPSK);
- 
不同码率性能比较: 
 可以修改代码中的码率参数R,比较不同码率下的性能表现。
- 
迭代解码性能: % 可以设置不同的迭代次数 decoder = comm.LDPCDecoder(H, 'IterationTerminationCondition', 'Maximum iteration count', ... 'MaximumIterationCount', 20);
- 
瑞利衰落信道性能: % 替代AWGN信道,使用瑞利衰落信道 channel = comm.RayleighChannel('SampleRate', 1e6, 'PathDelays', [0], ... 'AveragePathGains', [0], 'NormalizePathGains', true); fadedSignal = channel(modSignal); receivedSignal = awgn(fadedSignal, snr, 'measured');
结论
通过此仿真,我们可以全面分析BPSK和QPSK调制在数字带通传输系统中的性能差异,以及LDPC编码提供的编码增益。QPSK虽然提供了更高的频谱效率,但需要更高的信噪比来达到与BPSK相同的BER性能。LDPC编码可以显著改善两种调制方式的性能,在适当的码率选择下,可以实现接近香农限的性能。
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号