MATLAB扩频通信系统仿真实验(含代码)

仿真要求
扩频通信系统的多用户数据传输
①传输的数据随机产生,要求采用频带传输(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
  • 13
    点赞
  • 199
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值