MATLAB实战:实现数字调制解调仿真
以下是使用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
)可进行不同规模的仿真实验。