以下是使用MATLAB實現BPSK和QPSK數字調制解調仿真的完整代碼。該代碼包括調制、AWGN信道、匹配濾波/相關解調、星座圖繪制以及誤碼率計算與理論值比較。
%% 清理環境
clear all; close all; clc;
%% 參數設置
numBits = 100000; ? ? ? ? ? % 傳輸比特數
EbN0_dB = 0:2:10; ? ? ? ? ?% Eb/N0范圍 (dB)
modTypes = {'bpsk', 'qpsk'}; % 調制類型
%% 主循環:BPSK和QPSK仿真
for modIdx = 1:length(modTypes)
? ? modType = modTypes{modIdx};
? ? berSim = zeros(size(EbN0_dB)); % 存儲仿真BER
? ??
? ? % 根據調制方式確定參數
? ? if strcmpi(modType, 'bpsk')
? ? ? ? M = 2; ?% 調制階數
? ? ? ? k = 1; ?% 每符號比特數
? ? ? ? % 理論BER計算
? ? ? ? berTheory = berawgn(EbN0_dB, 'psk', M, 'nondiff');
? ? else % QPSK
? ? ? ? M = 4;
? ? ? ? k = 2;
? ? ? ? % Gray編碼的QPSK理論BER
? ? ? ? berTheory = berawgn(EbN0_dB, 'psk', M, 'nondiff');
? ? end
? ??
? ? % 生成隨機比特流
? ? dataBits = randi([0 1], numBits, 1);
? ??
? ? % 調制過程
? ? if strcmpi(modType, 'bpsk')
? ? ? ? % BPSK調制: 0 -> -1; 1 -> 1
? ? ? ? txSym = 2*dataBits - 1;
? ? else % QPSK調制
? ? ? ? % 重組比特: 每兩比特構成一個符號
? ? ? ? reshapedBits = reshape(dataBits, k, [])';
? ? ? ? % Gray映射: [00->1+1j, 01->1-1j, 11->-1-1j, 10->-1+1j]
? ? ? ? txSym = (1 - 2*reshapedBits(:,1)) + 1j*(1 - 2*reshapedBits(:,2));
? ? end
? ??
? ? % 能量歸一化 (確保Eb=1)
? ? if strcmpi(modType, 'qpsk')
? ? ? ? txSym = txSym / sqrt(2); % QPSK符號能量歸一化為1
? ? end
? ??
? ? % 循環不同Eb/N0值
? ? for idx = 1:length(EbN0_dB)
? ? ? ? % 計算當前SNR對應的噪聲方差
? ? ? ? EbN0_lin = 10^(EbN0_dB(idx)/10);
? ? ? ? noiseVar = 1/(2*k*EbN0_lin); % 復噪聲方差
? ? ? ??
? ? ? ? % 生成復高斯噪聲
? ? ? ? noise = sqrt(noiseVar)*randn(size(txSym)) + 1j*sqrt(noiseVar)*randn(size(txSym));
? ? ? ??
? ? ? ? % 通過AWGN信道
? ? ? ? rxSig = txSym + noise;
? ? ? ??
? ? ? ? % 解調過程
? ? ? ? if strcmpi(modType, 'bpsk')
? ? ? ? ? ? % BPSK解調: 實部判決
? ? ? ? ? ? rxBits = real(rxSig) > 0;
? ? ? ? else % QPSK解調
? ? ? ? ? ? % 提取I/Q路并判決
? ? ? ? ? ? I = real(rxSig) < 0; ?% I路判決
? ? ? ? ? ? Q = imag(rxSig) < 0; ?% Q路判決
? ? ? ? ? ? % 重組比特流
? ? ? ? ? ? rxBits = [I Q]';
? ? ? ? ? ? rxBits = rxBits(:);
? ? ? ? end
? ? ? ??
? ? ? ? % 計算誤比特率(BER)
? ? ? ? bitErr = sum(dataBits ~= rxBits);
? ? ? ? berSim(idx) = bitErr / numBits;
? ? end
? ??
? ? %% 結果可視化
? ? % 星座圖繪制
? ? figure(modIdx);
? ? scatterplot(rxSig);
? ? title([upper(modType) ' Constellation at Eb/N0 = ' num2str(EbN0_dB(end)) ' dB']);
? ? grid on;
? ??
? ? % BER曲線比較
? ? figure(length(modTypes)+1);
? ? semilogy(EbN0_dB, berSim, 'o-', 'LineWidth', 2, 'DisplayName', [upper(modType) ' Sim']);
? ? hold on;
? ? semilogy(EbN0_dB, berTheory, 's--', 'LineWidth', 2, 'DisplayName', [upper(modType) ' Theory']);
end
%% 圖形美化
figure(length(modTypes)+1);
grid on;?
xlabel('Eb/N0 (dB)');?
ylabel('Bit Error Rate (BER)');
title('BER Performance Comparison');
legend('Location', 'southwest');
set(gca, 'YScale', 'log');
ylim([1e-5 1]);
代碼功能說明:
-
調制方式:
-
BPSK:二進制相移鍵控(0→-1, 1→+1)
-
QPSK:正交相移鍵控(Gray編碼:00→(1+1j)/√2, 01→(1-1j)/√2, 11→(-1-1j)/√2, 10→(-1+1j)/√2)
-
-
關鍵處理步驟:
-
比特生成:生成隨機二進制數據
-
調制映射:根據調制類型將比特映射為復符號
-
能量歸一化:確保單位比特能量(Eb=1)
-
AWGN信道:添加復高斯白噪聲
-
解調判決:相關解調(實部/虛部分別判決)
-
BER計算:比較發送與接收比特
-
-
可視化功能:
-
星座圖(
scatterplot
函數) -
BER曲線:仿真結果與理論值(
berawgn
函數)對比
-
-
理論BER參考:
-
BPSK理論BER:0.5*erfc(sqrt(Eb/N0))
-
QPSK理論BER:與BPSK相同(Gray編碼時)
-
運行結果示例:
-
星座圖:
-
BPSK:兩點分布在實軸±1位置
-
QPSK:四點分布在復平面四個象限
-
-
BER曲線:
-
仿真曲線(帶標記)與理論曲線(虛線)緊密重合
-
隨Eb/N0增加,BER指數下降
-
關鍵函數說明:
-
berawgn
:計算AWGN信道理論BER -
scatterplot
:繪制信號星座圖 -
randi
:生成隨機比特序列 -
semilogy
:繪制對數坐標BER曲線
此代碼完整實現了數字調制解調系統仿真流程,通過調整參數(如numBits
、EbN0_dB
)可進行不同規模的仿真實驗。