一次作业记录,出的图全为SNR vs BER。
1.QPSK
1.1 自然映射
自然映射下的QPSK如图所示:
BER计算代码如下:
%本代码为自然映射下的QPSK调制
clear all;
close all;
%生成10000个01/11/00/10的随机数列作为初始信号
r=randint(1,20000);
%分成两列,第一列代表实部,第二列代表虚部
s=reshape(r,10000,2);
rs=s;
k=1;
%按星座图对信号进行调制
for i=1:1:10000
if (s(i,1)==1 && s(i,2)==0)
s(i,1)=-sqrt(2)/2;
s(i,2)=-sqrt(2)/2;
end
if (s(i,1)==0 && s(i,2)==1)
s(i,1)=-sqrt(2)/2;
s(i,2)=sqrt(2)/2;
end
if (s(i,1)==0 && s(i,2)==0)
s(i,1)=sqrt(2)/2;
s(i,2)=sqrt(2)/2;
end
if (s(i,1)==1 && s(i,2)==1)
s(i,1)=sqrt(2)/2;
s(i,2)=-sqrt(2)/2;
end
end
for snrdb=1:1:10
%给信号加上功率为snr(db)的高斯白噪声信号
x=awgn(s,snrdb,'measured');
%解调
for j=1:1:10000
if x(j,1)>=0 && x(j,2)>=0
y(j,1)=0;
y(j,2)=0;
end
if x(j,1)<0 && x(j,2)>0
y(j,1)=0;
y(j,2)=1;
end
if x(j,1)<0 && x(j,2)<0
y(j,1)=1;
y(j,2)=0;
end
if x(j,1)>0 && x(j,2)<0
y(j,1)=1;
y(j,2)=1;
end
end
%找出错误码
error=y~=rs;
%计算误码率
ber(k)=sum(sum(error))/20000;
k=k+1;
end
snrdb=1:1:10;
semilogy(snrdb,ber);
title('QPSK with natural mapping');
xlabel('SER');
ylabel('BER');
1.2 格雷映射
格雷映射下的QPSK如图所示:
格雷映射与自然映射过程相同,故这里仅列出格雷映射调制过程,解调过程亦类似。
for i=1:1:10000
if (s(i,1)==1 && s(i,2)==1)
s(i,1)=-sqrt(2)/2;
s(i,2)=-sqrt(2)/2;
end
if (s(i,1)==0 && s(i,2)==1)
s(i,1)=-sqrt(2)/2;
s(i,2)=sqrt(2)/2;
end
if (s(i,1)==0 && s(i,2)==0)
s(i,1)=sqrt(2)/2;
s(i,2)=sqrt(2)/2;
end
if (s(i,1)==1 && s(i,2)==0)
s(i,1)=sqrt(2)/2;
s(i,2)=-sqrt(2)/2;
end
end
2.1 自然映射
自然映射下的16QAM如图所示:
代码如下:
%本代码为自然映射下的16QAM调制
clear all;
close all;
a=sqrt(1/10);
%随机生成4000个0/1作为初始信号
s=randint(1,4000);
%分成4列
B = reshape(s,4,1000);
C = B;
B1 = B(1,:);
B2 = B(2,:);
B3 = B(3,:);
B4 = B(4,:);
%在这里我们仍然借用格雷映射的调制公式
%但在调制前将不同的码位置换掉
for i=1:1000
if B1(i)==0 && B2(i)==0 && B3(i)==1 && B4(i)==0
B4(i)=1;
end
if B1(i)==0 && B2(i)==0 && B3(i)==1 && B4(i)==1
B4(i)=0;
end
if B1(i)==1 && B2(i)==0 && B3(i)==1 && B4(i)==1
B4(i)=0;
end
if B1(i)==1 && B2(i)==0 && B3(i)==1 && B4(i)==0
B4(i)=1;
end
if B1(i)==1 && B2(i)==1 && B3(i)==1 && B4(i)==1
B4(i)=0;
end
if B1(i)==1 && B2(i)==1 && B3(i)==1 && B4(i)==0
B4(i)=1;
end
if B1(i)==0 && B2(i)==1 && B3(i)==1 && B4(i)==1
B4(i)=0;
end
if B1(i)==0 && B2(i)==1 && B3(i)==1 && B4(i)==0
B4(i)=1;
end
end
%根据星座图调制信号
tx = a*(-2*(B3-0.5).*(3-2*B4)-j*2*(B1-0.5).*(3-2*B2));
for snrdb = 1:1:20;
%向信号中加入噪声
rx = awgn(tx,snrdb);
%解调信号
B5 = imag(rx)<0;
B6 = (imag(rx)<2*a) & (imag(rx)>-2*a);
B7 = real(rx)<0;
B8 = (real(rx)<2*a) & (real(rx)>-2*a);
%解调后还原信号
for i=1:1000
if B5(i)==0 && B6(i)==0 && B7(i)==1 && B8(i)==0
B4(i)=1;
end
if B5(i)==0 && B6(i)==0 && B7(i)==1 && B8(i)==1
B4(i)=0;
end
if B5(i)==1 && B6(i)==0 && B7(i)==1 && B8(i)==1
B8(i)=0;
end
if B5(i)==1 && B6(i)==0 && B7(i)==1 && B8(i)==0
B8(i)=1;
end
if B5(i)==1 && B6(i)==1 && B7(i)==1 && B8(i)==1
B8(i)=0;
end
if B5(i)==1 && B6(i)==1 && B7(i)==1 && B8(i)==0
B8(i)=1;
end
if B5(i)==0 && B6(i)==1 && B7(i)==1 && B8(i)==1
B8(i)=0;
end
if B5(i)==0 && B6(i)==1 && B7(i)==1 && B8(i)==0
B8(i)=1;
end
end
rs = [B5;B6;B7;B8];
%计算BER
error = rs~=C;
BER(snrdb) = sum(sum(error)) / 4000;
end
snrdb = 1:1:20;
semilogy(snrdb,BER);
title('16QAM with natural mapping');
xlabel('SNR');
ylabel('BER');
2.2 格雷映射