qpsk.m
来自「QPSK程序代码 非常有用的东西 尽管不是本人原创」· M 代码 · 共 140 行
M
140 行
data=rand(1,10)>0.5;
fb=500;fc=500;
M=32;
tb=1/fb;tc=1/fc;
step=tb/M; ebn0=25; fs=M/tb;
data1=data*2-1;
datai=data1(1:2:10-1);
dataq=data1(2:2:10);
for i = 1:10
for j = 1:M
m((i-1)*M+j)=data1(i);
end
end
m1=abs(fft(m));
for j = 1:5
for i = 1:2*M
mi((j-1)*2*M+i)=datai(j);
end
for i= 1:2*M
mq((j-1)*2*M+i)=dataq(j);
end
end
for k=1:M*10
t(k)=(k-1)*step;
si(k)=mi(k)*cos(2*pi*fc*t(k));
sq(k)=mq(k)*sin(2*pi*t(k)*fc);
s(k)=si(k)+sq(k);
end
s1=abs(fft(s));
spow=sum(mi.*mi+mq.*mq)/10;
attn=0.5*spow*250/fb*10.^(-ebn0/10);
attn=sqrt(attn);
n0=randn(1,320).*attn;
ss=s+n0;
mi_r=ss.*cos(2*pi*fc*t);
mq_r=ss.*sin(2*pi*fc*t);
B=fir1(60,0.01);
i_filter=filter(B,1,mi_r);
q_filter=filter(B,1,mq_r);
% f=0:0.01:0.1;
% xrc=0.5+0.5*cos(pi*f);
% i_filter=conv(mi_r,xrc)/5.5;
% q_filter=conv(mq_r,xrc)/5.5;
for j=1:5
ichsum(j)=sum(i_filter((j-1)/step+1:j/step))*step;
if ichsum(j)>=0
i_r(j)=1;
else
i_r(j)=0;
end
qchsum(j)=sum(q_filter((j-1)/step+1:j/step))*step;
if qchsum(j)>=0
q_r(j)=1;
else
q_r(j)=0;
end
end
datar=zeros(1,10);
for i=1:5
datar(2*i-1)=i_r(i);
datar(2*i)=q_r(i);
end
int=0;
for i=1:10
if datar(i)~=data(i)
int=int+1;
end
end
pe=int/10
h = spectrum.welch;
figure
subplot(3,1,1)
plot(t,m)
grid
title('Input Waveform')
subplot(3,1,2)
plot(t,mi)
grid
title('I Channel Waveform')
subplot(3,1,3)
plot(t,mq)
grid
title('Q Channel Waveform')
figure
subplot(3,1,1)
plot(t,si)
grid
title('I Channel Modulated Waveform')
subplot(3,1,2)
plot(t,sq)
grid
title('Q Channel Modulated Waveform')
subplot(3,1,3)
plot(t,s)
grid
title('QPSK Waveform')
figure
plot(t,ss)
title('QPSK of adding noise')
figure
subplot(2,1,1)
plot(t,mi_r)
subplot(2,1,2)
plot(t,mq_r)
figure
subplot(2,1,1)
plot(i_filter)
subplot(2,1,2)
plot(q_filter)
figure
subplot(2,1,1)
plot(fftshift(m1)),title('base signal spectrum')
subplot(2,1,2)
psd(h,m,'fs',fs),title('baseband signal power spectrum');
figure
subplot(2,1,1)
plot(fftshift(s1))
subplot(2,1,2)
psd(h,s,'fs',fs),title('Modulated signal power spectrum');
figure
for i=1:10/2
plot(si(i),sq(i),'ro'),title('constellation');hold on;
axis([-2 2 -2 2]);
plot(i_r(i),q_r(i),'*');hold on;
legend('before channel','after channel');
end
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?