通信人家园

标题: 16QAM调制解调 for matlab  [查看完整版帖子] [打印本页]

时间:  2012-12-16 22:53
作者: kuntanner     标题: 16QAM调制解调 for matlab

一、
M=16;
k=log2(M);
x=randint(30000,1);%产生二进制随机数
y=modulate(modem.qammod('M',16,'InputType','Bit'),x);%调制
EbNo=-5:1:10;%信噪比
s_b2d=bi2de(reshape(x,k,length(x)/k).','left-msb');%二进制变为十进制
for n=1:length(EbNo)
    snr(n)=EbNo(n)+10*log10(k);%Ratio of symbol energy to noise power spectral density
    ynoisy=awgn(y,snr(n),'measured');%加入高斯白噪声
    z=demodulate(modem.qamdemod('M',16,'OutputType','Bit'),ynoisy);%解调
    r_b2d=bi2de(reshape(z,k,length(z)/k).','left-msb');%二进制变为十进制
    [sym(n),sym_rate(n)]=symerr(s_b2d,r_b2d);%计算仿真误码率,不是误比特率。
    theo_sym_rate(n)=(3/2*erfc(sqrt(k*0.1*(10.^(EbNo(n)/10)))))*(1-3/8*erfc(sqrt(k*0.1*(10.^(EbNo(n)/10)))));
   %《移动通信》P55的式子,已化简。
end
disp(sym);
disp(sym_rate);
semilogy(EbNo,sym_rate,'r*',EbNo,theo_sym_rate,'b-');%画图。
title('误码率性能');
xlabel('Eb/No(dB)');
ylabel('误码特率');
legend('仿真误码率','理论误码率');
h=scatterplot(ynoisy(1:1*5e3),1,0,'g.');%画图。
hold on;
scatterplot(y(1:1*5e3),1,0,'r*',h);%画图。
title('Received Signal');
legend('接收信号','星座点');
axis([-5 5 -5 5]);




二、用自己编写程序产生高斯白噪声
%用R2008a运行是没有问题的,低于这个版本的可能有问题。
%单步运行就会知道每个语句的意思了的。
M=16;
k=log2(M);
x=randint(30000,1);%产生二进制随机数
y=modulate(modem.qammod('M',16,'InputType','Bit'),x);%调制

mod=abs(y);%对y求模
Es=mean(mod.*mod);%对y的模取平方,得出了平均符号的能量

EbNo=-5:1:10;%信噪比
s_b2d=bi2de(reshape(x,k,length(x)/k).','left-msb');%二进制变为十进制
for n=1:length(EbNo)
    snr(n)=EbNo(n)+10*log10(k);%Ratio of symbol energy to noise power spectral density

    noisy=wgn(length(y),1,10*log10(Es)-snr(n),'complex');%产生高斯白噪声
    ynoisy=y+noisy;%加入高斯白噪声


    z=demodulate(modem.qamdemod('M',16,'OutputType','Bit'),ynoisy);%解调
    r_b2d=bi2de(reshape(z,k,length(z)/k).','left-msb');%二进制变为十进制
    [sym(n),sym_rate(n)]=symerr(s_b2d,r_b2d);%计算仿真误码率,不是误比特率。
    theo_sym_rate(n)=(3/2*erfc(sqrt(k*0.1*(10.^(EbNo(n)/10)))))*(1-3/8*erfc(sqrt(k*0.1*(10.^(EbNo(n)/10)))));
   %《移动通信》P55的式子,已化简。
end
disp(sym);
disp(sym_rate);
semilogy(EbNo,sym_rate,'r*',EbNo,theo_sym_rate,'b-');%画图。
title('误码率性能');
xlabel('Eb/No(dB)');
ylabel('误码特率');
legend('仿真误码率','理论误码率');
h=scatterplot(ynoisy(1:1*5e3),1,0,'g.');%画图。
hold on;
scatterplot(y(1:1*5e3),1,0,'r*',h);%画图。
title('Received Signal');
legend('接收信号','星座点');
axis([-5 5 -5 5]);
hold off;



三、
M=16;
k=log2(M);
EbNo=-5:1:10;%信噪比
for n=1:length(EbNo)
    for m=1:5
       x=round(rand(3000,1));%产生二进制随机数
         snr(n)=EbNo(n)+10*log10(k);%Ratio of symbol energy to noise power spectral density
         xsym=bi2de(reshape(x,k,length(x)/k).','left-msb');%二进制变为十进制
         y=modulate(modem.qammod('M',16,'InputType','Bit'),x);%调制
         ynoisy=awgn(y,snr(n),'measured');%加入高斯白噪声
         z=demodulate(modem.qamdemod('M',16,'OutputType','Bit'),ynoisy);%解调
         zsym=bi2de(reshape(z,k,length(z)/k).','left-msb');%二进制变为十进制
         [sym0(m),sym_rate0(m)]=symerr(xsym,zsym);%计算仿真误码率,不是误比特率。
    end
    sym_rate(n)=sum(sym_rate0)/5;
    theo_sym_rate(n)=(3/2*erfc(sqrt(k*0.1*(10.^(EbNo(n)/10)))))*(1-3/8*erfc(sqrt(k*0.1*(10.^(EbNo(n)/10)))));
              %《移动通信》P55的式子,已化简。
end
figure(1)
subplot(1,2,1)
plot(EbNo,sym_rate,'ro',EbNo,theo_sym_rate,'b-');
axis([-5,10,10^-3,10^0]);
xlabel('Eb/No(dB) ');
ylabel('误码率Pe');
title('误码率性能');
legend('仿真误码率','理论误码率');
subplot(1,2,2)
plot(ynoisy(1:1*750),'r.');%画图。
hold on;
plot(y(1:1*750),'b*');
axis([-5,5,-5,5]);
xlabel('I ');
ylabel('Q ');
legend('接收信号','星座点');
title('16QAM 星座图');







通信人家园 (https://www.txrjy.com/) Powered by C114