close all;clc;clear;
fc=2.5e6; % 载波频率为2.5MHZ
len=10000; % 取1万个数
Fs=10e6; % 采样率是10MHZ
% 基带信号的产生
%% 产生输入序列
data0 = randi([0,1],len,1);
figure;
subplot(2,1,1);stairs(data0(1:len)),axis([0 250 -0.2 1.2]),title('基带信号');grid on;
subplot(2,1,2);plot(20*log(abs(fft(data0(1:len))))),axis([0 len -100 200]),title('基带信号的频谱'); grid on;
%% 串并转换,将奇偶位数据分开
I = kron((data0(1:2:len,:)*2-1)',[1,1]);
Q = kron((data0(2:2:len,:)*2-1)',[1,1]);
figure;
subplot(2,2,1);stairs(I),axis([0 250 -1.2 1.2]),title('I路信号');grid on;
subplot(2,2,2);plot(20*log(abs(fft(I)))),axis([0 len -150 200]),title('I路信号的频谱'); grid on;
subplot(2,2,3);stairs(Q),axis([0 250 -1.2 1.2]),title('Q路信号');grid on;
subplot(2,2,4);plot(20*log(abs(fft(Q)))),axis([0 len -150 200]),title('Q路信号的频谱'); grid on;
%% 插0 1万个数个数变成了4万个
zero_interval = 4;
I0=zeros(1,zero_interval*len);
Q0=zeros(1,zero_interval*len);
I0(1:zero_interval:zero_interval*len) = I;
Q0(1:zero_interval:zero_interval*len) = Q;
figure;
subplot(2,2,1);stairs(I0),axis([0 250 -1.2 1.2]),title('内插0后的I路信号');grid on;
subplot(2,2,2);plot(20*log(abs(fft(I0)))),axis([0 zero_interval*len -700 250]),title('内插0后I路信号的频谱'); grid on;
subplot(2,2,3);stairs(Q0),axis([0 250 -1.2 1.2]),title('内插0后的Q路信号');grid on;
subplot(2,2,4);plot(20*log(abs(fft(Q0)))),axis([0 zero_interval*len -700 250]),title('内插0后Q路信号的频谱'); grid on;
%平方根升余弦滤波器
NT = 16; %滤波器阶数
num=2*zero_interval*NT;%128
rf = 0.1; %滚降系数
Fs=10e6;% 采样率是101HZ
psf=rcosfir(rf,NT,zero_interval,Fs,'sqrt');
Ipulse = conv(I0,psf);
Qpulse = conv(Q0,psf);
figure(4);
subplot(2,2,1);plot(psf),axis([0 130 -0.2 0.6]),title('成形滤波器的时域波形');grid on;
subplot(2,2,2);plot(20*log(abs(fft(psf)))),axis([0 130 -250 50]),title('成形滤波器的频谱'); grid on;
subplot(2,2,3);plot(Ipulse),axis([0 500 -1.2 1.2]),title('成形滤波后的I路信号');grid on;
subplot(2,2,4);plot(Qpulse),axis([0 500 -1.2 1.2]),title('成形滤波后的Q路信号');grid on;
%% QPSK信号的调制
fc=2.5e6; %载波频率为2.51hz
t = (0:1:zero_interval*len+num-1)/(fc*zero_interval);
idata1 = Ipulse.*sqrt(2).*cos(2*pi*fc*t);
qdata1 = Qpulse.*-sqrt(2).*sin(2*pi*fc*t);
s1 = idata1 + qdata1;
figure(5);
subplot(2,1,1);plot(idata1),axis([num/2 400 -1.2 1.2]),title('调制后的I路信号');grid on;
subplot(2,1,2);plot(qdata1),axis([num/2 400 -1.2 1.2]),title('调制后的Q路信号');grid on;
figure(6);
subplot(2,1,1);plot(s1),axis([num/2 400 -1.2 1.2]),title('调制信号');grid on;
subplot(2,1,2);plot(20*log(abs(fft(s1)))),axis([0 zero_interval*len -550 300]),title('调制信号的频谱'); grid on;
%% 添加高斯白噪声
SNR=10; % 信噪比
s2=awgn(s1,SNR);
figure(7)
subplot(2,1,1);plot(s2),axis([num/2 400 -1.2 1.2]),title('添加噪声后信号后的调制信号');grid on;
subplot(2,1,2);plot(20*log(abs(fft(s2)))),title('添加噪声后信号的频谱');grid on;
%% ----------------------------- QPSK 解调部分
%% 解调部分
idata2 = s2*sqrt(2).*cos(2*pi*fc*t);
qdata2 = -s2*sqrt(2).*sin(2*pi*fc*t);
% 匹配滤波
mtf= rcosfir(rf,NT,zero_interval,Fs,'sqrt');
idata3= conv(idata2,mtf);
qdata3= conv(qdata2,mtf);
figure(8);
subplot(2,2,1);plot(idata3),axis([num 400+num/2 -1.7 1.7]),title('匹配滤波后I路信号的波形');grid on;
subplot(2,2,2);plot(qdata3),axis([num 400+num/2 -1.7 1.7]),title('匹配滤波后Q路信号的波形');grid on;
%% 抽样判决的过程,与0作比较,data>=0,则置1,否则置-1
%数据选择
Isel=zeros(1,zero_interval*len);
Qsel=zeros(1,zero_interval*len);
for jj = 1:zero_interval*len
Isel(:,jj) = idata3(:,jj+num);
Qsel(:,jj) = qdata3(:,jj+num);
end
%提取码元
idata4=zeros(1,len);
qdata4=zeros(1,len);
for jj = 1:len
idata4(:,jj) = Isel(:,(jj-1)*zero_interval+1);
qdata4(:,jj) = Qsel(:,(jj-1)*zero_interval+1);
end
subplot(2,2,3);plot(idata4(1,:)),axis([0 250 -1.7 1.7]),title('抽取后I路信号的波形');grid on;
subplot(2,2,4);plot(qdata4(1,:)),axis([0 250 -1.7 1.7]),title('抽取后Q路信号的波形');grid on;
%判决
idata5=zeros(1,len);
qdata5=zeros(1,len);
threshold = 0;
for jj = 1:len
if idata4(jj)>=threshold
idata5(jj) = 1;
else
idata5(jj) = 0;
end
if qdata4(jj)>=threshold
qdata5(jj) = 1;
else
qdata5(jj) = 0;
end
end
figure(9);
subplot(2,1,1);stairs(idata5),axis([0 250 -1.2 1.2]),title('判决后I路信号的波形');grid on;
subplot(2,1,2);stairs(qdata5),axis([0 250 -1.2 1.2]),title('判决后Q路信号的波形');grid on;
%% 将判决之后的数据存放进数组
s4=zeros(1,len);
s4(1:2:len) = idata5(1:2:len);
s4(2:2:len) = qdata5(1:2:len);
figure(10);
subplot(2,1,1);stairs(data0(1:len)),axis([0 250 -0.2 1.2]),title('基带信号');grid on;
subplot(2,1,2);stairs(s4(1,:)),axis([0 250 -0.2 1.2]),title('判决后波形');grid on;
%% 眼图和星座图
figure(11);
plot(I, Q,'r+');xlabel('I路');ylabel('Q路');title('QPSK星座图');hold on;
plot(idata4(1,:), qdata4(1,:),'*');grid on;axis([-2 2 -2 2]);
legend('发射端的值','实际接收端的值');
A=zeros(1,zero_interval*len);A=Ipulse(1,num/2:zero_interval*len+num/2)+j*Qpulse(1,num/2:zero_interval*len+num/2);eyediagram(A,20);
B=zeros(1,zero_interval*len);B=idata3(1,num:zero_interval*len+num)+j*qdata3(1,num:zero_interval*len+num);eyediagram(B,20);
% eyediagram(Ipulse,200);title('成型滤波后I路眼图');grid on;
% eyediagram(Qpulse,200);title('成型滤波后Q路眼图');grid on;
% eyediagram(idata3(1,:),200);title('匹配滤波后I路眼图');grid on;
% eyediagram(qdata3(1,:),200);title('匹配滤波后Q路眼图');grid on;
% eyediagram(idata5(1,:),5);title('判决后I路眼图');grid on;
% eyediagram(qdata5(1,:),5);title('判决后Q路眼图');grid on;
%% 累计误码数
% abs(s4-data0)求接收端和发射端
% 数据差的绝对值,累计之后就是误码个数
Awgn_num_BER=sum(abs(s4(1,:)-data0(1:len)'))/len
评论1