16QAM-星形和矩形星座图调制解调MATLAB代码

合集下载

MATLAB环境下16QAM调制及解调仿真程序说明

MATLAB环境下16QAM调制及解调仿真程序说明

MATLAB环境下16QAM调制及解调仿真程序说明一、正交调制及相干解调原理框图正交调制原理框图相干解调原理框图二、MQAM调制介绍及本仿真程序的几点说明MQAM可以用正交调制的方法产生,本仿真中取M=16,即幅度和相位相结合的16个信号点的调制。

为了观察信道噪声对该调制方式的影响,我们在已调信号中又加入了不同强度的高斯白噪声,并统计其译码误码率。

为了简化程序和得到可靠的误码率,我们在解调时并未从已调信号中恢复载波,而是直接产生与调制时一模一样的载波来进行信号解调。

三、仿真结果图附源程序代码:clear;clc;echo off;close all;N=10000; %设定码元数量fb=1; %基带信号频率fs=32; %抽样频率fc=4; %载波频率,为便于观察已调信号,我们把载波频率设的较低Kbase=2; % Kbase=1,不经基带成形滤波,直接调制;% Kbase=2,基带经成形滤波器滤波后,再进行调制info=random_binary(N); %产生二进制信号序列[y,I,Q]=qam(info,Kbase,fs,fb,fc); %对基带信号进行16QAM调制y1=y; y2=y; %备份信号,供后续仿真用T=length(info)/fb; m=fs/fb; nn=length(info);dt=1/fs; t=0:dt:T-dt;subplot(211);%便于观察,这里显示的已调信号及其频谱均为无噪声干扰的理想情况%由于测试信号码元数量为10000个,在这里我们只显示其总数的1/10plot(t(1:1000),y(1:1000),t(1:1000),I(1:1000),t(1:1000),Q(1:1000),[0 35],[0 0],'b:'); title('已调信号(In:red,Qn:green)');%傅里叶变换,求出已调信号的频谱n=length(y); y=fft(y)/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;subplot(223);plot(f,y,'r');grid on;title('已调信号频谱'); xlabel('f/fb');%画出16QAM调制方式对应的星座图subplot(224);constel(y1,fs,fb,fc); title('星座图');SNR_in_dB=8:2:24; %AWGN信道信噪比for j=1:length(SNR_in_dB)y_add_noise=awgn(y2,SNR_in_dB(j)); %加入不同强度的高斯白噪声y_output=qamdet(y_add_noise,fs,fb,fc); %对已调信号进行解调 numoferr=0;for i=1:Nif (y_output(i)~=info(i)),numoferr=numoferr+1;end;end;Pe(j)=numoferr/N; %统计误码率end;figure;semilogy(SNR_in_dB,Pe,'red*-');grid on;xlabel('SNR in dB');ylabel('Pe');title('16QAM调制在不同信道噪声强度下的误码率');%产生二进制信源随机序列function [info]=random_binary(N)if nargin == 0, %如果没有输入参数,则指定信息序列为10000个码元 N=10000;end;for i=1:N,temp=rand;if (temp<,info(i)=0; % 1/2的概率输出为0elseinfo(i)=1; % 1/2的概率输出为1endend;function [y,I,Q]=qam(x,Kbase,fs,fb,fc);%T=length(x)/fb; m=fs/fb; nn=length(x);dt=1/fs; t=0:dt:T-dt;%串/并变换分离出I分量、Q分量,然后再分别进行电平映射I=x(1:2:nn-1); [I,In]=two2four(I,4*m);Q=x(2:2:nn); [Q,Qn]=two2four(Q,4*m);if Kbase==2; %基带成形滤波I=bshape(I,fs,fb/4); Q=bshape(Q,fs,fb/4);end;y=I.*cos(2*pi*fc*t)-Q.*sin(2*pi*fc*t); %调制%QAM信号解调function [xn,x]=qamdet(y,fs,fb,fc);dt=1/fs; t=0:dt:(length(y)-1)*dt;I=y.*cos(2*pi*fc*t);Q=-y.*sin(2*pi*fc*t);[b,a]=butter(2,2*fb/fs); %设计巴特沃斯滤波器I=filtfilt(b,a,I);Q=filtfilt(b,a,Q);m=4*fs/fb; N=length(y)/m; n=(.6:1:N)*m; n=fix(n);In=I(n); Qn=Q(n); xn=four2two([In Qn]);%I分量Q分量并/串转换,最终恢复成码元序列xnnn=length(xn); xn=[xn(1:nn/2);xn(nn/2+1:nn)]; xn=xn(:); xn=xn';%基带升余弦成形滤波器function y=bshape(x,fs,fb,N,alfa,delay);%设置默认参数if nargin<6; delay=8; end;if nargin<5; alfa=; end;if nargin<4; N=16; end;b=firrcos(N,fb,2*alfa*fb,fs);y=filter(b,1,x);%二进制转换成四进制function [y,yn]=two2four(x,m);T=[0 1;3 2]; n=length(x); ii=1;for i=1:2:n-1;xi=x(i:i+1)+1;yn(ii)=T(xi(1),xi(2));ii=ii+1;end;yn=; y=yn;for i=1:m-1;y=[y;yn];end;y=y(:)'; %映射电平分别为;;;%四进制转换成二进制function xn=four2two(yn);y=yn; ymin=min(y); ymax=max(y); ymax=max([ymax abs(ymin)]); ymin=-abs(ymax); yn=(y-ymin)*3/(ymax-ymin);%设置门限电平,判决I0=find(yn< ; yn(I0)=zeros(size(I0));I1=find(yn>= & yn<; yn(I1)=ones(size(I1));I2=find(yn>= & yn<; yn(I2)=ones(size(I2))*2;I3=find(yn>=; yn(I3)=ones(size(I3))*3;%一位四进制码元转换为两位二进制码元T=[0 0;0 1;1 1;1 0]; n=length(yn);for i=1:n;xn(i,:)=T(yn(i)+1,:);end;xn=xn'; xn=xn(:); xn=xn';%画出星座图function c=constel(x,fs,fb,fc);N=length(x); m=2*fs/fb; n=fs/fc; i1=m-n; i=1; ph0=(i1-1)*2*pi/n; while i <= N/m;xi=x(i1:i1+n-1);y=2*fft(xi)/n; c(i)=y(2);i=i+1; i1=i1+m;end;%如果无输出,则作图if nargout<1;cmax=max(abs(c));ph=(0:5:360)*pi/180;plot*cos(ph),*sin(ph),'c');hold on;for i=1:length(c);ph=ph0-angle(c(i));a=abs(c(i))/cmax*;plot(a*cos(ph),a*sin(ph),'r*'); end;plot([ ],[0 0],'k:',[0 0],[ ],'k:'); hold off; axis equal; axis([ ]); end;。

MATLAB环境下16QAM调制及解调仿真程序说明

MATLAB环境下16QAM调制及解调仿真程序说明

创作编号:BG7531400019813488897SX创作者:别如克*姓名:NikeyMATLAB环境下16QAM调制及解调仿真程序说明一、正交调制及相干解调原理框图正交调制原理框图相干解调原理框图二、MQAM调制介绍及本仿真程序的几点说明MQAM可以用正交调制的方法产生,本仿真中取M=16,即幅度和相位相结合的16个信号点的调制。

为了观察信道噪声对该调制方式的影响,我们在已调信号中又加入了不同强度的高斯白噪声,并统计其译码误码率。

为了简化程序和得到可靠的误码率,我们在解调时并未从已调信号中恢复载波,而是直接产生与调制时一模一样的载波来进行信号解调。

三、仿真结果图附源程序代码:main_plot.mclear;clc;echo off;close all;N=10000; %设定码元数量fb=1; %基带信号频率fs=32; %抽样频率fc=4; %载波频率,为便于观察已调信号,我们把载波频率设的较低Kbase=2; % Kbase=1,不经基带成形滤波,直接调制;% Kbase=2,基带经成形滤波器滤波后,再进行调制info=random_binary(N); %产生二进制信号序列[y,I,Q]=qam(info,Kbase,fs,fb,fc); %对基带信号进行16QAM调制y1=y; y2=y; %备份信号,供后续仿真用T=length(info)/fb; m=fs/fb; nn=length(info);dt=1/fs; t=0:dt:T-dt;subplot(211);%便于观察,这里显示的已调信号及其频谱均为无噪声干扰的理想情况%由于测试信号码元数量为10000个,在这里我们只显示其总数的1/10plot(t(1:1000),y(1:1000),t(1:1000),I(1:1000),t(1:1000),Q(1:1000),[0 35],[0 0],'b:');title('已调信号(In:red,Qn:green)');%傅里叶变换,求出已调信号的频谱n=length(y); y=fft(y)/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;subplot(223);plot(f,y,'r');grid on;title('已调信号频谱'); xlabel('f/fb');%画出16QAM调制方式对应的星座图subplot(224);constel(y1,fs,fb,fc); title('星座图');SNR_in_dB=8:2:24; %AWGN信道信噪比for j=1:length(SNR_in_dB)y_add_noise=awgn(y2,SNR_in_dB(j)); %加入不同强度的高斯白噪声y_output=qamdet(y_add_noise,fs,fb,fc); %对已调信号进行解调numoferr=0;for i=1:Nif (y_output(i)~=info(i)),创作编号:BG7531400019813488897SX创作者:别如克*numoferr=numoferr+1;end;end;Pe(j)=numoferr/N; %统计误码率end;figure;semilogy(SNR_in_dB,Pe,'red*-');grid on;xlabel('SNR in dB');ylabel('Pe');title('16QAM调制在不同信道噪声强度下的误码率');random_binary.m%产生二进制信源随机序列function [info]=random_binary(N)if nargin == 0, %如果没有输入参数,则指定信息序列为10000个码元N=10000;end;for i=1:N,temp=rand;if (temp<0.5),info(i)=0; % 1/2的概率输出为0elseinfo(i)=1; % 1/2的概率输出为1endend;qam.mfunction [y,I,Q]=qam(x,Kbase,fs,fb,fc);%T=length(x)/fb; m=fs/fb; nn=length(x);dt=1/fs; t=0:dt:T-dt;%串/并变换分离出I分量、Q分量,然后再分别进行电平映射I=x(1:2:nn-1); [I,In]=two2four(I,4*m);Q=x(2:2:nn); [Q,Qn]=two2four(Q,4*m);if Kbase==2; %基带成形滤波I=bshape(I,fs,fb/4); Q=bshape(Q,fs,fb/4);end;y=I.*cos(2*pi*fc*t)-Q.*sin(2*pi*fc*t); %调制qamdet.m%QAM信号解调function [xn,x]=qamdet(y,fs,fb,fc);dt=1/fs; t=0:dt:(length(y)-1)*dt;I=y.*cos(2*pi*fc*t);Q=-y.*sin(2*pi*fc*t);[b,a]=butter(2,2*fb/fs); %设计巴特沃斯滤波器I=filtfilt(b,a,I);Q=filtfilt(b,a,Q);m=4*fs/fb; N=length(y)/m; n=(.6:1:N)*m; n=fix(n);In=I(n); Qn=Q(n); xn=four2two([In Qn]);%I分量Q分量并/串转换,最终恢复成码元序列xnnn=length(xn); xn=[xn(1:nn/2);xn(nn/2+1:nn)];xn=xn(:); xn=xn';bshape.m%基带升余弦成形滤波器function y=bshape(x,fs,fb,N,alfa,delay);%设置默认参数if nargin<6; delay=8; end;if nargin<5; alfa=0.5; end;if nargin<4; N=16; end;b=firrcos(N,fb,2*alfa*fb,fs);y=filter(b,1,x);two2four.m创作编号:BG7531400019813488897SX创作者:别如克*%二进制转换成四进制function [y,yn]=two2four(x,m);T=[0 1;3 2]; n=length(x); ii=1;for i=1:2:n-1;xi=x(i:i+1)+1;yn(ii)=T(xi(1),xi(2));ii=ii+1;end;yn=yn-1.5; y=yn;for i=1:m-1;y=[y;yn];end;y=y(:)'; %映射电平分别为-1.5;0.5;0.5;1.5four2two.m%四进制转换成二进制function xn=four2two(yn);y=yn; ymin=min(y); ymax=max(y); ymax=max([ymax abs(ymin)]);ymin=-abs(ymax); yn=(y-ymin)*3/(ymax-ymin);%设置门限电平,判决I0=find(yn< 0.5); yn(I0)=zeros(size(I0));I1=find(yn>=0.5 & yn<1.5); y n(I1)=ones(size(I1));I2=find(yn>=1.5 & yn<2.5); y n(I2)=ones(size(I2))*2;I3=find(yn>=2.5); yn(I3)=ones(size(I3))*3;%一位四进制码元转换为两位二进制码元T=[0 0;0 1;1 1;1 0]; n=length(yn);for i=1:n;xn(i,:)=T(yn(i)+1,:);end;xn=xn'; xn=xn(:); xn=xn';constel.m%画出星座图function c=constel(x,fs,fb,fc);N=length(x); m=2*fs/fb; n=fs/fc;i1=m-n; i=1; ph0=(i1-1)*2*pi/n;while i <= N/m;xi=x(i1:i1+n-1);y=2*fft(xi)/n; c(i)=y(2);i=i+1; i1=i1+m;end;%如果无输出,则作图if nargout<1;cmax=max(abs(c));ph=(0:5:360)*pi/180;plot(1.414*cos(ph),1.414*sin(ph),'c');hold on;for i=1:length(c);ph=ph0-angle(c(i));a=abs(c(i))/cmax*1.414;plot(a*cos(ph),a*sin(ph),'r*');end;plot([-1.5 1.5],[0 0],'k:',[0 0],[-1.5 1.5],'k:');hold off; axis equal; axis([-1.5 1.5 -1.5 1.5]);end;创作编号:BG7531400019813488897SX创作者:别如克*。

16QAM-星形和矩形星座图调制解调MATLAB代码

16QAM-星形和矩形星座图调制解调MATLAB代码

%% ------------------------------------------------------------% 软件无线电课程设计%% 方形、星形16QAM调制解调仿真%%%------------------------------------------------------------%%主程序clcclear%% 定义参数fd=250*10^6; %码元速率250Mfs=2500*10^6; %滤波器采样率fc=2500*10^6; %载波频率2.5Gf=10000*10^6; %对载波采样data_len=200000; %数据长度sym_len=data_len/4; %码元序列长度M_QAM=16;%QAM数k=log2(M_QAM);SNR=1:12;%白噪声信噪比,%% ------------------------------------------------------------bit_tx=randint(1,data_len);%产生随机序列echo off;rec_qam16=QamMod(bit_tx,16); %方形16QAM调制star_qam16=SrarQamMod(bit_tx); %星形16QAM调制base_rec=base_shape(fd,fs,f,rec_qam16); %基带成型滤波base_star=base_shape(fd,fs,f,star_qam16); %基带成型滤波for i=1:length(SNR) %信噪比从1dB到12dB计算误码率SNR_=i%方形映射16QAMrf_rec_qam16=CarrierMod(fc,f,base_rec); %载波调制rf_rec_qam16_n=awgn(rf_rec_qam16,SNR(i),'measured'); %加噪声[rec_qam16_rx base_rec_rx]=CarrierDemod(fd,fs,fc,f,rf_rec_qam16_n); %载波解调bit_rec_rx=QamDemod(rec_qam16_rx,16); %MQAM解调[num_qam16,perr_qam16_rec(i)]=biterr(bit_tx,bit_rec_rx);%误码率qam16_data_rec(i,:)=rec_qam16_rx;%scatterplot(rec_qam16_rx);%星形映射16QAMrf_star_qam16=CarrierMod(fc,f,base_star); %载波调制rf_star_qam16_n=awgn(rf_star_qam16,SNR(i),'measured'); %加噪声[star_qam16_rx base_star_rx]=CarrierDemod(fd,fs,fc,f,rf_star_qam16_n); %载波解调bit_star_rx=StarQamDemod(star_qam16_rx); %MQAM解调[num_qam16,perr_qam16_star(i)]=biterr(bit_tx,bit_star_rx);%误码率qam16_data_star(i,:)=star_qam16_rx;%scatterplot(star_qam16_rx);end%% 理论误码率计算SNRtheo=0:0.1:length(SNR);for i=1:length(SNRtheo)SNRdec=10.^(SNRtheo(i)/10);theo_perr_qam16(i)=(3/8)*erfc(sqrt(SNRdec*2/5));end%% 基带波形N=200;n=1:N;t=1:N*10;%发送端波形figure;stem(n,bit_tx(n)); title('发送序列'); %发送序列figure('Name','发送端基带信号');subplot(411);plot(t,real(base_rec(t))); title('方形映射-Q路');subplot(412);plot(t,imag(base_rec(t))); title('方形映射-I路');subplot(413);plot(t,real(base_star(t))); title('星形映射-Q路');subplot(414);plot(t,imag(base_star(t))); title('星形映射-I路');%接收端波形figure;subplot(211);stem(n,bit_rec_rx(n)); title('方形接收序列');subplot(212);stem(n,bit_star_rx(n)); title('星形接收序列');figure('Name','接收端基带信号');subplot(411);plot(t,real(base_rec_rx(t))); title('方形映射-Q路');subplot(412);plot(t,imag(base_rec_rx(t))); title('方形映射-I路');subplot(413);plot(t,real(base_star_rx(t))); title('星形映射-Q路');subplot(414);plot(t,imag(base_star_rx(t))); title('星形映射-I路');%基带眼图N1=20000;Tn=f/fd;eye_rex=base_rec(1:N1);eyediagram(eye_rex,Tn*4,Tn); title('方形基带眼图');eye_star=base_star(1:N1);eyediagram(eye_star,Tn*4,Tn); title('星形基带眼图');%% 接收端星座图%scatterplot(qam16_data_rec(12,:));figure('Name','方形16QAM接收端星座图');for i=3:3:12subplot(2,2,i/3);plot(real(qam16_data_rec(i,:)),imag(qam16_data_rec(i,:)),'.');xmax=5;axis([-xmax xmax -xmax xmax])title(['Snr=',num2str(SNR(i)),' dB']);endfigure('Name','星形16QAM接收端星座图');for i=3:3:12subplot(2,2,i/3);plot(real(qam16_data_star(i,:)),imag(qam16_data_star(i,:)),'.');xmax=3;axis([-xmax xmax -xmax xmax])grid on; title(['Snr=',num2str(SNR(i)),' dB']);end%% 功率谱密度f_plot;%% 误码率分析%16QAM误码率曲线figure('Name','16QAM误码性能对比');% semilogy(SNRtheo,theo_perr_qam16);% hold on;semilogy(SNR,perr_qam16_rec,'*');hold on;semilogy(SNR,perr_qam16_star,'o');xlabel('SNR in dB');ylabel('Prb of Err');legend('方形16QAM','星形16QAM');title('16QAM误码性能对比');%------------------------------------------------------------------------------- %% 基带成型function base_info=base_shape(fd,fs,f,seq_16QAM)%平方根升余弦滤波器,滚降系数0.5,延迟3个采样点flt=rcosine(fd,fs,'sqrt',0.5);%I路和Q路seq_Q=real(seq_16QAM);seq_I=imag(seq_16QAM);%增采样R=fs/fd;up_seq_Q=upsample(seq_Q,R);up_seq_I=upsample(seq_I,R);%升余弦调制rcos_Q=conv(up_seq_Q,flt);rcos_I=conv(up_seq_I,flt);%提升rcos_Q_up=interp(rcos_Q,f/fs);rcos_I_up=interp(rcos_I,f/fs);base_info=rcos_Q_up+j*rcos_I_up;%--------------------------------------------------------------------%% 载波解调function [data_rx base_rx]=CarrierDemod(fd,fs,fc,f,receive)%% 分两路乘正交高频载波rc_length=length(receive);flt=rcosine(fd,fs,'sqrt',0.5);t=0:rc_length-1;rc_Q=receive .* sin(2*pi*fc*t/f);rc_I=receive .* cos(2*pi*fc*t/f);%减采样后根升余弦匹配滤波,注意对齐采样点down_Q=downsample([0 rc_Q],f/fs);down_I=downsample(rc_I,f/fs);low_Q_rcos=conv(down_Q,flt);low_I_rcos=conv(down_I,flt);base_rx=low_Q_rcos(1:length(low_I_rcos))+j*low_I_rcos;%两次根升余弦滤波延迟,定位初始信号位置%delay+1:end-delay-1R=fs/fd;delay=3*R*2;rc_Q_seq=(downsample(low_Q_rcos(delay+1:end-delay-1),R));rc_I_seq=(downsample(low_I_rcos(delay+1:end-delay-1),R)); %类型转换data_rx=rc_Q_seq+j*rc_I_seq;%--------------------------------------------------------------------------%% 载波调制function transmit=CarrierMod(fc,f,base)%载波调制t=0:length(base)-1;high_freq_Q=real(base) .* sin(2*pi*fc*t/f);high_freq_I=imag(base) .* cos(2*pi*fc*t/f);transmit=high_freq_Q+high_freq_I;%------------------------------------------------------------------------------%% QAM解调程序,将MQAM码元还原为二进制数据% 入口参数:data_QAM:QAM码元数据% M_QAM:MQAM中M的大小% 出口参数:二进制数据比特流%------------------------------------------------------------------------function data_out=QamDemod(data_QAM,M_QAM)k=log2(M_QAM);%每个M进制码元的bit数data_len=length(data_QAM);%码元长度%-------------------------------------------------------------------%QAM信号放缩至与发送端相同比例data_temp=data_QAM(find(real(data_QAM>0)));aver=mean(real(data_temp));data_Qam_temp=data_QAM/aver*(2^(k/2-1));%------------------------------------------------------------------------%平移到第一象限data_Qam_temp2=(data_Qam_temp+(2^(k/2)-1)*(1+j))/2;%----------------------------------------------------------------------%将实部虚部分别映射为二进制数据%实部data_real=round(real(data_Qam_temp2));%实部判决data_real(find(data_real>(2^(k/2)-1)))=2^(k/2)-1;%大于2^(k/2)-1的数据判定为2^(k/2)-1 data_real(find(data_real<0))=0;%小于0的数据判为0bit_real=abs(dec2bin(data_real))-'0';%虚部data_imag=round(imag(data_Qam_temp2));%虚部判决data_imag(find(data_imag>(2^(k/2)-1)))=2^(k/2)-1;%大于2^(k/2)-1的数据判定为2^(k/2)-1 data_imag(find(data_imag<0))=0;%小于0的数据判为0bit_imag=abs(dec2bin(data_imag))-'0';%------------------------------------------------------------------------%还原为二进制比特流bit_rec=[bit_real,bit_imag]';data_out=reshape(bit_rec,1,data_len*k);%-------------------------------------------------------------------------------------------------------------%% QAM调制程序,实现二进制到MQam调制% 入口参数:binary:二进制数据% M_QAM:MQAM中M的大小% 返回参数:MQAM码元%------------------------------------------------------------------------function data_M = QamMod(binary,M_QAM)k=log2(M_QAM);%每个M进制码元的bit数data_len=length(binary);%比特长度binary_rec=reshape(binary,k,data_len/k)';%转化为data_len/k行,k列,的矩阵,以便转化为16进制M进制%计算实部data_str1=num2str(binary_rec(:,1:k/2));data_m_real=bin2dec(data_str1);%计算虚部data_str2=num2str(binary_rec(:,k/2+1:k));data_m_imag=bin2dec(data_str2);%实部虚部映射到MQamdata_M=((data_m_real*2-2^(k/2)+1)+j*(data_m_imag*2-2^(k/2)+1)).';%---------------------------------------------------------------------------------%% 星形16QAM映射function data_m16 = SrarQamMod(binary)%binary=randint(1,100);%产生随机序列data_len=length(binary);%比特长度binary_rec=reshape(binary,4,data_len/4)';%转化为data_len/4行,4列,的矩阵,以便转化为16进制data_str=num2str(binary_rec);data_dec=bin2dec(data_str);data_mm16=(floor(data_dec/8)+1).*exp(j*45/180*pi*mod(data_dec,8));data_m16=reshape(data_mm16,1,data_len/4);%------------------------------------------------------------------------------%% 星形16QAM解调function data_bit = StarQamDemod(qam_rev)%qam_rev=xing_qam16_noise(1:10);am=abs(qam_rev);%幅度判定am(find(am>2))=2;%幅度大于2的判定为2am(find(am<1.5))=1;%幅度大于2的判定为2%相位判定ang=angle(qam_rev)/pi*180;%将-180度到0度变为180度到360度ang(find(ang<0))=ang(find(ang<0))+360;ang_n=round(ang/45);ang_n(find(ang_n>7))=0;data_dec=8*(round(am)-1)+ang_n;%data_dec(find(data_dec>15))=15;%大于15的判定为15%data_dec(find(data_dec<0))=0;%小于0的判定为0data_bit_rec=dec2bin(data_dec);data_bit=reshape(data_bit_rec',1,length(qam_rev)*4)-'0';。

16QAM仿真代码(matlab)(可编辑修改word版)

16QAM仿真代码(matlab)(可编辑修改word版)

% 16QAM 系统仿真function [ ber_AWGN,ber_Ray] = M16QAM()EbN0dB=1:3:30;EbN0dB1=1:10;N=4*100000;for ii=1:length(EbN0dB)sigma2(ii)=2.5/(2*4*(10^(EbN0dB(ii)/10)));sigma21(ii)=2.5/(2*4*(10^(EbN0dB1(ii)/10)));bits=randint(1,N);%调制s=M16QAM_modulate(bits,length(bits(:)));% Rayleign信道干扰noise=sqrt(sigma2(ii))*( randn(1,N/4)+ 1i*randn(1,N/4) );h= sqrt(0.5)*(randn(1,N/4) + 1i*randn(1,N/4) );receiver=s.*h+noise; %Rayleign 衰减信道% 高斯信道干扰noise1=sqrt(sigma21(ii))*( randn(1,N/4)+ 1i*randn(1,N/4) );receiver1=s+noise1; %高斯信道% 信道均衡receiver = receiver./h;%解调并计算误码率Rayleign信道demodata = M16QAM_demodulate( receiver,length(receiver(:)) );errCount=sum(abs(bits-demodata));ber_Ray(ii)=errCount/N;%解调并计算误码率高斯信道demodata = M16QAM_demodulate( receiver1,length(receiver1(:)) );errCount=sum(abs(bits-demodata));ber_AWGN(ii)=errCount/N;endend% 16QAM 调制function [ s ] = M16QAM_modulate( bits,N)ii=0;for i=1:4:Nii=ii+1;if bits(i)==0&&bits(i+1)==0&&bits(i+2)==0&&bits(i+3)==0s(ii)=sqrt(2)/2*exp(1i*pi/4);elseif bits(i)==1&&bits(i+1)==0&&bits(i+2)==0&&bits(i+3)==0s(ii)=sqrt(2)/2*exp(1i*3*pi/4);elseif bits(i)==1&&bits(i+1)==0&&bits(i+2)==1&&bits(i+3)==0s(ii)=sqrt(2)/2*exp(1i*5*pi/4);elseif bits(i)==0&&bits(i+1)==0&&bits(i+2)==1&&bits(i+3)==0s(ii)=sqrt(2)/2*exp(1i*7*pi/4);elseif bits(i)==0&&bits(i+1)==1&&bits(i+2)==0&&bits(i+3)==0s(ii)=sqrt(10)/2*exp(1i*atan(1/3));elseif bits(i)==0&&bits(i+1)==0&&bits(i+2)==0&&bits(i+3)==1s(ii)=sqrt(10)/2*exp(1i*atan(3));elseif bits(i)==1&&bits(i+1)==0&&bits(i+2)==0&&bits(i+3)==1s(ii)=sqrt(10)/2*exp(1i*(atan(1/3)+pi/2));elseif bits(i)==1&&bits(i+1)==1&&bits(i+2)==0&&bits(i+3)==0s(ii)=sqrt(10)/2*exp(1i*(pi-atan(1/3)));elseif bits(i)==1&&bits(i+1)==1&&bits(i+2)==1&&bits(i+3)==0s(ii)=sqrt(10)/2*exp(1i*(atan(1/3)+pi));elseif bits(i)==1&&bits(i+1)==0&&bits(i+2)==1&&bits(i+3)==1s(ii)=sqrt(10)/2*exp(1i*(3*pi/2-atan(1/3)));elseif bits(i)==0&&bits(i+1)==0&&bits(i+2)==1&&bits(i+3)==1s(ii)=sqrt(10)/2*exp(1i*(atan(1/3)+3*pi/2));elseif bits(i)==0&&bits(i+1)==1&&bits(i+2)==1&&bits(i+3)==0s(ii)=sqrt(10)/2*exp(1i*(2*pi-atan(1/3)));elseif bits(i)==0&&bits(i+1)==1&&bits(i+2)==0&&bits(i+3)==1s(ii)=sqrt(2)*3/2*exp(1i*pi/4);elseif bits(i)==1&&bits(i+1)==1&&bits(i+2)==0&&bits(i+3)==1s(ii)=sqrt(2)*3/2*exp(1i*3*pi/4);elseif bits(i)==1&&bits(i+1)==1&&bits(i+2)==1&&bits(i+3)==1s(ii)=sqrt(2)*3/2*exp(1i*5*pi/4);elseif bits(i)==0&&bits(i+1)==1&&bits(i+2)==1&&bits(i+3)==1s(ii)=sqrt(2)*3/2*exp(1i*7*pi/4);endendend% 16 QAM 解调function [ demodata ] = M16QAM_demodulate( receiver ,N)A=[0 1 0 1; -1 0 0 1;-1 0 -1 0;0 1 -1 0;1 inf 0 1;0 1 1 inf;-1 0 1 inf;-inf -1 0 1;-inf -1 -1 0;-1 0 -inf -1;0 1 -inf -1;1 inf -1 0;1 inf 1 inf;-inf -1 1 inf;-inf -1 -inf -1;1 inf -inf -1];for k=1:Nif (real(receiver(k))>=A(1,1))&&(real(receiver(k))<A(1,2))&&...(imag(receiver(k))>=A(1,3))&&(imag(receiver(k))<A(1,4)) demodata(k*4-3)=0;demodata(k*4-2)=0;demodata(k*4-1)=0;demodata(k*4)=0;elseif (real(receiver(k))>=A(2,1))&&(real(receiver(k))<A(2,2))...&&(imag(receiver(k))>=A(2,3))&&(imag(receiver(k))<A(2,4)) demodata(k*4-3)=1;demodata(k*4-1)=0;demodata(k*4)=0;elseif (real(receiver(k))>=A(3,1))&&(real(receiver(k))<A(3,2))...&&(imag(receiver(k))>=A(3,3))&&(imag(receiver(k))<A(3,4)) demodata(k*4-3)=1;demodata(k*4-2)=0;demodata(k*4-1)=1;demodata(k*4)=0;elseif (real(receiver(k))>=A(4,1))&&(real(receiver(k))<A(4,2))...&&(imag(receiver(k))>=A(4,3))&&(imag(receiver(k))<A(4,4)) demodata(k*4-3)=0;demodata(k*4-2)=0;demodata(k*4-1)=1;demodata(k*4)=0;elseif (real(receiver(k))>=A(5,1))&&(real(receiver(k))<A(5,2))...&&(imag(receiver(k))>=A(5,3))&&(imag(receiver(k))<A(5,4)) demodata(k*4-3)=0;demodata(k*4-2)=1;demodata(k*4-1)=0;demodata(k*4)=0;elseif (real(receiver(k))>=A(6,1))&&(real(receiver(k))<A(6,2))...&&(imag(receiver(k))>=A(6,3))&&(imag(receiver(k))<A(6,4)) demodata(k*4-3)=0;demodata(k*4-2)=0;demodata(k*4-1)=0;demodata(k*4)=1;elseif (real(receiver(k))>=A(7,1))&&(real(receiver(k))<A(7,2))...&&(imag(receiver(k))>=A(7,3))&&(imag(receiver(k))<A(7,4)) demodata(k*4-3)=1;demodata(k*4-2)=0;demodata(k*4-1)=0;demodata(k*4)=1;elseif (real(receiver(k))>=A(8,1))&&(real(receiver(k))<A(8,2))...&&(imag(receiver(k))>=A(8,3))&&(imag(receiver(k))<A(8,4)) demodata(k*4-3)=1;demodata(k*4-2)=1;demodata(k*4-1)=0;demodata(k*4)=0;elseif (real(receiver(k))>=A(9,1))&&(real(receiver(k))<A(9,2))...&&(imag(receiver(k))>=A(9,3))&&(imag(receiver(k))<A(9,4)) demodata(k*4-3)=1;demodata(k*4-2)=1;demodata(k*4)=0;elseif (real(receiver(k))>=A(10,1))&&(real(receiver(k))<A(10,2))...&&(imag(receiver(k))>=A(10,3))&&(imag(receiver(k))<A(10,4)) demodata(k*4-3)=1;demodata(k*4-2)=0;demodata(k*4-1)=1;demodata(k*4)=1;elseif (real(receiver(k))>=A(11,1))&&(real(receiver(k))<A(11,2))...&&(imag(receiver(k))>=A(11,3))&&(imag(receiver(k))<A(11,4)) demodata(k*4-3)=0;demodata(k*4-2)=0;demodata(k*4-1)=1;demodata(k*4)=1;elseif (real(receiver(k))>=A(12,1))&&(real(receiver(k))<A(12,2))...&&(imag(receiver(k))>=A(12,3))&&(imag(receiver(k))<A(12,4)) demodata(k*4-3)=0;demodata(k*4-2)=1;demodata(k*4-1)=1;demodata(k*4)=0;elseif (real(receiver(k))>=A(13,1))&&(real(receiver(k))<A(13,2))...&&(imag(receiver(k))>=A(13,3))&&(imag(receiver(k))<A(13,4)) demodata(k*4-3)=0;demodata(k*4-2)=1;demodata(k*4-1)=0;demodata(k*4)=1;elseif (real(receiver(k))>=A(14,1))&&(real(receiver(k))<A(14,2))...&&(imag(receiver(k))>=A(14,3))&&(imag(receiver(k))<A(14,4)) demodata(k*4-3)=1;demodata(k*4-2)=1;demodata(k*4-1)=0;demodata(k*4)=1;elseif (real(receiver(k))>=A(15,1))&&(real(receiver(k))<A(15,2))...&&(imag(receiver(k))>=A(15,3))&&(imag(receiver(k))<A(15,4)) demodata(k*4-3)=1;demodata(k*4-2)=1;demodata(k*4-1)=1;demodata(k*4)=1;elseif (real(receiver(k))>=A(16,1))&&(real(receiver(k))<A(16,2))...&&(imag(receiver(k))>=A(16,3))&&(imag(receiver(k))<A(16,4)) demodata(k*4-3)=0;demodata(k*4-2)=1;demodata(k*4-1)=1;demodata(k*4)=1;end endend。

MATLAB环境下16QAM调制与解调仿真程序说明

MATLAB环境下16QAM调制与解调仿真程序说明

姓名: NikeyMATLAB环境下16QAM调制及解调仿真程序说明一、正交调制及相干解调原理框图基带信号x串并转换In电平映射成形滤波Xcoswt载波发生器已调信号 y+90度相移Qn-sinwt已调信号yEPF电平映射成形滤波X正交调制原理框图InX LPF抽样判决coswt并恢复信号 x串载波恢复时钟恢复转换90度相移-sinwtQnX LPF抽样判决相干解调原理框图二、MQAM 调制介绍及本仿真程序的几点说明MQAM 可以用正交调制的方法产生,本仿真中取M=16,即幅度和相位相结合的16个信号点的调制。

为了观察信道噪声对该调制方式的影响,我们在已调信号中又加入了不同强度的高斯白噪声,并统计其译码误码率。

为了简化程序和得到可靠的误码率,我们在解调时并未从已调信号中恢复载波,而是直接产生与调制时一模一样的载波来进行信号解调。

三、仿真结果图附源程序代码:main_plot.mclear;clc;echo off;close all;N=10000;% 设定码元数量fb=1;%基带信号频率fs=32;% 抽样频率fc=4;%载波频率 ,为便于观察已调信号,我们把载波频率设的较低Kbase=2;% Kbase=1, 不经基带成形滤波,直接调制 ;% Kbase=2,基带经成形滤波器滤波后,再进行调制info=random_binary(N);% 产生二进制信号序列[y,I,Q]=qam(info,Kbase,fs,fb,fc);% 对基带信号进行 16QAM 调制y1=y; y2=y;% 备份信号,供后续仿真用T=length(info)/fb;m=fs/fb;nn=length(info);dt=1/fs;t=0:dt:T-dt;subplot(211);%便于观察,这里显示的已调信号及其频谱均为无噪声干扰的理想情况%由于测试信号码元数量为 10000 个,在这里我们只显示其总数的1/10plot(t(1:1000),y(1:1000),t(1:1000),I(1:1000),t(1:1000),Q(1:1000),[0 35],[0 0],'b:');title(' 已调信号 (In:red,Qn:green)');%傅里叶变换,求出已调信号的频谱n=length(y);y=fft(y)/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;subplot(223);plot(f,y,'r');grid on;title(' 已调信号频谱 '); xlabel('f/fb');%画出 16QAM 调制方式对应的星座图subplot(224);constel(y1,fs,fb,fc);title(' 星座图 ');SNR_in_dB=8:2:24;%AWGN 信道信噪比for j=1:length(SNR_in_dB)y_add_noise=awgn(y2,SNR_in_dB(j)); %加入不同强度的高斯白噪声y_output=qamdet(y_add_noise,fs,fb,fc);% 对已调信号进行解调numoferr=0;for i=1:Nif (y_output(i)~=info(i)),numoferr=numoferr+1;end;end;Pe(j)=numoferr/N;% 统计误码率end;figure;semilogy(SNR_in_dB,Pe,'red*-');grid on;xlabel('SNR in dB');ylabel('Pe');title('16QAM调制在不同信道噪声强度下的误码率');random_binary.m%产生二进制信源随机序列function [info]=random_binary(N)if nargin == 0,% 如果没有输入参数,则指定信息序列为10000 个码元N=10000;end;for i=1:N,temp=rand;if (temp<0.5),info(i)=0;% 1/2 的概率输出为0elseinfo(i)=1;% 1/2 的概率输出为1endend;qam.mfunction [y ,I,Q]=qam(x,Kbase,fs,fb,fc);%T=length(x)/fb;m=fs/fb;nn=length(x);dt=1/fs;t=0:dt:T-dt;%串/ 并变换分离出 I 分量、 Q 分量,然后再分别进行电平映射I=x(1:2:nn-1);[I,In]=two2four(I,4*m);Q=x(2:2:nn);[Q,Qn]=two2four(Q,4*m);if Kbase==2;I=bshape(I,fs,fb/4);% 基带成形滤波Q=bshape(Q,fs,fb/4);end;y=I.*cos(2*pi*fc*t)-Q.*sin(2*pi*fc*t);% 调制qamdet.m%QAM 信号解调function [xn,x]=qamdet(y ,fs,fb,fc);dt=1/fs; t=0:dt:(length(y)-1)*dt;I=y.*cos(2*pi*fc*t);Q=-y.*sin(2*pi*fc*t);[b,a]=butter(2,2*fb/fs);% 设计巴特沃斯滤波器I=filtfilt(b,a,I);Q=filtfilt(b,a,Q);m=4*fs/fb;N=length(y)/m;n=(.6:1:N)*m;n=fix(n);In=I(n);Qn=Q(n);xn=four2two([In Qn]);%I分量Q 分量并/串转换,最终恢复成码元序列xnnn=length(xn);xn=[xn(1:nn/2);xn(nn/2+1:nn)];xn=xn(:);xn=xn';bshape.m%基带升余弦成形滤波器function y=bshape(x,fs,fb,N,alfa,delay);%设置默认参数if nargin<6; delay=8;end;if nargin<5; alfa=0.5;end;if nargin<4; N=16;end;b=firrcos(N,fb,2*alfa*fb,fs);y=filter(b,1,x);two2four.m%二进制转换成四进制function [y ,yn]=two2four(x,m);T=[0 1;3 2];n=length(x); ii=1;for i=1:2:n-1;xi=x(i:i+1)+1;yn(ii)=T(xi(1),xi(2));ii=ii+1;end;yn=yn-1.5;y=yn;for i=1:m-1;y=[y;yn];end;y=y(:)'; % 映射电平分别为-1.5 ;0.5;0.5;1.5four2two.m%四进制转换成二进制function xn=four2two(yn);y=yn; ymin=min(y); ymax=max(y); ymax=max([ymax abs(ymin)]); ymin=-abs(ymax);yn=(y-ymin)*3/(ymax-ymin);% 设置门限电平,判决I0=find(yn< 0.5);I1=find(yn>=0.5 & yn<1.5); I2=find(yn>=1.5 & yn<2.5);yn(I0)=zeros(size(I0)); yn(I1)=ones(size(I1)); yn(I2)=ones(size(I2))*2;I3=find(yn>=2.5);yn(I3)=ones(size(I3))*3; %一位四进制码元转换为两位二进制码元T=[0 0;0 1;1 1;1 0]; n=length(yn);for i=1:n;xn(i,:)=T(yn(i)+1,:);end;xn=xn'; xn=xn(:);xn=xn';constel.m%画出星座图function c=constel(x,fs,fb,fc);N=length(x);m=2*fs/fb;n=fs/fc;i1=m-n; i=1;ph0=(i1-1)*2*pi/n;while i <= N/m;xi=x(i1:i1+n-1);y=2*fft(xi)/n;c(i)=y(2);i=i+1; i1=i1+m;end;%如果无输出,则作图if nargout<1;cmax=max(abs(c));ph=(0:5:360)*pi/180;plot(1.414*cos(ph),1.414*sin(ph),'c');hold on;for i=1:length(c);ph=ph0-angle(c(i));a=abs(c(i))/cmax*1.414;plot(a*cos(ph),a*sin(ph),'r*');end;plot([-1.5 1.5],[0 0],'k:',[0 0],[-1.5 1.5],'k:');hold off; axis equal;axis([-1.5 1.5 -1.5 1.5]); end;。

(完整版)16QAM调制与解调的MATLAB实现及调制性能分析

(完整版)16QAM调制与解调的MATLAB实现及调制性能分析

通信原理课程设计报告书课题名称 16QAM 调制与解调 的MATLAB 实现及调制性能分析姓 名学 号 学 院 通信与电子工程学院专 业 通信工程 指导教师李梦醒2012年 01 月 01日※※※※※※※※※ ※※ ※※ ※※2009级通信工程专业通信原理课程设计16QAM 调制与解调的MATLAB 实现及调制性能分析1 设计目的(1) 掌握16QAM 调制与解调的原理。

(2) 掌握星座图的原理并能熟悉星座图的应用。

(3) 熟悉并掌握MATLAB 的使用方法。

(4) 通过对16QAM 调制性能的分析了解16QAM 调制相对于其它调制方式的优缺点。

2 设计原理正交振幅调制(Quadrature Amplitude Modulation,QAM )是一种振幅和相位联合键控。

虽然MPSK 和MDPSK 等相移键控的带宽和功率方面都具有优势,即带宽占用小和比特噪声比要求低。

但是由图1可见,在MPSK 体制中,随着8/15π图 1 8PSK 信号相位M 的增大,相邻相位的距离逐渐减小,使噪声容限随之减小,误码率难于保证。

为了改善在M 大时的噪声容限,发展出了QAM 体制。

在QAM 体制中,信号的振幅和相位作为两个独立的参量同时受到调制。

这种信号的一个码元可以表示为0()cos() (1)k k k s t A t kT t k T ωθ=+<≤+ (2—1)式中:k=整数;k A 和k θ分别可以取多个离散值。

式(2—1)可以展开为00()cos cos sin sin k k k k k s t A t A t θωθω=- (2—2)8/5π8/3π8/π8/7π8/9π8/11π8/13π令 X k = A k cos θk , Y k = -A k sin θk 则式(2—1)变为00()cos sin k k k s t X t Y t ωω=+ (2—3)k X 和k Y 也是可以取多个离散的变量。

利用matlab实现16QAM调制

利用matlab实现16QAM调制

利用matlab实现16QAM调制一、随机信号的调制第一个示例描述以下问题:下表描述了解决此问题的关键任务和相应的通信工具箱函数,其中选择基带16QAM作为调制制式以及加性高斯白噪声(AWGN)作为信道模型。

问题解决方案:1.产生随机二进制数据序列。

在MATLAB中表示信号的常规格式是向量或者矩阵。

本示例中利用randint 函数来产生一个表示二进制数据序列连续值的列向量。

其中二进制数据序列的长度(即为列向量中的行数)设置为30,000。

下面的代码同时还绘制了数据序列的杆图(stem plot),用来显示数据的0、1值。

你所产生的图可能与次示例中的图有一点不一样,这是因为本示例中应用了随机数。

%% Setup% Define parameters.M = 16; % Size of signal constellationk = log2(M); % Number of bits per symboln = 3e4; % Number of bits to processnsamp = 1; % Oversampling rate%% Signal Source% Create a binary data stream as a column vector.x = randint(n,1); % Random binary data stream% Plot first 40 bits in a stem plot.stem(x(1:40),'filled');title('Random Bits');xlabel('Bit Index'); ylabel('Binary Value');2、准备调制modem.qammod对象实现M-QAM调制器,本示例中M为16。

其输入参数是从0到15的整数而不是4bits二进制数据。

因此,在利用此对象的modulate方法之前需要对二进制数据序列x进行预处理。

(完整版)16QAM调制与解调的MATLAB实现及调制性能分析

(完整版)16QAM调制与解调的MATLAB实现及调制性能分析

探※※※※※※※※% 2009级通信工程专业X■通信原理课程设计通信原理课程设计报告书16QAM调制与解调课题名称的MATLAB实现及调制性能分析姓名学号学院通信与电子工程学院专业通信工程指导教师李梦醒2012年01月01日一、设计任务及要求:设计任务:利用MATLAB设计一个16QAM调制与解调系统,并对其进行性能分析。

要求:1. 设计一个16QAM调制与解调系统。

2. 设计程序时必须使得程序尽可能的简单。

3. 利用MATLAB进行程序编写并对系统进行仿真分析。

指导教师签名:20年月日、指导教师评语:指导教师签名:_________________2010年月日二、成绩验收盖章2010年月日16QAM 调制与解调的MATLAB 实现及调制性能分析1设计目的(1) 掌握16QAM 调制与解调的原理。

(2) 掌握星座图的原理并能熟悉星座图的应用。

(3) 熟悉并掌握MATLAB 的使用方法。

(4)通过对16QAM 调制性能的分析了解16QAM 调制相对于其它调制方式的 优缺点。

2设计原理正交振幅调制(QuadratureAmplitude Modulation,QAM )是一种振幅和相位 联合键控。

虽然MPSK 和MDPSK 等相移键控的带宽和功率方面都具有优势, 即带宽占用小和比特噪声比要求低。

但是由图1可见,在MPSK 体制中,随着M 的增大,相邻相位的距离逐渐减小,使噪声容限随之减小,误码率难于保证。

为了改善在M 大时的噪声容限,发展出了 QAM 体制。

在QAM 体制中,信号的 振幅和相位作为两个独立的参量同时受到调制。

这种信号的一个码元可以表示为sjt) A k cos( °tk) kT t (k 1)T(2—1)式中:k=整数; A k 和k 分别可以取多个离散值。

式(2 — 1) 可以展开为sjt)A. cos k cos 0tA . sin k sin 0t(2—2)/815 /8则式(2—1)变为X k和Y k也是可以取多个离散的变量。

MATLAB环境下16QAM调制及解调仿真程序说明精编版

MATLAB环境下16QAM调制及解调仿真程序说明精编版

姓名:NikeyMATLAB环境下16QAM调制及解调仿真程序说明一、正交调制及相干解调原理框图正交调制原理框图相干解调原理框图二、MQAM调制介绍及本仿真程序的几点说明MQAM可以用正交调制的方法产生,本仿真中取M=16,即幅度和相位相结合的16个信号点的调制。

为了观察信道噪声对该调制方式的影响,我们在已调信号中又加入了不同强度的高斯白噪声,并统计其译码误码率。

为了简化程序和得到可靠的误码率,我们在解调时并未从已调信号中恢复载波,而是直接产生与调制时一模一样的载波来进行信号解调。

三、仿真结果图附源程序代码:main_plot.mclear;clc;echo off;close all;N=10000; %设定码元数量fb=1; %基带信号频率fs=32; %抽样频率fc=4; %载波频率,为便于观察已调信号,我们把载波频率设的较低Kbase=2; % Kbase=1,不经基带成形滤波,直接调制;% Kbase=2,基带经成形滤波器滤波后,再进行调制info=random_binary(N); %产生二进制信号序列[y,I,Q]=qam(info,Kbase,fs,fb,fc); %对基带信号进行16QAM调制y1=y; y2=y; %备份信号,供后续仿真用T=length(info)/fb; m=fs/fb; nn=length(info);dt=1/fs; t=0:dt:T-dt;subplot(211);%便于观察,这里显示的已调信号及其频谱均为无噪声干扰的理想情况%由于测试信号码元数量为10000个,在这里我们只显示其总数的1/10plot(t(1:1000),y(1:1000),t(1:1000),I(1:1000),t(1:1000),Q(1:1000),[0 35],[0 0],'b:');title('已调信号(In:red,Qn:green)');%傅里叶变换,求出已调信号的频谱n=length(y); y=fft(y)/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;subplot(223);plot(f,y,'r');grid on;title('已调信号频谱'); xlabel('f/fb');%画出16QAM调制方式对应的星座图subplot(224);constel(y1,fs,fb,fc); title('星座图');SNR_in_dB=8:2:24; %AWGN信道信噪比for j=1:length(SNR_in_dB)y_add_noise=awgn(y2,SNR_in_dB(j)); %加入不同强度的高斯白噪声y_output=qamdet(y_add_noise,fs,fb,fc); %对已调信号进行解调numoferr=0;for i=1:Nif (y_output(i)~=info(i)),numoferr=numoferr+1;end;end;Pe(j)=numoferr/N; %统计误码率end;figure;semilogy(SNR_in_dB,Pe,'red*-');grid on;xlabel('SNR in dB');ylabel('Pe');title('16QAM调制在不同信道噪声强度下的误码率');random_binary.m%产生二进制信源随机序列function [info]=random_binary(N)if nargin == 0, %如果没有输入参数,则指定信息序列为10000个码元N=10000;end;for i=1:N,temp=rand;if (temp<0.5),info(i)=0; % 1/2的概率输出为0elseinfo(i)=1; % 1/2的概率输出为1endend;qam.mfunction [y,I,Q]=qam(x,Kbase,fs,fb,fc);%T=length(x)/fb; m=fs/fb; nn=length(x);dt=1/fs; t=0:dt:T-dt;%串/并变换分离出I分量、Q分量,然后再分别进行电平映射I=x(1:2:nn-1); [I,In]=two2four(I,4*m);Q=x(2:2:nn); [Q,Qn]=two2four(Q,4*m);if Kbase==2; %基带成形滤波I=bshape(I,fs,fb/4); Q=bshape(Q,fs,fb/4);end;y=I.*cos(2*pi*fc*t)-Q.*sin(2*pi*fc*t); %调制qamdet.m%QAM信号解调function [xn,x]=qamdet(y,fs,fb,fc);dt=1/fs; t=0:dt:(length(y)-1)*dt;I=y.*cos(2*pi*fc*t);Q=-y.*sin(2*pi*fc*t);[b,a]=butter(2,2*fb/fs); %设计巴特沃斯滤波器I=filtfilt(b,a,I);Q=filtfilt(b,a,Q);m=4*fs/fb; N=length(y)/m; n=(.6:1:N)*m; n=fix(n);In=I(n); Qn=Q(n); xn=four2two([In Qn]);%I分量Q分量并/串转换,最终恢复成码元序列xnnn=length(xn); xn=[xn(1:nn/2);xn(nn/2+1:nn)];xn=xn(:); xn=xn';bshape.m%基带升余弦成形滤波器function y=bshape(x,fs,fb,N,alfa,delay);%设置默认参数if nargin<6; delay=8; end;if nargin<5; alfa=0.5; end;if nargin<4; N=16; end;b=firrcos(N,fb,2*alfa*fb,fs);y=filter(b,1,x);two2four.m%二进制转换成四进制function [y,yn]=two2four(x,m);T=[0 1;3 2]; n=length(x); ii=1;for i=1:2:n-1;xi=x(i:i+1)+1;yn(ii)=T(xi(1),xi(2));ii=ii+1;end;yn=yn-1.5; y=yn;for i=1:m-1;y=[y;yn];end;y=y(:)'; %映射电平分别为-1.5;0.5;0.5;1.5four2two.m%四进制转换成二进制function xn=four2two(yn);y=yn; ymin=min(y); ymax=max(y); ymax=max([ymax abs(ymin)]); ymin=-abs(ymax); yn=(y-ymin)*3/(ymax-ymin);%设置门限电平,判决I0=find(yn< 0.5); yn(I0)=zeros(size(I0));I1=find(yn>=0.5 & yn<1.5); y n(I1)=ones(size(I1));I2=find(yn>=1.5 & yn<2.5); y n(I2)=ones(size(I2))*2;I3=find(yn>=2.5); yn(I3)=ones(size(I3))*3; %一位四进制码元转换为两位二进制码元T=[0 0;0 1;1 1;1 0]; n=length(yn);for i=1:n;xn(i,:)=T(yn(i)+1,:);end;xn=xn'; xn=xn(:); xn=xn';constel.m%画出星座图function c=constel(x,fs,fb,fc);N=length(x); m=2*fs/fb; n=fs/fc;i1=m-n; i=1; ph0=(i1-1)*2*pi/n;while i <= N/m;xi=x(i1:i1+n-1);y=2*fft(xi)/n; c(i)=y(2);i=i+1; i1=i1+m;end;%如果无输出,则作图if nargout<1;cmax=max(abs(c));ph=(0:5:360)*pi/180;plot(1.414*cos(ph),1.414*sin(ph),'c');hold on;for i=1:length(c);ph=ph0-angle(c(i));a=abs(c(i))/cmax*1.414;plot(a*cos(ph),a*sin(ph),'r*');end;plot([-1.5 1.5],[0 0],'k:',[0 0],[-1.5 1.5],'k:');hold off; axis equal; axis([-1.5 1.5 -1.5 1.5]); end;。

16QAM调制与解调的MATLAB实现及调制性能分析.doc

16QAM调制与解调的MATLAB实现及调制性能分析.doc

通信原理课程设计报告书课题名称16QAM 调制与解调的MATLAB 实现及调制性能分析姓 名学 号学 院 通信与电子工程学院专 业 通信工程 指导教师李梦醒2012年 01 月 01日※※※※※※※※※ ※※ ※※ ※※ ※※※※※※※※※2009级通信工程专业通信原理课程设计16QAM 调制与解调的MATLAB 实现及调制性能分析 1设计目的 (1) 掌握16QAM 调制与解调的原理。

(2) 掌握星座图的原理并能熟悉星座图的应用。

(3) 熟悉并掌握MATLAB 的使用方法。

(4) 通过对16QAM 调制性能的分析了解16QAM 调制相对于其它调制方式的优缺点。

2 设计原理正交振幅调制(Quadrature Amplitude Modulation,QAM )是一种振幅和相位联合键控。

虽然MPSK 和MDPSK 等相移键控的带宽和功率方面都具有优势,即带宽占用小和比特噪声比要求低。

但是由图1可见,在MPSK 体制中,随着图 1 8PSK 信号相位M 的增大,相邻相位的距离逐渐减小,使噪声容限随之减小,误码率难于保证。

为了改善在M 大时的噪声容限,发展出了QAM 体制。

在QAM 体制中,信号的振幅和相位作为两个独立的参量同时受到调制。

这种信号的一个码元可以表示为(2—1)式中:k=整数;和分别可以取多个离散值。

式(2—1)可以展开为(2—2)令 X k = A k cos θk , Y k = -A k sin θk 则式(2—1)变为(2—3)和也是可以取多个离散的变量。

从式(2—3)看出,可以看作是两个正交的振幅键控信号之和。

在式(2—1)中,若θk 值仅可以取π/4和-π/4,A k 值仅可以取+A 和-A ,则此QAM 信号就成为QPSK 信号,如图2所示:图2 4QAM 信号矢量图所以,QPSK 信号就是一种最简单的QAM 信号。

有代表性的QAM 信号是16进制的,记为16QAM ,它的矢量图示于下图中:三、成绩验收盖章2010年 月 日图3 16QAM 信号矢量图图中用黑点表示每个码元的位置,并且示出它是由两个正交矢量合成的。

16QAM调制解调(MATLAB)

16QAM调制解调(MATLAB)

题目基于MATLAB的16QAM 及32QAM 系统的仿真原理:QAM是一种矢量调制,将输入比特映射到一个复平面,形成复数调制信号,然后将I信号和Q信号(实部虚部)分量采用幅度调制,分别对应调制在相互正交的两个载波(cos t , sin t )上。

下图为MQAM 的调制原理图。

MQAM 的信号表达式:S i t a i c g T t cos c t a i s g T t sin 点i 1,2,..., M , 0 t T sa ic与a iS是具有i M种不同幅度的加权值上述表达式可以看出,QAM为两个正交载波振幅相位调制的结合波形矢量可以表示为:s t S i1 f1 t s2 f2 t i 1,2,..., M, 0 t T ST SS i 0 S i t f i t dt i 1,2,..., MTsS2 0 S i t f2 t dt i 1,2,..., MMQAM信号最佳接收:实验仿真条件:码元数量设定为10000个,基带信号频率1HZ,抽样频率32HZ , 载波频率4HZ 实验结果分析:P e对于QAM ,可以看成是由两个相互正交且独立的多电平 ASK 信号叠加而成因此,利用多电平误码率的分析方法,可得到 M 进制QAM 的误码率为:(1 >fcL 3L O 2g21L (Eb )]L V L 1 n ° 式中,L M ,Eb 为每码元能量,n o 为噪声单边功率谱密度。

通过调整高斯白噪声信道的信噪比 SNR (Eb/No ),可以得到如图所示的误码率 图:0 10QAM 信号误码率分析-110-2 10*** +■ -310-1 -0.5 0.5 1 信噪比1.52.5-1可见16QAM 和32QAM 信号的误码率随着信噪比的增大而逐渐减小,这与理论趋势是一致的,但是存在偏差。

总结:与16QAM 比较,32QAM 解调的误码率高,但数据速率高。

16QAM 一般工作32QAr ;l 误比特率性能O-3 «oO在大信噪比环境下,误码率会很小,在同等噪声条件下, 16QAM 的抗噪声性能是相当优越的附录代码:main_plot.m clear;clc;echo off;close all;N=10000; % 设定码元数量fb=1; %基带信号频率fs=32; %抽样频率fc=4; %载波频率 ,为便于观察已调信号,我们把载波频率设的较低Kbase=2;% Kbase=1, 不经基带成形滤波,直接调制 ;% Kbase=2, 基带经成形滤波器滤波后,再进行调制info=random_binary(N); %产生二进制信号序列[y,I,Q]=qam(info,Kbase,fs,fb,fc); % 对基带信号进行 16QAM 调制 y1=y; y2=y;%备份信号,供后续仿真用T=length(info)/fb;m=fs/fb;nn=length(info);dt=1/fs;t=0:dt:T-dt;n=length(y);y=fft(y)/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;%subplot(212);plot(f,y,'b');grid on;title(' 已调信号频谱 '); xlabel('f/fb');%画出 16QAM 调制方式对应的星座图%%constel(y1,fs,fb,fc); title(' 星座图 ');SNR_in_dB=8:2:24; %AWGN 信道信噪比for j=1:length(SNR_in_dB)y_add_noise=awgn(y2,SNR_in_dB(j)); % 加入不同强度的高斯白噪声y_output=qamdet(y_add_noise,fs,fb,fc); % 对已调信号进行解调numoferr=0;for i=1:Nif (y_output(i)~=info(i)),numoferr=numoferr+1;end;end;Pe(j)=numoferr/N; %统计误码率 end;figure;semilogy(SNR_in_dB,Pe,'blue*-');grid on;xlabel('SNR in dB');ylabel('Pe');title('16QAM 调制误码率 ');bshape.m%基带升余弦成形滤波器function y=bshape(x,fs,fb,N,alfa,delay);%设置默认参数if nargin<6; delay=8; end;if nargin<5; alfa=0.5; end;if nargin<4; N=16; end;b=firrcos(N,fb,2*alfa*fb,fs);y=filter(b,1,x);four2two.mfunction xn=four2two(yn);y=yn; ymin=min(y); ymax=max(y); ymax=max([ymax abs(ymin)]); ymin=-abs(ymax); yn=(y-ymin)*3/(ymax-ymin);%设置门限电平,判决I0=find(yn< 0.5); yn(I0)=zeros(size(I0));I1=find(yn>=0.5 & yn<1.5); yn(I1)=ones(size(I1));I2=find(yn>=1.5 & yn<2.5); yn(I2)=ones(size(I2))*2;I3=find(yn>=2.5); yn(I3)=ones(size(I3))*3; %一位四进制码元转换为两位二进制码元T=[0 0;0 1;1 1;1 0]; n=length(yn);for i=1:n;xn(i,:)=T(yn(i)+1,:);end;xn=xn'; xn=xn(:); xn=xn';two2four.m%二进制转换成四进制function [y,yn]=two2four(x,m);T=[0 1;3 2]; n=length(x); ii=1;for i=1:2:n-1;xi=x(i:i+1)+1;yn(ii)=T(xi(1),xi(2));ii=ii+1;end;yn=yn-1.5; y=yn;for i=1:m-1;y=[y;yn];end;y=y(:)'; % 映射电平分别为 -1.5 ;0.5;0.5 ;1.5 random_binary.mfunction [info]=random_binary(N)if nargin == 0, % 如果没有输入参数,则指定信息序列为 10000 个码元N=10000;end;for i=1:N,temp=rand;if (temp<0.5),info(i)=0; % 1/2 的概率输出为 0elseinfo(i)=1; % 1/2 的概率输出为 1endend;qamdet.m%QAM 信号解调function [xn,x]=qamdet(y,fs,fb,fc);dt=1/fs; t=0:dt:(length(y)-1)*dt;I=y.*cos(2*pi*fc*t);Q=-y.*sin(2*pi*fc*t);[b,a]=butter(2,2*fb/fs); %设计巴特沃斯滤波器I=filtfilt(b,a,I);Q=filtfilt(b,a,Q);m=4*fs/fb; N =length(y)/m; n=(.6:1:N)*m; n=fix(n);In=I(n); Qn=Q(n); xn=four2two([In Qn]);%I 分量 Q 分量并/ 串转换,最终恢复成码元序列 xn nn=length(xn);xn=[xn(1:nn/2);xn(nn/2+1:nn)];xn=xn(:); xn=xn';qam.mfunction [y,I,Q]=qam(x,Kbase,fs,fb,fc);%T=length(x)/fb; m=fs/fb; nn=length(x);dt=1/fs; t=0:dt:T-dt;%串 / 并变换分离出 I 分量、 Q 分量,然后再分别进行电平映射I=x(1:2:nn-1);[I,In]=two2four(I,4*m);Q=x(2:2:nn);[Q,Qn]=two2four(Q,4*m);if Kbase==2; % 基带成形滤波I=bshape(I,fs,fb/4); Q=bshape(Q,fs,fb/4);end;y=I.*cos(2*pi*fc*t)-Q.*sin(2*pi*fc*t);32QAMM = 32;k = log2(M);x = randint(20000,1);y = modulate(modem.qammod('M',32,'InputType','Bit'),x);EbNo = -5:1:10;for n=1:length(EbNo)snr(n) = EbNo(n) + 10*log10(k);ynoisy = awgn(y,snr(n),'measured');zms = demodulate(modem.qamdemod('M',32,'OutputType','Bit'),ynoisy); z = de2bi(zms,'left-msb');[nErrors(n), BITBER(n)] = biterr(x,z);theo_err_prb( n)=(1/k)*3/2*efc(sqrt(k*0.1*(10.A(EbNo( n)/10)))); enddisp (nErrors);disp (BITBER);semilogy(EbNo,BITBER,'b*-',EbNo,theo_err_prb,'k*-');title('32QAM 误比特率性能 ');xlabel('Eb/N0(dB)');ylabel(' 误比特率 ');legend(' 仿真误码率 ',' 理论误码率 ');。

MATLAB环境下16QAM调制及解调仿真程序说明

MATLAB环境下16QAM调制及解调仿真程序说明

姓名:NikeyMATLAB环境下16QAM调制及解调仿真程序说明一、正交调制及相干解调原理框图正交调制原理框图相干解调原理框图二、 MQAM调制介绍及本仿真程序的几点说明MQAM可以用正交调制的方法产生,本仿真中取M=16,即幅度和相位相结合的16个信号点的调制。

为了观察信道噪声对该调制方式的影响,我们在已调信号中又加入了不同强度的高斯白噪声,并统计其译码误码率。

为了简化程序和得到可靠的误码率,我们在解调时并未从已调信号中恢复载波,而是直接产生与调制时一模一样的载波来进行信号解调。

三、仿真结果图附源程序代码:main_plot.mclear;clc;echo off;close all;N=10000; %设定码元数量fb=1; %基带信号频率fs=32; %抽样频率fc=4; %载波频率,为便于观察已调信号,我们把载波频率设的较低Kbase=2; % Kbase=1,不经基带成形滤波,直接调制;% Kbase=2,基带经成形滤波器滤波后,再进行调制info=random_binary(N); %产生二进制信号序列[y,I,Q]=qam(info,Kbase,fs,fb,fc); %对基带信号进行16QAM调制y1=y; y2=y; %备份信号,供后续仿真用T=length(info)/fb; m=fs/fb; nn=length(info);dt=1/fs; t=0:dt:T-dt;subplot(211);%便于观察,这里显示的已调信号及其频谱均为无噪声干扰的理想情况%由于测试信号码元数量为10000个,在这里我们只显示其总数的1/10plot(t(1:1000),y(1:1000),t(1:1000),I(1:1000),t(1:1000),Q(1:1000),[0 35],[0 0],'b:'); title('已调信号(In:red,Qn:green)');%傅里叶变换,求出已调信号的频谱n=length(y); y=fft(y)/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;subplot(223);plot(f,y,'r');grid on;title('已调信号频谱'); xlabel('f/fb');%画出16QAM调制方式对应的星座图subplot(224);constel(y1,fs,fb,fc); title('星座图');SNR_in_dB=8:2:24; %AWGN信道信噪比for j=1:length(SNR_in_dB)y_add_noise=awgn(y2,SNR_in_dB(j)); %加入不同强度的高斯白噪声y_output=qamdet(y_add_noise,fs,fb,fc); %对已调信号进行解调numoferr=0;for i=1:Nif (y_output(i)~=info(i)),numoferr=numoferr+1;end;end;Pe(j)=numoferr/N; %统计误码率end;figure;semilogy(SNR_in_dB,Pe,'red*-');grid on;xlabel('SNR in dB');ylabel('Pe');title('16QAM调制在不同信道噪声强度下的误码率');random_binary.m%产生二进制信源随机序列function [info]=random_binary(N)if nargin == 0, %如果没有输入参数,则指定信息序列为10000个码元 N=10000;end;for i=1:N,temp=rand;if (temp<0.5),info(i)=0; % 1/2的概率输出为0elseinfo(i)=1; % 1/2的概率输出为1endend;qam.mfunction [y,I,Q]=qam(x,Kbase,fs,fb,fc);%T=length(x)/fb; m=fs/fb; nn=length(x);dt=1/fs; t=0:dt:T-dt;%串/并变换分离出I分量、Q分量,然后再分别进行电平映射I=x(1:2:nn-1); [I,In]=two2four(I,4*m);Q=x(2:2:nn); [Q,Qn]=two2four(Q,4*m);if Kbase==2; %基带成形滤波I=bshape(I,fs,fb/4); Q=bshape(Q,fs,fb/4);end;y=I.*cos(2*pi*fc*t)-Q.*sin(2*pi*fc*t); %调制qamdet.m%QAM信号解调function [xn,x]=qamdet(y,fs,fb,fc);dt=1/fs; t=0:dt:(length(y)-1)*dt;I=y.*cos(2*pi*fc*t);Q=-y.*sin(2*pi*fc*t);[b,a]=butter(2,2*fb/fs); %设计巴特沃斯滤波器I=filtfilt(b,a,I);Q=filtfilt(b,a,Q);m=4*fs/fb; N=length(y)/m; n=(.6:1:N)*m; n=fix(n);In=I(n); Qn=Q(n); xn=four2two([In Qn]);%I分量Q分量并/串转换,最终恢复成码元序列xnnn=length(xn); xn=[xn(1:nn/2);xn(nn/2+1:nn)];xn=xn(:); xn=xn';bshape.m%基带升余弦成形滤波器function y=bshape(x,fs,fb,N,alfa,delay);%设置默认参数if nargin<6; delay=8; end;if nargin<5; alfa=0.5; end;if nargin<4; N=16; end;b=firrcos(N,fb,2*alfa*fb,fs);y=filter(b,1,x);two2four.m%二进制转换成四进制function [y,yn]=two2four(x,m);T=[0 1;3 2]; n=length(x); ii=1;for i=1:2:n-1;xi=x(i:i+1)+1;yn(ii)=T(xi(1),xi(2));ii=ii+1;end;yn=yn-1.5; y=yn;for i=1:m-1;y=[y;yn];end;y=y(:)'; %映射电平分别为-1.5;0.5;0.5;1.5four2two.m%四进制转换成二进制function xn=four2two(yn);y=yn; ymin=min(y); ymax=max(y); ymax=max([ymax abs(ymin)]); ymin=-abs(ymax); yn=(y-ymin)*3/(ymax-ymin);%设置门限电平,判决I0=find(yn< 0.5); yn(I0)=zeros(size(I0));I1=find(yn>=0.5 & yn<1.5); yn(I1)=ones(size(I1));I2=find(yn>=1.5 & yn<2.5); yn(I2)=ones(size(I2))*2;I3=find(yn>=2.5); yn(I3)=ones(size(I3))*3; %一位四进制码元转换为两位二进制码元T=[0 0;0 1;1 1;1 0]; n=length(yn);for i=1:n;xn(i,:)=T(yn(i)+1,:);end;xn=xn'; xn=xn(:); xn=xn';constel.m%画出星座图function c=constel(x,fs,fb,fc);N=length(x); m=2*fs/fb; n=fs/fc;i1=m-n; i=1; ph0=(i1-1)*2*pi/n;while i <= N/m;xi=x(i1:i1+n-1);y=2*fft(xi)/n; c(i)=y(2);i=i+1; i1=i1+m;end;%如果无输出,则作图if nargout<1;cmax=max(abs(c));ph=(0:5:360)*pi/180;plot(1.414*cos(ph),1.414*sin(ph),'c');hold on;for i=1:length(c);ph=ph0-angle(c(i));a=abs(c(i))/cmax*1.414;plot(a*cos(ph),a*sin(ph),'r*');end;plot([-1.5 1.5],[0 0],'k:',[0 0],[-1.5 1.5],'k:'); hold off; axis equal; axis([-1.5 1.5 -1.5 1.5]); end;。

(完整版)16QAM仿真代码(matlab)

(完整版)16QAM仿真代码(matlab)

(完整版)16QAM仿真代码(matlab)% 16QAM 系统仿真function [ ber_AWGN,ber_Ray] = M16QAM()EbN0dB=1:3:30;EbN0dB1=1:10;N=4*100000;for ii=1:length(EbN0dB)sigma2(ii)=2.5/(2*4*(10^(EbN0dB(ii)/10)));sigma21(ii)=2.5/(2*4*(10^(EbN0dB1(ii)/10)));bits=randint(1,N);%调制s=M16QAM_modulate(bits,length(bits(:)));% Rayleign信道干扰noise=sqrt(sigma2(ii))*( randn(1,N/4)+ 1i*randn(1,N/4) );h= sqrt(0.5)*(randn(1,N/4) + 1i*randn(1,N/4) );receiver=s.*h+noise; %Rayleign 衰减信道% 高斯信道干扰noise1=sqrt(sigma21(ii))*( randn(1,N/4)+ 1i*randn(1,N/4) );receiver1=s+noise1; %高斯信道% 信道均衡receiver = receiver./h;%解调并计算误码率Rayleign信道demodata = M16QAM_demodulate( receiver,length(receiver(:)) );errCount=sum(abs(bits-demodata));ber_Ray(ii)=errCount/N;%解调并计算误码率高斯信道demodata = M16QAM_demodulate( receiver1,length(receiver1(:)) );errCount=sum(abs(bits-demodata));ber_AWGN(ii)=errCount/N;endend% 16QAM 调制function [ s ] = M16QAM_modulate( bits,N)ii=0;for i=1:4:Nii=ii+1;ifbits(i)==0&&bits(i+1)==0&&bits(i+2)==0&&bits(i+3)==0 s(ii)=sqrt(2)/2*exp(1i*pi/4);elseifbits(i)==1&&bits(i+1)==0&&bits(i+2)==0&&bits(i+3)==0 s(ii)=sqrt(2)/2*exp(1i*3*pi/4);elseifbits(i)==1&&bits(i+1)==0&&bits(i+2)==1&&bits(i+3)==0 s(ii)=sqrt(2)/2*exp(1i*5*pi/4);elseifbits(i)==0&&bits(i+1)==0&&bits(i+2)==1&&bits(i+3)==0 s(ii)=sqrt(2)/2*exp(1i*7*pi/4);elseifbits(i)==0&&bits(i+1)==1&&bits(i+2)==0&&bits(i+3)==0 s(ii)=sqrt(10)/2*exp(1i*atan(1/3));elseifbits(i)==0&&bits(i+1)==0&&bits(i+2)==0&&bits(i+3)==1 s(ii)=sqrt(10)/2*exp(1i*atan(3));elseifbits(i)==1&&bits(i+1)==0&&bits(i+2)==0&&bits(i+3)==1 s(ii)=sqrt(10)/2*exp(1i*(atan(1/3)+pi/2));elseifbits(i)==1&&bits(i+1)==1&&bits(i+2)==0&&bits(i+3)==0 s(ii)=sqrt(10)/2*exp(1i*(pi-atan(1/3)));elseifbits(i)==1&&bits(i+1)==1&&bits(i+2)==1&&bits(i+3)==0 s(ii)=sqrt(10)/2*exp(1i*(atan(1/3)+pi));elseifbits(i)==1&&bits(i+1)==0&&bits(i+2)==1&&bits(i+3)==1 s(ii)=sqrt(10)/2*exp(1i*(3*pi/2-atan(1/3)));elseifbits(i)==0&&bits(i+1)==0&&bits(i+2)==1&&bits(i+3)==1 s(ii)=sqrt(10)/2*exp(1i*(atan(1/3)+3*pi/2));elseifbits(i)==0&&bits(i+1)==1&&bits(i+2)==1&&bits(i+3)==0 s(ii)=sqrt(10)/2*exp(1i*(2*pi-atan(1/3)));elseifbits(i)==0&&bits(i+1)==1&&bits(i+2)==0&&bits(i+3)==1 s(ii)=sqrt(2)*3/2*exp(1i*pi/4);elseifbits(i)==1&&bits(i+1)==1&&bits(i+2)==0&&bits(i+3)==1 s(ii)=sqrt(2)*3/2*exp(1i*3*pi/4);elseifbits(i)==1&&bits(i+1)==1&&bits(i+2)==1&&bits(i+3)==1 s(ii)=sqrt(2)*3/2*exp(1i*5*pi/4);elseifbits(i)==0&&bits(i+1)==1&&bits(i+2)==1&&bits(i+3)==1 s(ii)=sqrt(2)*3/2*exp(1i*7*pi/4);endendend% 16 QAM 解调function [ demodata ] = M16QAM_demodulate( receiver ,N) A=[0 1 0 1; -1 0 0 1;-1 0 -1 0;0 1 -1 0;1 inf 0 1;0 1 1 inf;-1 0 1 inf;-inf -1 0 1;-inf -1 -1 0;-1 0 -inf -1;0 1 -inf -1;1 inf -1 0;1 inf 1 inf;-inf -1 1 inf;-inf -1 -inf -1;1 inf -inf -1];for k=1:Nif(real(receiver(k))>=A(1,1))&&(real(receiver(k))<a(1,2))&&...<p="">(imag(receiver(k))>=A(1,3))&&(imag(receiver(k))demodata(k*4-2)=0;demodata(k*4-1)=0;demodata(k*4)=0;elseif(real(receiver(k))>=A(2,1))&&(real(receiver(k))<a(2,2))...< p=""> &&(imag(receiver(k))>=A(2,3))&&(imag(receiver(k))demodata(k*4-1)=0;demodata(k*4)=0;elseif(real(receiver(k))>=A(3,1))&&(real(receiver(k))<a(3,2))...< p=""> &&(imag(receiver(k))>=A(3,3))&&(imag(receiver(k))demodata(k*4-2)=0;demodata(k*4-1)=1;demodata(k*4)=0;elseif(real(receiver(k))>=A(4,1))&&(real(receiver(k))<a(4,2))...< p=""> &&(imag(receiver(k))>=A(4,3))&&(imag(receiver(k))demodata(k*4-2)=0;demodata(k*4-1)=1;demodata(k*4)=0;elseif(real(receiver(k))>=A(5,1))&&(real(receiver(k))<a(5,2))...< p=""> &&(imag(receiver(k))>=A(5,3))&&(imag(receiver(k))demodata(k*4-2)=1;demodata(k*4-1)=0;demodata(k*4)=0;elseif(real(receiver(k))>=A(6,1))&&(real(receiver(k))<a(6,2))...< p=""> &&(imag(receiver(k))>=A(6,3))&&(imag(receiver(k))demodata(k*4-2)=0;demodata(k*4-1)=0;demodata(k*4)=1;elseif(real(receiver(k))>=A(7,1))&&(real(receiver(k))<a(7,2))...< p=""> &&(imag(receiver(k))>=A(7,3))&&(imag(receiver(k))demodata(k*4-2)=0;demodata(k*4-1)=0;demodata(k*4)=1;elseif(real(receiver(k))>=A(8,1))&&(real(receiver(k))<a(8,2))...< p=""> &&(imag(receiver(k))>=A(8,3))&&(imag(receiver(k))demodata(k*4-2)=1;demodata(k*4-1)=0;demodata(k*4)=0;elseif(real(receiver(k))>=A(9,1))&&(real(receiver(k))<a(9,2))...< p=""> &&(imag(receiver(k))>=A(9,3))&&(imag(receiver(k))demodata(k*4-2)=1;demodata(k*4)=0;(real(receiver(k))>=A(10,1))&&(real(receiver(k))<a(10,2))...< p=""> &&(imag(receiver(k))>=A(10,3))&&(imag(receiver(k))demodata(k*4-2)=0;demodata(k*4-1)=1;demodata(k*4)=1;elseif(real(receiver(k))>=A(11,1))&&(real(receiver(k))<a(11,2))...< p=""> &&(imag(receiver(k))>=A(11,3))&&(imag(receiver(k))demodata(k*4-2)=0;demodata(k*4-1)=1;demodata(k*4)=1;elseif(real(receiver(k))>=A(12,1))&&(real(receiver(k))<a(12,2))...< p=""> &&(imag(receiver(k))>=A(12,3))&&(imag(receiver(k))demodata(k*4-2)=1;demodata(k*4-1)=1;demodata(k*4)=0;elseif(real(receiver(k))>=A(13,1))&&(real(receiver(k))<a(13,2))...< p=""> &&(imag(receiver(k))>=A(13,3))&&(imag(receiver(k))demodata(k*4-2)=1;demodata(k*4-1)=0;demodata(k*4)=1;elseif(real(receiver(k))>=A(14,1))&&(real(receiver(k))<a(14,2))...< p=""> &&(imag(receiver(k))>=A(14,3))&&(imag(receiver(k))demodata(k*4-2)=1;demodata(k*4-1)=0;demodata(k*4)=1;(real(receiver(k))>=A(15,1))&&(real(receiver(k))<a(15,2))...< p=""> &&(imag(receiver(k))>=A(15,3))&&(imag(receiver(k))demodata(k*4-2)=1;demodata(k*4-1)=1;demodata(k*4)=1;elseif(real(receiver(k))>=A(16,1))&&(real(receiver(k))<a(16,2))...< p=""> &&(imag(receiver(k))>=A(16,3))&&(imag(receiver(k))demodata(k*4-2)=1;demodata(k*4-1)=1;demodata(k*4)=1;end endend</a(16,2))...<></a(15,2))...<></a(14,2))...<></a(13,2))...<></a(12,2))...<></a(11,2))...<></a(10,2))...<></a(9,2))...<></a(8,2))...<></a(7,2))...<></a(6,2))...<></a(5,2))...<></a(4,2))...<></a(3,2))...<></a(2,2))...<></a(1,2))&&...<>。

16QAM调制解调(MATLAB)

16QAM调制解调(MATLAB)

题目基于MATLAB的16QAM 及32QAM 系统的仿真原理:QAM是一种矢量调制,将输入比特映射到一个复平面,形成复数调制信号,然后将I信号和Q信号(实部虚部)分量采用幅度调制,分别对应调制在相互正交的两个载波(cos t , sin t )上。

下图为MQAM 的调制原理图。

MQAM 的信号表达式:S i t a i c g T t cos c t a i s g T t sin 点i 1,2,..., M , 0 t T sa ic与a iS是具有i M种不同幅度的加权值上述表达式可以看出,QAM为两个正交载波振幅相位调制的结合波形矢量可以表示为:s t S i1 f1 t s2 f2 t i 1,2,..., M, 0 t T ST SS i 0 S i t f i t dt i 1,2,..., MTsS2 0 S i t f2 t dt i 1,2,..., MMQAM信号最佳接收:实验仿真条件:码元数量设定为10000个,基带信号频率1HZ,抽样频率32HZ , 载波频率4HZ 实验结果分析:P e对于QAM ,可以看成是由两个相互正交且独立的多电平 ASK 信号叠加而成因此,利用多电平误码率的分析方法,可得到 M 进制QAM 的误码率为:(1 >fcL 3L O 2g21L (Eb )]L V L 1 n ° 式中,L M ,Eb 为每码元能量,n o 为噪声单边功率谱密度。

通过调整高斯白噪声信道的信噪比 SNR (Eb/No ),可以得到如图所示的误码率 图:0 10QAM 信号误码率分析-110-2 10*** +■ -310-1 -0.5 0.5 1 信噪比1.52.5-1可见16QAM 和32QAM 信号的误码率随着信噪比的增大而逐渐减小,这与理论趋势是一致的,但是存在偏差。

总结:与16QAM 比较,32QAM 解调的误码率高,但数据速率高。

16QAM 一般工作32QAr ;l 误比特率性能O-3 «oO在大信噪比环境下,误码率会很小,在同等噪声条件下, 16QAM 的抗噪声性能是相当优越的附录代码:main_plot.m clear;clc;echo off;close all;N=10000; % 设定码元数量fb=1; %基带信号频率fs=32; %抽样频率fc=4; %载波频率 ,为便于观察已调信号,我们把载波频率设的较低Kbase=2;% Kbase=1, 不经基带成形滤波,直接调制 ;% Kbase=2, 基带经成形滤波器滤波后,再进行调制info=random_binary(N); %产生二进制信号序列[y,I,Q]=qam(info,Kbase,fs,fb,fc); % 对基带信号进行 16QAM 调制 y1=y; y2=y;%备份信号,供后续仿真用T=length(info)/fb;m=fs/fb;nn=length(info);dt=1/fs;t=0:dt:T-dt;n=length(y);y=fft(y)/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;%subplot(212);plot(f,y,'b');grid on;title(' 已调信号频谱 '); xlabel('f/fb');%画出 16QAM 调制方式对应的星座图%%constel(y1,fs,fb,fc); title(' 星座图 ');SNR_in_dB=8:2:24; %AWGN 信道信噪比for j=1:length(SNR_in_dB)y_add_noise=awgn(y2,SNR_in_dB(j)); % 加入不同强度的高斯白噪声y_output=qamdet(y_add_noise,fs,fb,fc); % 对已调信号进行解调numoferr=0;for i=1:Nif (y_output(i)~=info(i)),numoferr=numoferr+1;end;end;Pe(j)=numoferr/N; %统计误码率 end;figure;semilogy(SNR_in_dB,Pe,'blue*-');grid on;xlabel('SNR in dB');ylabel('Pe');title('16QAM 调制误码率 ');bshape.m%基带升余弦成形滤波器function y=bshape(x,fs,fb,N,alfa,delay);%设置默认参数if nargin<6; delay=8; end;if nargin<5; alfa=0.5; end;if nargin<4; N=16; end;b=firrcos(N,fb,2*alfa*fb,fs);y=filter(b,1,x);four2two.mfunction xn=four2two(yn);y=yn; ymin=min(y); ymax=max(y); ymax=max([ymax abs(ymin)]); ymin=-abs(ymax); yn=(y-ymin)*3/(ymax-ymin);%设置门限电平,判决I0=find(yn< 0.5); yn(I0)=zeros(size(I0));I1=find(yn>=0.5 & yn<1.5); yn(I1)=ones(size(I1));I2=find(yn>=1.5 & yn<2.5); yn(I2)=ones(size(I2))*2;I3=find(yn>=2.5); yn(I3)=ones(size(I3))*3; %一位四进制码元转换为两位二进制码元T=[0 0;0 1;1 1;1 0]; n=length(yn);for i=1:n;xn(i,:)=T(yn(i)+1,:);end;xn=xn'; xn=xn(:); xn=xn';two2four.m%二进制转换成四进制function [y,yn]=two2four(x,m);T=[0 1;3 2]; n=length(x); ii=1;for i=1:2:n-1;xi=x(i:i+1)+1;yn(ii)=T(xi(1),xi(2));ii=ii+1;end;yn=yn-1.5; y=yn;for i=1:m-1;y=[y;yn];end;y=y(:)'; % 映射电平分别为 -1.5 ;0.5;0.5 ;1.5 random_binary.mfunction [info]=random_binary(N)if nargin == 0, % 如果没有输入参数,则指定信息序列为 10000 个码元N=10000;end;for i=1:N,temp=rand;if (temp<0.5),info(i)=0; % 1/2 的概率输出为 0elseinfo(i)=1; % 1/2 的概率输出为 1endend;qamdet.m%QAM 信号解调function [xn,x]=qamdet(y,fs,fb,fc);dt=1/fs; t=0:dt:(length(y)-1)*dt;I=y.*cos(2*pi*fc*t);Q=-y.*sin(2*pi*fc*t);[b,a]=butter(2,2*fb/fs); %设计巴特沃斯滤波器I=filtfilt(b,a,I);Q=filtfilt(b,a,Q);m=4*fs/fb; N =length(y)/m; n=(.6:1:N)*m; n=fix(n);In=I(n); Qn=Q(n); xn=four2two([In Qn]);%I 分量 Q 分量并/ 串转换,最终恢复成码元序列 xn nn=length(xn);xn=[xn(1:nn/2);xn(nn/2+1:nn)];xn=xn(:); xn=xn';qam.mfunction [y,I,Q]=qam(x,Kbase,fs,fb,fc);%T=length(x)/fb; m=fs/fb; nn=length(x);dt=1/fs; t=0:dt:T-dt;%串 / 并变换分离出 I 分量、 Q 分量,然后再分别进行电平映射I=x(1:2:nn-1);[I,In]=two2four(I,4*m);Q=x(2:2:nn);[Q,Qn]=two2four(Q,4*m);if Kbase==2; % 基带成形滤波I=bshape(I,fs,fb/4); Q=bshape(Q,fs,fb/4);end;y=I.*cos(2*pi*fc*t)-Q.*sin(2*pi*fc*t);32QAMM = 32;k = log2(M);x = randint(20000,1);y = modulate(modem.qammod('M',32,'InputType','Bit'),x);EbNo = -5:1:10;for n=1:length(EbNo)snr(n) = EbNo(n) + 10*log10(k);ynoisy = awgn(y,snr(n),'measured');zms = demodulate(modem.qamdemod('M',32,'OutputType','Bit'),ynoisy); z = de2bi(zms,'left-msb');[nErrors(n), BITBER(n)] = biterr(x,z);theo_err_prb( n)=(1/k)*3/2*efc(sqrt(k*0.1*(10.A(EbNo( n)/10)))); enddisp (nErrors);disp (BITBER);semilogy(EbNo,BITBER,'b*-',EbNo,theo_err_prb,'k*-');title('32QAM 误比特率性能 ');xlabel('Eb/N0(dB)');ylabel(' 误比特率 ');legend(' 仿真误码率 ',' 理论误码率 ');。

16QAM-星形和矩形星座图调制解调MATLAB代码

16QAM-星形和矩形星座图调制解调MATLAB代码

%% ------------------------------------------------------------% 软件无线电课程设计%% 方形、星形16QAM调制解调仿真%%%------------------------------------------------------------%%主程序clcclear%% 定义参数fd=250*10^6; %码元速率250Mfs=2500*10^6; %滤波器采样率fc=2500*10^6; %载波频率2.5Gf=10000*10^6; %对载波采样data_len=200000; %数据长度sym_len=data_len/4; %码元序列长度M_QAM=16;%QAM数k=log2(M_QAM);SNR=1:12;%白噪声信噪比,%% ------------------------------------------------------------bit_tx=randint(1,data_len);%产生随机序列echo off;rec_qam16=QamMod(bit_tx,16); %方形16QAM调制star_qam16=SrarQamMod(bit_tx); %星形16QAM调制base_rec=base_shape(fd,fs,f,rec_qam16); %基带成型滤波base_star=base_shape(fd,fs,f,star_qam16); %基带成型滤波for i=1:length(SNR) %信噪比从1dB到12dB计算误码率SNR_=i%方形映射16QAMrf_rec_qam16=CarrierMod(fc,f,base_rec); %载波调制rf_rec_qam16_n=awgn(rf_rec_qam16,SNR(i),'measured'); %加噪声[rec_qam16_rx base_rec_rx]=CarrierDemod(fd,fs,fc,f,rf_rec_qam16_n); %载波解调bit_rec_rx=QamDemod(rec_qam16_rx,16); %MQAM解调[num_qam16,perr_qam16_rec(i)]=biterr(bit_tx,bit_rec_rx);%误码率qam16_data_rec(i,:)=rec_qam16_rx;%scatterplot(rec_qam16_rx);16QAM星形映射%rf_star_qam16=CarrierMod(fc,f,base_star); %载波调制rf_star_qam16_n=awgn(rf_star_qam16,SNR(i),'measured'); %加噪声[star_qam16_rx base_star_rx]=CarrierDemod(fd,fs,fc,f,rf_star_qam16_n); %载波解调bit_star_rx=StarQamDemod(star_qam16_rx); %MQAM解调[num_qam16,perr_qam16_star(i)]=biterr(bit_tx,bit_star_rx);%误码率qam16_data_star(i,:)=star_qam16_rx;%scatterplot(star_qam16_rx);end%% 理论误码率计算SNRtheo=0:0.1:length(SNR);for i=1:length(SNRtheo)SNRdec=10.^(SNRtheo(i)/10);theo_perr_qam16(i)=(3/8)*erfc(sqrt(SNRdec*2/5));end%% 基带波形N=200;n=1:N;t=1:N*10;%发送端波形figure;stem(n,bit_tx(n)); title('发送序列'); %发送序列figure('Name','发送端基带信号');subplot(411);plot(t,real(base_rec(t))); title('方形映射-Q路');subplot(412);plot(t,imag(base_rec(t))); title('方形映射-I路');subplot(413);plot(t,real(base_star(t))); title('星形映射-Q路');subplot(414);plot(t,imag(base_star(t))); title('星形映射-I路');%接收端波形figure;subplot(211);stem(n,bit_rec_rx(n)); title('方形接收序列');subplot(212);stem(n,bit_star_rx(n)); title('星形接收序列');figure('Name','接收端基带信号');subplot(411);plot(t,real(base_rec_rx(t))); title('方形映射-Q路');subplot(412);plot(t,imag(base_rec_rx(t))); title('方形映射-I路');subplot(413);plot(t,real(base_star_rx(t))); title('星形映射-Q路');subplot(414);plot(t,imag(base_star_rx(t))); title('星形映射-I路');%基带眼图N1=20000;Tn=f/fd;eye_rex=base_rec(1:N1);eyediagram(eye_rex,Tn*4,Tn); title('方形基带眼图');eye_star=base_star(1:N1);eyediagram(eye_star,Tn*4,Tn); title('星形基带眼图');%% 接收端星座图%scatterplot(qam16_data_rec(12,:));figure('Name','方形16QAM接收端星座图');for i=3:3:12subplot(2,2,i/3);plot(real(qam16_data_rec(i,:)),imag(qam16_data_rec(i,:)),'.');xmax=5;axis([-xmax xmax -xmax xmax])title(['Snr=',num2str(SNR(i)),' dB']);endfigure('Name','星形16QAM接收端星座图');for i=3:3:12subplot(2,2,i/3);plot(real(qam16_data_star(i,:)),imag(qam16_data_star(i,:)),'.');xmax=3;axis([-xmax xmax -xmax xmax])grid on; title(['Snr=',num2str(SNR(i)),' dB']);end%% 功率谱密度f_plot;%% 误码率分析_x0016_QAM误码率曲线figure('Name','16QAM误码性能对比');% semilogy(SNRtheo,theo_perr_qam16);% hold on;semilogy(SNR,perr_qam16_rec,'*');hold on;semilogy(SNR,perr_qam16_star,'o');xlabel('SNR in dB');ylabel('Prb of Err');legend('方形16QAM','星形16QAM');title('16QAM误码性能对比');%-------------------------------------------------------------------------------%% 基带成型function base_info=base_shape(fd,fs,f,seq_16QAM)%平方根升余弦滤波器,滚降系数0.5,延迟3个采样点flt=rcosine(fd,fs,'sqrt',0.5);%I路和Q路seq_Q=real(seq_16QAM);seq_I=imag(seq_16QAM);%增采样R=fs/fd;up_seq_Q=upsample(seq_Q,R);up_seq_I=upsample(seq_I,R);%升余弦调制rcos_Q=conv(up_seq_Q,flt);rcos_I=conv(up_seq_I,flt);%提升rcos_Q_up=interp(rcos_Q,f/fs);rcos_I_up=interp(rcos_I,f/fs);base_info=rcos_Q_up+j*rcos_I_up;%--------------------------------------------------------------------%% 载波解调function [data_rx base_rx]=CarrierDemod(fd,fs,fc,f,receive)%% 分两路乘正交高频载波rc_length=length(receive);flt=rcosine(fd,fs,'sqrt',0.5);t=0:rc_length-1;rc_Q=receive .* sin(2*pi*fc*t/f);rc_I=receive .* cos(2*pi*fc*t/f);减采样后根升余弦匹配滤波,注意对齐采样点%.down_Q=downsample([0 rc_Q],f/fs);down_I=downsample(rc_I,f/fs);low_Q_rcos=conv(down_Q,flt);low_I_rcos=conv(down_I,flt);base_rx=low_Q_rcos(1:length(low_I_rcos))+j*low_I_rcos;%两次根升余弦滤波延迟,定位初始信号位置Tlay+1:end-delay-1R=fs/fd;delay=3*R*2;rc_Q_seq=(downsample(low_Q_rcos(delay+1:end-delay-1),R));rc_I_seq=(downsample(low_I_rcos(delay+1:end-delay-1),R)); 类型转换%data_rx=rc_Q_seq+j*rc_I_seq;%--------------------------------------------------------------------------%% 载波调制function transmit=CarrierMod(fc,f,base)%载波调制t=0:length(base)-1;high_freq_Q=real(base) .* sin(2*pi*fc*t/f);high_freq_I=imag(base) .* cos(2*pi*fc*t/f);transmit=high_freq_Q+high_freq_I;%------------------------------------------------------------------------------%码元还原为二进制数据QAM 解调程序,将MQAM%QAM码元数据入口参数:data_QAM:%的大小中M_QAM:MQAMM %出口参数:二进制数据比特流%%------------------------------------------------------------------------function data_out=QamDemod(data_QAM,M_QAM)进制码元的Mbit数每个k=log2(M_QAM);% 码元长度data_len=length(data_QAM);%%-------------------------------------------------------------------%QAM信号放缩至与发送端相同比例data_temp=data_QAM(find(real(data_QAM>0))); aver=mean(real(data_temp));data_Qam_temp=data_QAM/aver*(2^(k/2-1));%------------------------------------------------------------------------%平移到第一象限data_Qam_temp2=(data_Qam_temp+(2^(k/2)-1)*(1+j))/2;%----------------------------------------------------------------------%将实部虚部分别映射为二进制数据%实部data_real=round(real(data_Qam_temp2));%实部判决data_real(find(data_real>(2^(k/2)-1)))=2^(k/2)-1;%大于2^(k/2)-1的数据判定为2^(k/2)-1data_real(find(data_real<0))=0;%小于0的数据判为0bit_real=abs(dec2bin(data_real))-'0';%虚部data_imag=round(imag(data_Qam_temp2));%虚部判决data_imag(find(data_imag>(2^(k/2)-1)))=2^(k/2)-1;%大于2^(k/2)-1的数据判定为2^(k/2)-1data_imag(find(data_imag<0))=0;%小于0的数据判为0bit_imag=abs(dec2bin(data_imag))-'0';%------------------------------------------------------------------------%还原为二进制比特流bit_rec=[bit_real,bit_imag]';data_out=reshape(bit_rec,1,data_len*k);%-------------------------------------------------------------------------------------------------------------%% QAM调制程序,实现二进制到MQam调制% 入口参数:binary:二进制数据% M_QAM:MQAM中M的大小% 返回参数:MQAM码元%------------------------------------------------------------------------function data_M = QamMod(binary,M_QAM)k=log2(M_QAM);%每个M进制码元的bit数data_len=length(binary);%比特长度binary_rec=reshape(binary,k,data_len/k)';%转化为data_len/k行,k列,的矩阵,以便转化为16进制M进制%计算实部data_str1=num2str(binary_rec(:,1:k/2));data_m_real=bin2dec(data_str1);%计算虚部data_str2=num2str(binary_rec(:,k/2+1:k));data_m_imag=bin2dec(data_str2);%实部虚部映射到MQamdata_M=((data_m_real*2-2^(k/2)+1)+j*(data_m_imag*2-2^(k/2)+1)).';%---------------------------------------------------------------------------------%% 星形16QAM映射function data_m16 = SrarQamMod(binary)%binary=randint(1,100);%产生随机序列data_len=length(binary);%比特长度binary_rec=reshape(binary,4,data_len/4)';%转化为data_len/4行,4列,的矩阵,以便转化为16进制data_str=num2str(binary_rec);data_dec=bin2dec(data_str);data_mm16=(floor(data_dec/8)+1).*exp(j*45/180*pi*mod(data_dec,8));data_m16=reshape(data_mm16,1,data_len/4);%------------------------------------------------------------------------------%% 星形16QAM解调function data_bit = StarQamDemod(qam_rev)%qam_rev=xing_qam16_noise(1:10);am=abs(qam_rev);%幅度判定am(find(am>2))=2;%幅度大于2的判定为2am(find(am<1.5))=1;%幅度大于2的判定为2%相位判定ang=angle(qam_rev)/pi*180;%将-180度到0度变为180度到360度ang(find(ang<0))=ang(find(ang<0))+360;ang_n=round(ang/45);ang_n(find(ang_n>7))=0;data_dec=8*(round(am)-1)+ang_n;úta_dec(find(data_dec>15))=15;%大于15的判定为15úta_dec(find(data_dec<0))=0;%小于0的判定为0data_bit_rec=dec2bin(data_dec);data_bit=reshape(data_bit_rec',1,length(qam_rev)*4)-'0';。

基于matlab程序的16qam基带信号处理编程.

基于matlab程序的16qam基带信号处理编程.

摘要:正交振幅调制技术(QAM) 由于其高的频带利用率和相对低的误码率而被定为很多数字通信系统的数字传输标准。

该论文讨论了16QAM 调制原理,用软件MATLAB 产生16QAM 信号的算法。

关键词:正交振幅调制;噪声; 多径衰落;内插滤波一、 引言正交振幅调制技术(QAM)是幅度、相位联合调制的技术,它同时利用了载波的幅度和相位来传递信息比特,因此在相邻星座点最小距离相同的条件下,QAM 星座图中可以容纳更多的星座点,即可实现更高的频带利用率。

多进制正交振幅调制技术由于其高的频带利用率和相对低的误码率而被定为很多数字通信系统的数字传输标准。

软件无线电是以可编程的DSP 或CPU 为中心,将模块化、标准化的硬件单元以总线方式连接件起来,构成通用的基本硬件平台,并通过软件加载来实现各种无线通信功能的开放式的体系结构。

本文讨论了16QAM 调制原理并给出了基于Matlab 的16QAM 数字调制的软件算法及其编程实现。

二、 正交振幅调制(QAM )原理正交振幅调制的一般表达式为:2()Re[()()]()cos(2)()sin(2)c j f t MQAM mc ms mc c ms c S t A jA g t e A g t f t A g t f t πππ=+=-上式中,mc A 、ms A 为离散的振幅值,m=1,2…,M ,M 为mc A 和ms A 的个数。

对于 16QAM ,M=4。

()g t 是发送信号脉冲波形。

本报告中16QAM 的调制原理方框图如下图所示:输入数据经过串并变换分成两路,再分别经过映射变换成mc A 和ms A ,mc A 和ms A 决定了已调QAM 信号在信号星座中的星座点的位置。

为减少码间干扰和已调数字信号的带宽,mc A 和ms A 分别通过脉冲成形低通滤波器,脉冲成形低通滤波器是一个平方根升余弦滤波器。

滤波后的输出分别经过半带滤波器、CIC 滤波器实现内插,改变速率,最后经过NCO(数控频率振荡器)产生正交上变频用的正/余弦信号。

(最新整理)MATLAB环境下16QAM调制及解调仿真程序说明

(最新整理)MATLAB环境下16QAM调制及解调仿真程序说明

MATLAB环境下16QAM调制及解调仿真程序说明编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望(MATLAB环境下16QAM调制及解调仿真程序说明)的内容能够给您的工作和学习带来便利。

同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。

本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为MATLAB环境下16QAM调制及解调仿真程序说明的全部内容。

姓名:NikeyMATLAB环境下16QAM调制及解调仿真程序说明一、正交调制及相干解调原理框图正交调制原理框图相干解调原理框图二、MQAM调制介绍及本仿真程序的几点说明MQAM可以用正交调制的方法产生,本仿真中取M=16,即幅度和相位相结合的16个信号点的调制。

为了观察信道噪声对该调制方式的影响,我们在已调信号中又加入了不同强度的高斯白噪声,并统计其译码误码率.为了简化程序和得到可靠的误码率,我们在解调时并未从已调信号中恢复载波,而是直接产生与调制时一模一样的载波来进行信号解调。

三、仿真结果图附源程序代码:main_plot.mclear;clc;echo off;close all;N=10000; %设定码元数量fb=1; %基带信号频率fs=32; %抽样频率fc=4; %载波频率,为便于观察已调信号,我们把载波频率设的较低Kbase=2; % Kbase=1,不经基带成形滤波,直接调制;% Kbase=2,基带经成形滤波器滤波后,再进行调制info=random_binary(N); %产生二进制信号序列[y,I,Q]=qam(info,Kbase,fs,fb,fc); %对基带信号进行16QAM调制y1=y; y2=y;%备份信号,供后续仿真用T=length(info)/fb; m=fs/fb;nn=length(info);dt=1/fs; t=0:dt:T-dt;subplot(211);%便于观察,这里显示的已调信号及其频谱均为无噪声干扰的理想情况%由于测试信号码元数量为10000个,在这里我们只显示其总数的1/10plot(t(1:1000),y(1:1000),t(1:1000),I(1:1000),t(1:1000),Q(1:1000),[0 35],[0 0],’b:');title(’已调信号(In:red,Qn:green)’);%傅里叶变换,求出已调信号的频谱n=length(y); y=fft(y)/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;subplot(223);plot(f,y,’r’);grid on;title('已调信号频谱'); xlabel('f/fb’);%画出16QAM调制方式对应的星座图subplot(224);constel(y1,fs,fb,fc); title('星座图');SNR_in_dB=8:2:24; %AWGN信道信噪比for j=1:length(SNR_in_dB)y_add_noise=awgn(y2,SNR_in_dB(j));%加入不同强度的高斯白噪声y_output=qamdet(y_add_noise,fs,fb,fc); %对已调信号进行解调numoferr=0;for i=1:Nif (y_output(i)~=info(i)),numoferr=numoferr+1;end;end;Pe(j)=numoferr/N; %统计误码率end;figure;semilogy(SNR_in_dB,Pe,'red*—’);grid on;xlabel('SNR in dB’);ylabel(’Pe’);title(’16QAM调制在不同信道噪声强度下的误码率’);random_binary。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

16QAM-星形和矩形星座图调制解调MATLAB代码%%------------------------------------------------------------ % 软件无线电课程设计%% 方形、星形16QAM调制解调仿真%%%------------------------------------------------------------%%主程序clcclear%% 定义参数fd=250*10^6; %码元速率250Mfs=2500*10^6; %滤波器采样率fc=2500*10^6; %载波频率2.5Gf=10000*10^6; %对载波采样data_len=200000; %数据长度sym_len=data_len/4; %码元序列长度M_QAM=16;%QAM数k=log2(M_QAM);SNR=1:12;%白噪声信噪比,%%------------------------------------------------------------ bit_tx=randint(1,data_len);%产生随机序列echo off;rec_qam16=QamMod(bit_tx,16);%方形16QAM调制star_qam16=SrarQamMod(bit_tx);%星形16QAM调制base_rec=base_shape(fd,fs,f,rec_qam16);%基带成型滤波base_star=base_shape(fd,fs,f,star_qam16); %基带成型滤波fori=1:length(SNR) %信噪比从1dB到12dB计算误码率SNR_=i%方形映射16QAMrf_rec_qam16=CarrierMod(fc,f,base_rec);%载波调制rf_rec_qam16_n=awgn(rf_rec_qam16,SNR(i),'m easured'); %加噪声[rec_qam16_rxbase_rec_rx]=CarrierDemod(fd,fs,fc,f,rf_rec_qa m16_n); %载波解调bit_rec_rx=QamDemod(rec_qam16_rx,16);%MQAM解调[num_qam16,perr_qam16_rec(i)]=biterr(bit_tx, bit_rec_rx);%误码率qam16_data_rec(i,:)=rec_qam16_rx;%scatterplot(rec_qam16_rx);%星形映射16QAMrf_star_qam16=CarrierMod(fc,f,base_star);%载波调制rf_star_qam16_n=awgn(rf_star_qam16,SNR(i),' measured'); %加噪声[star_qam16_rxbase_star_rx]=CarrierDemod(fd,fs,fc,f,rf_star_ qam16_n); %载波解调bit_star_rx=StarQamDemod(star_qam16_rx);%MQAM解调[num_qam16,perr_qam16_star(i)]=biterr(bit_tx ,bit_star_rx);%误码率qam16_data_star(i,:)=star_qam16_rx;%scatterplot(star_qam16_rx);end%% 理论误码率计算SNRtheo=0:0.1:length(SNR);for i=1:length(SNRtheo)SNRdec=10.^(SNRtheo(i)/10);theo_perr_qam16(i)=(3/8)*erfc(sqrt(SNRdec*2/ 5));end%% 基带波形N=200;n=1:N;t=1:N*10;%发送端波形figure;stem(n,bit_tx(n)); title('发送序列'); %发送序列figure('Name','发送端基带信号');subplot(411);plot(t,real(base_rec(t))); title('方形映射-Q路');subplot(412);plot(t,imag(base_rec(t))); title('方形映射-I路');subplot(413);plot(t,real(base_star(t))); title('星形映射-Q路subplot(414);plot(t,imag(base_star(t))); title('星形映射-I路');%接收端波形figure;subplot(211);stem(n,bit_rec_rx(n)); title('方形接收序列');subplot(212);stem(n,bit_star_rx(n)); title('星形接收序列');figure('Name','接收端基带信号');subplot(411);plot(t,real(base_rec_rx(t))); title('方形映射-Q 路');subplot(412);plot(t,imag(base_rec_rx(t))); title('方形映射-I 路');subplot(413);plot(t,real(base_star_rx(t))); title('星形映射-Q路');subplot(414);plot(t,imag(base_star_rx(t))); title('星形映射-I路');%基带眼图N1=20000;Tn=f/fd;eye_rex=base_rec(1:N1);eyediagram(eye_rex,Tn*4,Tn); title('方形基带眼图');eye_star=base_star(1:N1);eyediagram(eye_star,Tn*4,Tn); title('星形基带眼图');%% 接收端星座图%scatterplot(qam16_data_rec(12,:));figure('Name','方形16QAM接收端星座图'); for i=3:3:12subplot(2,2,i/3);plot(real(qam16_data_rec(i,:)),imag(qam16_data_rec(i,:)),'.');xmax=5;axis([-xmax xmax -xmax xmax])title(['Snr=',num2str(SNR(i)),' dB']);endfigure('Name','星形16QAM接收端星座图'); for i=3:3:12subplot(2,2,i/3);plot(real(qam16_data_star(i,:)),imag(qam16_dat a_star(i,:)),'.');xmax=3;axis([-xmax xmax -xmax xmax])grid on; title(['Snr=',num2str(SNR(i)),' dB']);end%% 功率谱密度f_plot;%% 误码率分析%16QAM误码率曲线figure('Name','16QAM误码性能对比');% semilogy(SNRtheo,theo_perr_qam16);% hold on;semilogy(SNR,perr_qam16_rec,'*');hold on;semilogy(SNR,perr_qam16_star,'o');xlabel('SNR in dB');ylabel('Prb of Err');legend('方形16QAM','星形16QAM');title('16QAM误码性能对比');%-------------------------------------------------------------------------------%% 基带成型functionbase_info=base_shape(fd,fs,f,seq_16QAM)%平方根升余弦滤波器,滚降系数0.5,延迟3个采样点flt=rcosine(fd,fs,'sqrt',0.5);%I路和Q路seq_Q=real(seq_16QAM);seq_I=imag(seq_16QAM);%增采样R=fs/fd;up_seq_Q=upsample(seq_Q,R);up_seq_I=upsample(seq_I,R);%升余弦调制rcos_Q=conv(up_seq_Q,flt);rcos_I=conv(up_seq_I,flt);%提升rcos_Q_up=interp(rcos_Q,f/fs);rcos_I_up=interp(rcos_I,f/fs);base_info=rcos_Q_up+j*rcos_I_up;%--------------------------------------------------------------------%% 载波解调function [data_rxbase_rx]=CarrierDemod(fd,fs,fc,f,receive)%% 分两路乘正交高频载波rc_length=length(receive);flt=rcosine(fd,fs,'sqrt',0.5);t=0:rc_length-1;rc_Q=receive .* sin(2*pi*fc*t/f);rc_I=receive .* cos(2*pi*fc*t/f);%减采样后根升余弦匹配滤波,注意对齐采样点down_Q=downsample([0 rc_Q],f/fs);down_I=downsample(rc_I,f/fs);low_Q_rcos=conv(down_Q,flt);low_I_rcos=conv(down_I,flt);base_rx=low_Q_rcos(1:length(low_I_rcos))+j*lo w_I_rcos;%两次根升余弦滤波延迟,定位初始信号位置%delay+1:end-delay-1R=fs/fd;delay=3*R*2;rc_Q_seq=(downsample(low_Q_rcos(delay+1:en d-delay-1),R));rc_I_seq=(downsample(low_I_rcos(delay+1:end -delay-1),R)); %类型转换data_rx=rc_Q_seq+j*rc_I_seq;%--------------------------------------------------------------------------%% 载波调制function transmit=CarrierMod(fc,f,base)%载波调制t=0:length(base)-1;high_freq_Q=real(base) .* sin(2*pi*fc*t/f); high_freq_I=imag(base) .* cos(2*pi*fc*t/f);transmit=high_freq_Q+high_freq_I;%------------------------------------------------------------------------------%% QAM解调程序,将MQAM码元还原为二进制数据% 入口参数:data_QAM:QAM码元数据% M_QAM:MQAM中M的大小% 出口参数:二进制数据比特流%------------------------------------------------------------------------functiondata_out=QamDemod(data_QAM,M_QAM)k=log2(M_QAM);%每个M进制码元的bit数data_len=length(data_QAM);%码元长度%-------------------------------------------------------------------%QAM信号放缩至与发送端相同比例data_temp=data_QAM(find(real(data_QAM>0) ));aver=mean(real(data_temp));data_Qam_temp=data_QAM/aver*(2^(k/2-1));%------------------------------------------------------------------------%平移到第一象限data_Qam_temp2=(data_Qam_temp+(2^(k/2)-1 )*(1+j))/2;%----------------------------------------------------------------------%将实部虚部分别映射为二进制数据%实部data_real=round(real(data_Qam_temp2));%实部判决data_real(find(data_real>(2^(k/2)-1)))=2^(k/2)-1 ;%大于2^(k/2)-1的数据判定为2^(k/2)-1data_real(find(data_real<0))=0;%小于0的数据判为0bit_real=abs(dec2bin(data_real))-'0';%虚部data_imag=round(imag(data_Qam_temp2));%虚部判决data_imag(find(data_imag>(2^(k/2)-1)))=2^(k/2 )-1;%大于2^(k/2)-1的数据判定为2^(k/2)-1 data_imag(find(data_imag<0))=0;%小于0的数据判为0bit_imag=abs(dec2bin(data_imag))-'0';%------------------------------------------------------------------------%还原为二进制比特流bit_rec=[bit_real,bit_imag]';data_out=reshape(bit_rec,1,data_len*k);%-------------------------------------------------------------------------------------------------------------%% QAM调制程序,实现二进制到MQam调制% 入口参数:binary:二进制数据% M_QAM:MQAM中M的大小% 返回参数:MQAM码元%------------------------------------------------------------------------function data_M = QamMod(binary,M_QAM)k=log2(M_QAM);%每个M进制码元的bit数data_len=length(binary);%比特长度binary_rec=reshape(binary,k,data_len/k)';%转化为data_len/k行,k列,的矩阵,以便转化为16进制M进制%计算实部data_str1=num2str(binary_rec(:,1:k/2));data_m_real=bin2dec(data_str1);%计算虚部data_str2=num2str(binary_rec(:,k/2+1:k)); data_m_imag=bin2dec(data_str2);%实部虚部映射到MQamdata_M=((data_m_real*2-2^(k/2)+1)+j*(data_m _imag*2-2^(k/2)+1)).';%---------------------------------------------------------------------------------%% 星形16QAM映射function data_m16 = SrarQamMod(binary)%binary=randint(1,100);%产生随机序列data_len=length(binary);%比特长度binary_rec=reshape(binary,4,data_len/4)';%转化为data_len/4行,4列,的矩阵,以便转化为16进制data_str=num2str(binary_rec);data_dec=bin2dec(data_str);data_mm16=(floor(data_dec/8)+1).*exp(j*45/18 0*pi*mod(data_dec,8));data_m16=reshape(data_mm16,1,data_len/4);%------------------------------------------------------------------------------%% 星形16QAM解调function data_bit = StarQamDemod(qam_rev) %qam_rev=xing_qam16_noise(1:10);am=abs(qam_rev);%幅度判定am(find(am>2))=2;%幅度大于2的判定为2 am(find(am<1.5))=1;%幅度大于2的判定为2%相位判定ang=angle(qam_rev)/pi*180;%将-180度到0度变为180度到360度ang(find(ang<0))=ang(find(ang<0))+360;ang_n=round(ang/45);ang_n(find(ang_n>7))=0;data_dec=8*(round(am)-1)+ang_n;%data_dec(find(data_dec>15))=15;%大于15的判定为15%data_dec(find(data_dec<0))=0;%小于0的判定为0data_bit_rec=dec2bin(data_dec);data_bit=reshape(data_bit_rec',1,length(qam_re v)*4)-'0';。

相关文档
最新文档