实现单载波QPSK和QAM的MATLAB模拟代码
时间: 2024-03-24 13:40:37 浏览: 15
下面是单载波QPSK和QAM的MATLAB模拟代码示例:
QPSK:
```matlab
% 设置参数
N = 10000; % 传输符号数
fc = 100; % 载波频率
fs = 1000; % 采样率
T = 1/fs; % 采样间隔
Ts = 1/fc; % 符号周期
M = 4; % 调制阶数
k = log2(M); % 每个符号的比特数
% 生成随机符号
data = randi([0 M-1],N,k);
% 将二进制数据转换为实数部分和虚数部分
dataI = data(:,1)*2-1;
dataQ = data(:,2)*2-1;
% QPSK调制
modData = (dataI + 1i*dataQ)/sqrt(2);
% 生成载波
t = 0:T:(N*k*T-T);
carrier = exp(1i*2*pi*fc*t);
% 调制信号
txSig = real(modData.*carrier.');
% 添加高斯白噪声
EbNo = 10;
snr = EbNo + 10*log10(k) - 10*log10(T);
rxSig = awgn(txSig,snr);
% 解调信号
rxSig = rxSig.*carrier.';
demodData = zeros(N,k);
for i = 1:N
if real(rxSig((i-1)*T/Ts+1:i*T/Ts)) > 0
demodData(i,1) = 1;
else
demodData(i,1) = 0;
end
if imag(rxSig((i-1)*T/Ts+1:i*T/Ts)) > 0
demodData(i,2) = 1;
else
demodData(i,2) = 0;
end
end
% 计算误比特率
[numErrors,ber] = biterr(data,demodData);
```
QAM:
```matlab
% 设置参数
N = 10000; % 传输符号数
fc = 100; % 载波频率
fs = 1000; % 采样率
T = 1/fs; % 采样间隔
Ts = 1/fc; % 符号周期
M = 16; % 调制阶数
k = log2(M); % 每个符号的比特数
% 生成随机符号
data = randi([0 M-1],N,k);
% 将二进制数据转换为实数部分和虚数部分
dataI = zeros(N,1);
dataQ = zeros(N,1);
for i = 1:N
dataI(i) = (-1)^data(i,1)*sqrt(M)/sqrt(2)*cos(pi/M*(2*data(i,2)-1));
dataQ(i) = (-1)^data(i,1)*sqrt(M)/sqrt(2)*sin(pi/M*(2*data(i,2)-1));
end
% QAM调制
modData = dataI + 1i*dataQ;
% 生成载波
t = 0:T:(N*k*T-T);
carrier = exp(1i*2*pi*fc*t);
% 调制信号
txSig = real(modData.*carrier.');
% 添加高斯白噪声
EbNo = 10;
snr = EbNo + 10*log10(k) - 10*log10(T);
rxSig = awgn(txSig,snr);
% 解调信号
rxSig = rxSig.*carrier.';
demodData = zeros(N,k);
for i = 1:N
if real(rxSig((i-1)*T/Ts+1:i*T/Ts)) > 0
demodData(i,1) = 1;
else
demodData(i,1) = 0;
end
if imag(rxSig((i-1)*T/Ts+1:i*T/Ts)) > 0
demodData(i,2) = 1;
else
demodData(i,2) = 0;
end
% 解调星座点
x = real(rxSig((i-1)*T/Ts+1:i*T/Ts));
y = imag(rxSig((i-1)*T/Ts+1:i*T/Ts));
theta = atan2(y,x);
r = sqrt(x^2+y^2);
index = round((theta+pi)*M/(2*pi));
if index == 0
index = 1;
end
if index > M
index = M;
end
demodData(i,3) = rem(index-1,4);
demodData(i,4) = floor((index-1)/4);
end
% 计算误比特率
[numErrors,ber] = biterr(data,demodData);
```
这两个示例代码分别实现了QPSK和QAM的调制和解调,包括随机符号生成、载波生成、添加高斯白噪声、解调星座点等过程。