QAM的调制、解调MATLAB程序

2023.5.19
author:JHB
about:16QAM

clear;
clc;
%基础参数设置
tic;        %程序计时
N=1000;     %码元个数4*M
fb=1;       %基带频率
fs=32;      %抽样频率
fc=4;       %载波频率
wave_in=randi([0,1],1,N);   %产生0,1随机序列
T=length(wave_in)/fb;
dt=1/fs;
m=fs/fb;
nn=length(wave_in);
t=0:dt:T-dt;
%串并变换分离出 I、Q两个分量,再分别电平映射
%将产生序列的0,1分别对应,即00、01、11、10分别对应3、1、-1、-3
T=[3,1;-3,-1]; 

%I路,即输入序列的奇数位置上的码元
I=wave_in(1:2:N);
n_I=length(I); 
ii=1;
for i=1:2:n_I
   xi=I(i:i+1)+1;
   I_road(ii)=T(xi(1),xi(2));
   ii=ii+1;
end

y_I=[];
for i=1:4*m
    y_I = [y_I;I_road];
end
y_I = y_I(:)';

%Q路,即输入序列的偶数位置上的码元
Q=wave_in(2:2:nn);
n_Q=length(Q); 
qq=1;
for i=1:2:n_Q
   xq=Q(i:i+1)+1;
   Q_road(qq)=T(xq(1),xq(2));
   qq=qq+1;
end

y_Q=[];
for i=1:4*m
    y_Q = [y_Q;Q_road];
end
y_Q = y_Q(:)';
%滤波
b=firrcos(16,fb/4,fb/4,fs);
I_lvbo=filter(b,1,y_I);
Q_lvbo=filter(b,1,y_Q);
%%%%%%%%%%%%%%%%%%%%%%设置载波,qam调制
zaibo1=cos(2*pi*fc*t);
zaibo2=sin(2*pi*fc*t);
y_qam=I_lvbo.*zaibo1-Q_lvbo.*zaibo2;
tz=awgn(y_qam,16);      %通过高斯白噪声,16是信噪比,dB
%通过改变信噪比,改善误码率
%傅里叶变换
n=length(y_qam);
y=fft(y_qam)/n;
y=abs(y(1:fix(n/2)))*2;
q=find(y<=1e-04);
y(q)=1e-04;
y=20*log10(y);
f1=m/n;
f=0:f1:(length(y)-1)*f1;

figure(1);
subplot(211);
plot(f/fb,y,'r');
grid on;
title('已调信号频谱');
xlabel('f/fb');
subplot(212);
plot(t/2,y_qam,'LineWidth',2);
title('QAM信号波形');
xlabel('时间/s');
ylabel('幅度');

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%星座图
N1=length(tz);
m=2*fs/fb;
n=fs/fc;
i1=m-n; 
i=1;

ph0=(i1-1)*2*pi/n;
while i<= N1/m
    xi=tz(i1:i1+n-1);
    y=2*fft(xi)/n; 
    c(i)=y(2);
    i=i+1;
    i1=i1+m;
end
le=length(c);
cmax=max(abs(c));
figure(2);
ph=(0:5:360)*pi/180;
plot(3*1.414*cos(ph),3*1.414*sin(ph),'c');
hold on;
for i=1:le
    ph=ph0-angle(c(i));
    a=abs(c(i))/cmax*1.414;
    plot(3*a*cos(ph),3*a*sin(ph),'r*');
end
plot([-5 5],[0 0],'k:',[0 0],[-5 5],'k:');
hold off; 
axis equal;
axis([-5 5 -5 5]);
title('方形16QAM星座图');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%解调
dt=1/fs;
t=0:dt:(length(tz)-1)*dt;
I_jt=tz.*cos(2*pi*fc*t);
Q_jt=-tz.*sin(2*pi*fc*t);
%滤波
[b1,a]=butter(2,2*fb/fs);
I_jt=filtfilt(b1,a,I_jt);
Q_jt=filtfilt(b1,a,Q_jt);
mj=4*fs/fb;
N_j=length(tz)/mj;
K=0.6:1:N_j;
nj=K*mj;
nj=fix(nj);
In=I_jt(nj);
Qn=Q_jt(nj);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%电平转换
ymin=min(In);
ymax=max(In);
ymax=max([ymax abs(ymin)]);
ymin=-abs(ymax);
In=(In-ymin)*3/(ymax-ymin);

%I路分析

I0=find(In< 0.5);           In(I0)=-3*ones(size(I0));
I1=find(In>=0.5 & In<1.5);  In(I1)=-ones(size(I1));
I2=find(In>=1.5 & In<2.5);  In(I2)=ones(size(I2));
I3=find(In>=2.5);           In(I3)=3*ones(size(I3));

I_yuan=[];
for i=1:length(In)
    if In(i) == 3
        I_yuan=[I_yuan,0,0];
    elseif In(i) == 1
        I_yuan=[I_yuan,0,1];
    elseif In(i) == -1
        I_yuan=[I_yuan,1,1];
    elseif In(i) == -3
        I_yuan=[I_yuan,1,0];
    end
end

%Q路分析

ymin=min(Qn);
ymax=max(Qn);
ymax=max([ymax abs(ymin)]);
ymin=-abs(ymax);
Qn=(Qn-ymin)*3/(ymax-ymin);

%I路分析

I0=find(Qn< 0.5);           Qn(I0)=-3*ones(size(I0));
I1=find(Qn>=0.5 & Qn<1.5);  Qn(I1)=-1*ones(size(I1));
I2=find(Qn>=1.5 & Qn<2.5);  Qn(I2)=ones(size(I2));
I3=find(Qn>=2.5);           Qn(I3)=3*ones(size(I3));

Q_yuan=[];
for i=1:length(Qn)
    if Qn(i) == 3
        Q_yuan=[Q_yuan,0,0];
    elseif Qn(i) == 1
        Q_yuan=[Q_yuan,0,1];
    elseif Qn(i) == -1
        Q_yuan=[Q_yuan,1,1];
    elseif Qn(i) == -3
        Q_yuan=[Q_yuan,1,0];
    end
end

code=[];
%将I路码元输送到奇数位置上,将Q路码元输送到偶数位置上
for n=1:N
    if mod(n,2)~=0
        code = [code, I_yuan((n+1)/2)];
    else
        code = [code, Q_yuan(n/2)];
    end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%计算误码率
numoferr=0;
for i=1:N
    if code(i) ~= wave_in(i)
        numoferr = numoferr+l;
    end
end
Pe=numoferr/N;                  %统计误码率
fprintf('误码率为:%d\n',Pe);
toc;

实现效果:


 

参考文献:

移动通信16QAM调制及解调仿真程序 (renrendoc.com)

(99条消息) 通信原理与MATLAB(十一):QAM的调制解调_qam调制_菜yuan~的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值