仿真要求
扩频通信系统的多用户数据传输
①传输的数据随机产生,要求采用频带传输(DBPSK调制);
②扩频码要求采用周期为63(或127)的m序列;
③仿真从基站发送数据到三个不同的用户,各不同用户分别进行数据接收;
④设计三种不同的功率延迟分布,从基站到达三个不同的用户分别经过多径衰落(路径数分别为2,3,4);
⑤三个用户接收端分别解出各自的数据并与发送前的数据进行差错比较。
仿真方案详细设计
扩频通信发射机原理图:
接收机原理图:
**m序列产生原理:
扩频:每一位数据位都扩展成长度为m的序列,将数据信息中的‘1’用m序列代替,而对于‘-1’用-m序列代替。m序列有良好的自相关特性,便于接收端与发送端同步。
解扩:扩频码与接收信号同步的情况下, 可对接收信号进行解扩, 利用扩频码与接收信号进行相乘即可。扩频码采用周期为63的m序列,对应的级数为6,反馈系数Ci对应的二进制为1000011、1100111、1101101。
调制与解调:本实验采用DBPSK调制,先对信号进行差分编码,然后再进行BPSK调制。解调过程先对信号进行相干解调,然后再进行差分译码。
MTALAB代码:
主函数:
clear all;
clc;
dataRate=1000;
chipRate=63*dataRate;fc=chipRate*2;
fs=fc*8;
N=1000;c=63;
b1=[1,0,0,0,0,1,1];b2=[1,1,0,0,1,1,1];b3=[1,1,0,1,1,0,1];
snr=-20:2:-10;,
for i=1:length(snr)
signal1=information(N);signal2=information(N);signal3=information(N);
c1=genMseq(b1);c2=genMseq(b2);c3=genMseq(b3);%产生扩频码
%差分编码
difcodes1=Difcode(signal1);
difcodes2=Difcode(signal2);
difcodes3=Difcode(signal3);
%扩频
dssignal1=dsss(difcodes1,c1);
dssignal2=dsss(difcodes2,c2);
dssignal3=dsss(difcodes3,c3);
%调制
modusignal1=modu(dssignal1,chipRate,fc, fs);
modusignal2=modu(dssignal2,chipRate,fc, fs);
modusignal3=modu(dssignal3,chipRate,fc, fs);
%%多径信号的产生
modusignal11=channels(modusignal1,snr(i),2);
modusignal22=channels(modusignal2,snr(i),3);
modusignal33=channels(modusignal3,snr(i),4);
%多路用户信号叠加
mixsignal=modusignal11+modusignal22+modusignal33;
%用户一的解扩、解调、差分译码
dedssignal1=dedsss(mixsignal,c1,chipRate,fs);
demoSignal1=demodu(dedssignal1,dataRate,fc,fs);
dedifcodes1=Dedifcode(demoSignal1);
%用户二的解扩、解调、差分译码
dedssignal2=dedsss(mixsignal,c2,chipRate,fs);
demoSignal2=demodu(dedssignal2,dataRate,fc,fs);
dedifcodes2=Dedifcode(demoSignal2);
%用户三的解扩、解调、差分译码
dedssignal3=dedsss(mixsignal,c3,chipRate,fs);
demoSignal3=demodu(dedssignal3,dataRate,fc,fs);
dedifcodes3=Dedifcode(demoSignal3);
%性能比较
err_bit1(i)=sum(dedifcodes1~=signal1)/N;
err_bit2(i)=sum(dedifcodes2~=signal2)/N;
err_bit3(i)=sum(dedifcodes3~=signal3)/N;
end
figure(1)
plot(signal1);
title('原始信号signal1');
figure(2)
plot(difcodes1);
title('差分编码difcodes1');
figure(3)
plot(dssignal1);
title('扩频信号dssignal1');
figure(4)
plot(modusignal1);
title('调制信号modusignal1');
figure(5)
plot(dedssignal1);
title('解扩信号dedssignal1');
figure(6)
plot(demoSignal1);
title('解调信号demoSignal1');
figure(7)
plot(dedifcodes3);
title('差分译码信号dedifcodes3');
figure(8)
semilogy(snr,err_bit1,'-s',snr,err_bit2,'-h',snr,err_bit3,'-*');
legend('用户1','用户2','用户3');
xlabel('信噪比');
ylabel('误比特率');
信号产生函数:
function signal=information(N)
signal=rand(1,N)>=0.5;signal=signal*2-1;
end
扩频码产生函数:
function c=genMseq(b) %产生扩频码
N=length(b)-1;
D=ones(1,N);
A=b(N:-1:1);
c=[];
for i=1:2^N-1
c1=rem(sum(D.*A),2);
c=[c,D(N)];
D=[c1,D(1:N-1)];
end
c=2*c-1; %变为1,-1的序列
end
差分编码函数:
function difcodes=Difcode(modusignal)%差分编码
N=length(modusignal);
difcodes=[];
if(modusignal(1)==1)
difcodes(1)=1;
else
difcodes(1)=-1;
end
for n=2:N
if(difcodes(n-1)==modusignal(n))
difcodes(n)=1;
else
difcodes(n)=-1;
end
end
扩频函数:
function ssignal=dsss(signal,c) %扩频
ssignal=[];
for i=1:length(signal)
ssignal=[ssignal,signal(i)*c];
end
end
BPSK调制函数:
function modusignal=modu(signal, dataRate,fc, fs)%采用BPSK调制方式
t=linspace(0,1/dataRate,fs/dataRate);
carrier=cos(2*pi*fc*t);
modusignal=[];
for i=1:length(signal)
modusignal=[modusignal,carrier*signal(i)];
end
End
多径信道函数:
function multiS=channels(modusignal,snr,k)%多径衰落
len=length(modusignal);
x1=randn(1,len);
y1=randn(1,len);
r1=abs(x1+j*y1).*modusignal;
r1=[zeros(1,5),r1(1:length(modusignal)-5)];
x2=randn(1,len);
y2=randn(1,len);
r2=abs(x2+j*y2).*modusignal;
r2=[zeros(1,6),r2(1:length(modusignal)-6)];
x3=randn(1,len);
y3=randn(1,len);
r3=abs(x3+j*y3).*modusignal;
r3=[zeros(1,8),r3(1:length(modusignal)-8)];
if k==2
multiS=modusignal+r1;
else if k==3
multiS=modusignal+r1+r2;
else if k==4
multiS=modusignal+r1+r2+r3;
end
end
end
multiS=awgn(multiS,snr);
解扩函数:
function dessignal=dedsss(receiveSignal,c,chipRate,fs)%解扩
L=fs/chipRate;
c1 =[];
for i=1:length(c)
c1=[c1,c(i)*ones(1,L)];
end
dessignal=[];
for i=1:length(c1):length(receiveSignal)
dessignal=[dessignal,receiveSignal(i:i+length(c1)-1).*c1];
end
end
解调函数:
function demoSignal=demodu(Resignal,datarate,fc,fs) %解调
t = linspace(0,1/datarate,fs/datarate);
carrier=cos(2*pi*fc*t);
Lc=length(carrier);
Ls=length(Resignal);
designal=[];
for i=1:Lc:Ls
designal=[designal,carrier.*Resignal(i:i+Lc-1)];
end
demoSignal = [];
for i= 1:Lc:Ls
threshold=sum(designal(i:i+Lc-1));
if threshold>0
tt=1;
else
tt=-1;
end
demoSignal=[demoSignal,tt];
end
end
差分译码函数:
function dedifcodes=Dedifcode(modusignal)%差分译码
N=length(modusignal);
dedifcodes=[];
if(modusignal(1)==1)
dedifcodes(1)=1;
else
dedifcodes(1)=-1;
end
for n=2:N
if(modusignal(n-1)==modusignal(n))
dedifcodes(n)=1;
else
dedifcodes(n)=-1;
end
end
end