16qam 调制解调 并画出16qam星座图,误码率曲线,眼图 matlab代码仿真
时间: 2023-11-06 13:08:28 浏览: 243
16QAM调制解调的MATLAB代码如下:
调制:
```matlab
% 设置参数
M = 16; % 星座点数
fc = 5000; % 载波频率
fs = 100000; % 采样频率
T = 1/fs; % 采样时间间隔
numBits = 1000; % 待调制的比特数
nSamp = 4; % 每个符号的采样数
EbNo = 10; % 信噪比(dB)
EsNo = 10*log10(M) + EbNo; % 符号噪声比(dB)
sigma = 1/sqrt(2*EsNo); % 噪声标准差
% 生成随机比特流
bitsIn = randi([0 1],1,numBits);
% 将比特流分组成符号
M = 16;
k = log2(M);
symbolsIn = bi2de(reshape(bitsIn,length(bitsIn)/k,k),'left-msb');
% 生成16QAM星座图
constellation = qammod(0:M-1,M);
% 16QAM调制
txSig = qammod(symbolsIn,M,'gray');
% 将符号映射到星座图上
txSigMapped = constellation(txSig+1);
% 为星座图添加噪声
noise = sigma*randn(size(txSigMapped));
rxSig = txSigMapped + noise;
% 绘制星座图
scatterplot(constellation); hold on;
plot(real(txSigMapped),imag(txSigMapped),'ko');
plot(real(rxSig),imag(rxSig),'r.');
title('16QAM Constellation');
xlabel('In-Phase');
ylabel('Quadrature');
grid on;
```
解调:
```matlab
% 16QAM解调
rxSigMapped = rxSig ./ constellation;
% 将解调后的符号映射到星座图上
[~,rxSymbols] = min(abs(rxSigMapped.' - constellation),[],2);
rxBits = de2bi(rxSymbols-1,k,'left-msb').';
rxBits = rxBits(:).';
% 统计误码率
numErrs = sum(rxBits ~= bitsIn);
ber = numErrs / length(bitsIn);
% 绘制误码率曲线
EbN0 = 0:2:20;
theoryBer = berawgn(EbN0,'qam',M);
semilogy(EbN0,theoryBer,'b-','LineWidth',2); hold on;
semilogy(EbNo,ber,'ro','LineWidth',2);
title('16QAM BER');
xlabel('Eb/No (dB)');
ylabel('Bit Error Rate');
legend('Theory','Simulation');
grid on;
% 绘制眼图
eyediagram(rxSigMapped,nSamp*2);
title('16QAM Eye Diagram');
xlabel('Time');
ylabel('Amplitude');
grid on;
```
注意,在以上代码中,`qammod`和`qamdemod`函数可以分别用于16QAM调制和解调。眼图可以使用`eyediagram`函数来绘制。
阅读全文