📄 test_16qam.asv
字号:
global dt t f df N T
close all
clear Eb_N0 Pe
N=2^10; %采样点数
L=32; %每码元的采样点数
M=N/L %码元数
Rb=2; %码速率是2Mb/s
Ts=1/Rb; %码元间隔
dt=Ts/L; %时域采样间隔
df=1/(N*dt) %频域采样间隔
T=N*dt %截短时间
Bs=N*df/2 %系统带宽
alpha=0.5 %滚降系数
fc=15
Na=4; %示波器扫描宽度为4个码元
t=linspace(-T/2,T/2,N); %时域横坐标
f=linspace(-Bs,Bs,N)+eps; %频域横坐标
carry1=sqrt(2)*cos(2*pi*fc*t); %同相载波
carry2=-sqrt(2)*sin(2*pi*fc*t); %正交载波
figure(1)
set(1,'Position',[50,100,400,600])
figure(2)
set(2,'Position',[500,100,400,600])
figure(4)
set(4,'Position',[500,100,400,600])
%升余弦
hr1=sin(pi*t/Ts)./(pi*t/Ts);
hr2=cos(alpha*pi*t/Ts)./(1-(2*alpha*t/Ts).^2);
hr=hr1.*hr2;
HR=abs(t2f(hr));%取模是为了忽略时延
GT=sqrt(HR);
GR=GT;
for loop1=1:10
Eb_N0(loop1)=(loop1-1) %Eb/N0 in dB
eb_n0(loop1)=10^(Eb_N0(loop1)/10);
Eb=1;
n0=Eb/eb_n0(loop1); %信道的噪声谱密度
sita=n0*Bs; %信道中噪声功率
n_err=0; %误码计数
EP=zeros(size(f))+eps;
EP1=zeros(size(f))+eps;
for loop2=1:3 %循环3次求Pe取平均值
a=round(rand(1,M));
b1=a(1:2:M); %b1为同相支路序列,b2为正交支路序列
c1=zeros(1,0.25*M);
for i=1:0.25*M
if b1(2*i-1)==1&b1(2*i)==0
c1(i)=1;
elseif b1(2*i-1)==1&b1(2*i)==1
c1(i)=3;
elseif b1(2*i-1)==0&b1(2*i)==0
c1(i)=-1;
elseif b1(2*i-1)==0&b1(2*i)==1
c1(i)=-3;
end
end
b2=a(2:2:M);
c2=zeros(1,0.25*M);
for j=1:0.25*M
if b2(2*j-1)==1&b2(2*j)==0
c2(j)=1;
elseif b2(2*j-1)==1&b2(2*j)==1
c2(j)=3;
elseif b2(2*j-1)==0&b2(2*j)==0
c2(j)=-1;
elseif b2(2*j-1)==0&b2(2*j)==1
c2(j)=-3;
end
end
imp1=zeros(1,N); %产生冲激序列(同相支路)imp1
imp1(2*L:4*L:N)=c1/dt;
imp2=zeros(1,N); %产生冲激序列(正交支路)imp2
imp2(2*L:4*L:N)=c2/dt;
IMP1=t2f(imp1);
IMP2=t2f(imp2);
si=real(f2t(IMP1.*GT));
S=t2f(si);
sq=real(f2t(IMP2.*GT));
ssi=si.*carry1; %发送信号同相支路
ssq=sq.*carry2; %发送信号正交支路
ss=ssi+ssq;
n0=sqrt(sita)*randn(size(t)); %信道噪声
d=ss+n0; %接收信号
r1=d.*carry1;
r2=d.*carry2;
Y1=t2f(r1).*GR;
Y2=t2f(r2).*GR;
y1=real(f2t(Y1));
y2=real(f2t(Y2));
aa1=y1(2*L:4*L:N); %同相支路取样
aaa1=zeros(1,0.5*M);
for ii=1:0.25*M
if aa1(ii)>=2
aaa1(2*ii-1)=1;aaa1(2*ii)=1;
elseif aa1(ii)>=0
aaa1(2*ii-1)=1;aaa1(2*ii)=0;
elseif aa1(ii)>=-2
aaa1(2*ii-1)=0;aaa1(2*ii)=0;
elseif aa1(ii)<-2
aaa1(2*ii-1)=0;aaa1(2*ii)=1;
end
end
aa2=y2(2*L:4*L:N); %正交支路取样
aaa2=zeros(1,0.5*M);
for jj=1:0.25*M
if aa2(jj)>=2
aaa2(2*jj-1)=1;aaa2(2*jj)=1;
elseif aa2(jj)>=0
aaa2(2*jj-1)=1;aaa2(2*jj)=0;
elseif aa2(jj)>=-2
aaa2(2*jj-1)=0;aaa2(2*jj)=0;
elseif aa2(jj)<-2
aaa2(2*jj-1)=0;aaa2(2*jj)=1;
end
end
aa=zeros(1,M);
aa(1:2:M)=aaa1;
aa(2:2:M)=aaa2;
P1=S.*conj(S)/T; %发送根号升余弦信号的功率谱
EP1=(EP1*(loop2-1)+P1+eps)/loop2;
P=Y1.*conj(Y1)/T; %升余弦信号的功率谱
EP=(EP*(loop2-1)+P+eps)/loop2;
n_err=n_err+length(find(aa~=a))
end
Pe(loop1)=n_err/(M*loop2) %平均误码率=误码总数/(码元数×循环次数)
figure(3)
semilogy(Eb_N0,Pe,'g');
eb_n0=10.^(Eb_N0/10);
hold on
semilogy(Eb_N0,0.5*erfc(sqrt(eb_n0)));
axis([0,9,1e-4,1])
xlabel('Eb/N0')
ylabel('Pe')
legend('16QAM误比特率曲线','2PSK误比特率曲线')
end
figure(1) %调制解调信号的波形
subplot(2,1,1) %发送的调制信号
plot(t/Ts,ssi);
hold on
xlabel('t/Ts');
ylabel('信号幅度');
axis([-5,5,-5,5]); %只取20个码元进行观察
title('16QAM同相支路信号');
plot(t/Ts,si*sqrt(2),'g');
plot(t/Ts,-si*sqrt(2),'g');
subplot(2,1,2) %接收的解调信号
plot(t/Ts,y1/sqrt(2));
xlabel('t/Ts');
ylabel('信号幅度');
axis([-5,5,-3,3]); %只取20个码元进行观察
title('同相支路解调信号波形)');
figure(2)
subplot(2,1,1);
plot(f,30+10*log10(EP1),'g');
axis([-3,+3,-50,50])
xlabel('f (MHz)')
ylabel('Ps(f) (dBm/MHz)')
title('调制信号功率谱密度')
subplot(2,1,2); %画眼图
hold on
tt=[0:dt:Na*L*dt];
for jj=1:Na*L:N-Na*L
plot(tt,si(jj:jj+Na*L));
xlabel('t in us')
ylabel('y(t) in V')
title('调制信号眼图')
end
figure(4)
subplot(2,1,1);
plot(f,30+10*log10(EP),'g');
axis([-3,+3,-50,50])
xlabel('f (MHz)')
ylabel('Ps(f) (dBm/MHz)')
title('解调信号功率谱密度')
subplot(2,1,2); %画眼图
hold on
tt=[0:dt:Na*L*dt];
for jj=1:Na*L:N-Na*L
plot(tt,y1(jj:jj+Na*L));
xlabel('t in us')
ylabel('y(t) in V')
title('解信号眼图')
end
figure(5)
subplot(2,1,1)
stem(c1,c2,'filled');
grid on
axis([-5,5,-5,5]);
subplot(2,1,2)
stem(aa1,aa2,'filled');
grid on
axis([-5,5,-5,5]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -