clear;%清除内存中的变量
clc;%清除屏幕
format compact;%在显示变量之间没有空行
%可调变量
snr=10;
ovsf=[-j -j -j -j];%过信道特征乘法算子加权的正交可变扩频因子(OVSF)码
%扩频因子为4,第1号码分信道
scram(1:16)=[-j 1 j 1 -j 1 j 1 -j 1 j 1 j -1 -j -1];%第28号复扰序列
len_pn=length(ovsf);%PN码位数
len_data=160;%信源数据个数,单位为bit
len_chip=len_pn*len_data;%以Chip为单位的发送信息长度
fc=1.28e+6;%码片速率
t_chip=1.0e-6/1.28;%码片周期
%信源序列
signal=randint(1,len_data);%产生随机序列
qpsk=zeros(1,len_data/2); %定义经过调制后的序列
for i=1:len_data/2;%经调制后符号数为二进制序列的1/2,故循环len/2次
if signal(2*i-1)<0.5&&signal(2*i)<0.5
qpsk(i)=j;%若b1n,b2n=00,则映射后符号为j
elseif signal(2*i-1)<0.5&&signal(2*i)>0.5
qpsk(i)=1;%若b1n,b2n=01,则映射后符号为1
elseif signal(2*i-1)>0.5&&signal(2*i)<0.5%若b1n不等于0,则b1n=1
qpsk(i)=-1;%若b1n,b2n=10,则映射后符号为-1
else qpsk(i)=-j;%若b1n,b2n=11,则映射后符号为-j
end
end
sigspr=kron(qpsk,ovsf);%定义扩频后的序列
%加扰码
n=length(sigspr)/length(scram);%扩频后序列为扰码序列的n倍
for i=1:n-1;%将扰码循环扩展,使其长度等于扩频序列的长度
scram(16*i+1:16*i+16)=scram(1:16);
end
sigsprscrab=sigspr.*scram;%扰码与扩频序列相乘
nch=length(sigsprscrab);%QPSK调制、扩频后以Chip为单位的单通道数据长
%经过脉冲成形滤波器
%跟升余弦滤波器
delay=8;%滤波器响应时延,即冲激响应峰值与滤波器起始点的时间延迟
%该参数与滤波器冲激响应长度有关
r=0.22;%滚降系数
fs=4*fc;%根升余弦滤波器的抽样率,为数据码片速率的4倍
%实部虚部分别通过滤波器
i_trsig=rcosflt(real(sigsprscrab),fc,fs,'fir/sqrt',r,delay);%fc为输入序列的抽样率,fs为升余弦滤波器的抽样率
%’fir/sqrt’表示滤波器为有限冲激的根升余弦滤波器
%r为滚降系数,delay为响应时延
%输出数据长度为fs/fc*(length(x)+2*delay)
q_trsig=rcosflt(imag(sigsprscrab),fc,fs,'fir/sqrt',r,delay);%%%%复发射信号经过加性高斯白噪声信道
recsig=awgn(i_trsig+j*q_trsig,snr,'measured');%对发射复包络信号加高斯白噪声
%%%经过接收端的低通滤波器
i_resig=rcosflt(real(recsig),fc,fs,'fir/sqrt/fs',r,delay);%fc为输入序列的抽样率,fs为升余弦滤波器的抽样率
%’fir/sqrt’表示滤波器为有限冲激的根升余弦录取
%r为滚降系数,delay为响应时延
%输出数据长度为fs/fc*(length(x)+2*delay)
q_resig=rcosflt(imag(recsig),fc,fs,'fir/sqrt/fs',r,delay);
%’filter/fs’表示输入序列的抽样率等于滤波器抽样率fs
%输入序列长度=输入序列长度+(2*delay*fs/fc)
for j=1:nch
d_isample(j)=i_resig(65+(j-1)*4);%抽样,从第2*delay*fs/fc,65个符号开始
d_qsample(j)=q_resig(65+(j-1)*4);%每四个符号抽取一个,前64个符号为两个根升余弦滤波器时延
end
data=d_isample+sqrt(-1)*d_qsample;%抽样得到的数据
de_scram=data.*conj(scram);
for i=1:len_data/2
de_spr(len_pn*(i-1)+1:len_pn*i)=de_scram(len_pn*(i-1)+1:len_pn*i).*conj(ovsf);
end
for k=1:len_data/2
rec_data(k)=0;
for i=1:len_pn
rec_data(k)=rec_data(k)+de_spr((k-1)*len_pn+i)/len_pn;
end
end
bb=zeros(1,len_data);
for j=1:len_data/2
for k=1:4
test(k)=abs(rec_data(j)-(sqrt(-1))^k);%求出接收信号与QPSK判决信号的欧式距向量
end
test_result=min(test);%加入最小欧式距判决,并进行QPSK逆映射
if test_result==test(1)
bb(2*j-1)=0;
bb(2*j)=0;
elseif test_result==test(2)
bb(2*j-1)=1;
bb(2*j)=0;
elseif test_result==test(3)
bb(2*j-1)=1;
bb(2*j)=1;
elseif test_result==test(4)
bb(2*j-1)=0;
bb(2*j)=1;
end
end
wnum=symerr(signal,bb)%计算误比特数
pe=wnum/len_data%计算误比特率
figure(1)
subplot(321),stem(signal),grid,xlabel('输入信号序列');%输入信号序列绘制
subplot(322),stem(bb),grid,xlabel('输出信号序列');%输出信号序列绘制
subplot(323),plot(i_trsig),grid,xlabel('实部分量在脉冲成形后的图形');%实部分量在脉冲成形后的图形绘制
subplot(324),plot(q_trsig),grid,xlabel('虚部分量在脉冲成形后的图形');%虚部分量在脉冲成形后的图形绘制
subplot(325),plot(i_resig),grid,xlabel('实部分量在低通滤波后的图形');%实部分量在低通滤波后的图形绘制
subplot(326),plot(q_resig),grid,xlabel('虚部分量在低通滤波后的图形');%虚部分量在低通滤波后的图形绘制
figure(2)
m=length(i_resig);
xt=repmat([1:16],1,(m-64)/16);
plot(xt,i_resig(65:m)),xlabel('眼图观测');%眼图绘制