Matlab 移动通信原理-扩频通信系统仿真实验(扩频通信系统的多用户数据传输、利用蒙特卡罗仿真方法对扩频增益进行性能仿真)

移动通信原理的扩频通信系统仿真实验,完成扩频通信系统的多用户数据传输、利用蒙特卡罗仿真方法对扩频增益进行性能仿真。
项目实验环境是Matlab2018,软件版本不同可能会有些出入,需要稍作修改。

目录

    • 仿真要求
    • 仿真方案设计
    • 主要仿真代码
    • 仿真结果

仿真要求

要求一:扩频通信系统的多用户数据传输
①传输的数据随机产生,要求采用频带传输(BPSK调制);
②扩频码要求采用周期为63(或127)的m序列;
③仿真从基站发送数据到三个不同的用户,各不同用户分别进行数据接收;
④设计三种不同的功率延迟分布,从基站到达三个不同的用户分别经过多径衰落(路径数分别为2,3,4);
⑤三个用户接收端分别解出各自的数据并与发送前的数据进行差错比较。
要求二:利用蒙特卡罗仿真方法对扩频增益进行性能仿真
设计仿真方案,得到在数据传输过程中进行扩频(扩频序列用m序列)和不进行扩频的BER性能结论,要求得到的BER曲线较为平滑,并说明这种结论与理论上的结论是否相符,为什么?

仿真方案设计

要求一:
通信系统的总体框图如下所示:
Matlab 移动通信原理-扩频通信系统仿真实验(扩频通信系统的多用户数据传输、利用蒙特卡罗仿真方法对扩频增益进行性能仿真)_第1张图片
Matlab 移动通信原理-扩频通信系统仿真实验(扩频通信系统的多用户数据传输、利用蒙特卡罗仿真方法对扩频增益进行性能仿真)_第2张图片
发射机原理图:
Matlab 移动通信原理-扩频通信系统仿真实验(扩频通信系统的多用户数据传输、利用蒙特卡罗仿真方法对扩频增益进行性能仿真)_第3张图片
接收机原理图:
Matlab 移动通信原理-扩频通信系统仿真实验(扩频通信系统的多用户数据传输、利用蒙特卡罗仿真方法对扩频增益进行性能仿真)_第4张图片
其中发射端主要完成m序列的产生,随机0, 1序列的产生。然后利用m序列对产生的随机序列进行扩频,然后再用cos (wt)对其进行调制。
信道主要模拟信号的多径传输,在这个信道中一共有三个用户的数据进行传输,用户一经过了2径衰落,用户二经过了3径衰落,用户三经过了4径衰落。
接收端接收到的信号是几路多径信号的加噪后的叠加,首先要完成信号的解扩,然后再解调,滤波,抽样判决最后分别与原始信号比较并统计误码率。

1、m序列的产生
需要32位的扩频序列,经过计算易知要产生32位的m序列需要长度为6的反馈系数,为了得到较好的结果,选取了自相关性较好而互相关性较差的三组反馈系数(八进制)45、67、75,其对应的二进制为100101、110111、111101。并将二进制与移位寄存器级数对应,例如反馈系数移100101得到的移位寄存器为C5=1, C4=0, C3=0, C2=1, C1=0, C0=1, 其具体的寄存器结构图如下图所示:

Matlab 移动通信原理-扩频通信系统仿真实验(扩频通信系统的多用户数据传输、利用蒙特卡罗仿真方法对扩频增益进行性能仿真)_第5张图片
2、 m序列的扩频
扩频的主要思想是每一位数据位都扩展成长度为m序列长的信息,其具体做法是将数据信息中的‘1’用m序列代替,而对于‘0’用-m序列代替,这样对每一个数据位都进行扩展就实现了对原始数据的扩频。其结构框图如下:
Matlab 移动通信原理-扩频通信系统仿真实验(扩频通信系统的多用户数据传输、利用蒙特卡罗仿真方法对扩频增益进行性能仿真)_第6张图片
3. DPSK调制
为了使低频信号能够在高频中传输,并且增强系统的抗噪声性能,我们必须采用一定的调制解调技术,这里选用的DPSK进行调制。BPSK对扩频信号进行调试,并在接收端对解扩信号进行BPSK解调以恢复出原有信号。BPSK的主要思路是将不同的数据用不同相位的载波进行调制,以将低频的信号调制到较高频率。
4.多径信道仿真
在这个模块中我将模拟无线信道,对不同用户产生的数据经三径进行传输,每一径信号又有三个用户数据叠加而成,并且每一径信号具有不同的延迟和衰减。最后在信道的另一端三径信号进行叠加并对其加噪。
5.解扩和带通滤波
在假定扩频码与接收信号同步的情况下, 可对接收信号进行解扩, 其解扩的过程与扩频的过程一样, 也是利用扩频码与接收信号进行相乘即可。

要求二:
1、构造或描述概率过程实际上就是建立随机试验模型,构造概率过程是对确定性问题而言的,描述概率过程是对随机性问题而言的,不同的问题所需要建立的随机试验模型各不相同。
2、已知概率分布抽样指的是随机试验过程,随机模型中必要包含某些已知概率分布的随机变量或随机过程作为输入,进行随机试验的过程就是对这些随机变量的样本或随机过程的样本函数作为输入产生相应输出的过程,因此通常被称为对已知概率分布的抽样。如何产生已知分布的随机变量或随机过程是蒙特卡罗方法中的一个关键问题。
3、获得估计量,蒙特卡罗方法所得到的问题的解总是对真实解的一个估计,本身也是一个随机变量,这个随机变量是由随机试验模型输出通过统计处理得到的。
这里直接采用不经过直接扩频与经过直接扩频的信号进行比较,通过误码率曲线进行分析。

主要仿真代码

主程序如下:

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]; %103
b2=[1,1,0,0,1,1,1]; %147
b3=[1,1,0,1,1,0,1];  %155
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);

    dssignal1=dsss(signal1,c1);
    dssignal2=dsss(signal2,c2);
    dssignal3=dsss(signal3,c3);
    modusignal1=modu(dssignal1,chipRate,fc, fs);
    modusignal2=modu(dssignal2,chipRate,fc, fs);
    modusignal3=modu(dssignal3,chipRate,fc, fs);
    
    mixsignal=modusignal1+modusignal2+modusignal3;
    receivesignal=awgn(mixsignal,snr(i));
%多径干扰
    receivesignal1= channels (receivesignal,snr(i),2) ;
    receivesignal2= channels (receivesignal,snr(i),3) ;
    receivesignal3= channels (receivesignal,snr(i),4) ;
    
    dedssignal1=dedsss(receivesignal1,c1,chipRate,fs);
    demoSignal1=demodu(dedssignal1,dataRate,fc,fs);
    dedssignal2=dedsss(receivesignal1,c2,chipRate,fs);
    demoSignal2=demodu(dedssignal1,dataRate,fc,fs);
    dedssignal3=dedsss(receivesignal1,c3,chipRate,fs);
    demoSignal3=demodu(dedssignal1,dataRate,fc,fs);
    err_bit1(i)=sum(demoSignal1~=signal1)/N;
    err_bit2(i)=sum(demoSignal2~=signal2)/N;
    err_bit3(i)=sum(demoSignal3~=signal3)/N;
    
    dedssignal21=dedsss(receivesignal2,c1,chipRate,fs);
    demoSignal21=demodu(dedssignal21,dataRate,fc,fs);
    dedssignal22=dedsss(receivesignal2,c2,chipRate,fs);
    demoSignal22=demodu(dedssignal22,dataRate,fc,fs);
    dedssignal23=dedsss(receivesignal2,c3,chipRate,fs);
    demoSignal23=demodu(dedssignal23,dataRate,fc,fs);
    err_bit21(i)=sum(demoSignal21~=signal1)/N;
    err_bit22(i)=sum(demoSignal22~=signal2)/N;
    err_bit23(i)=sum(demoSignal23~=signal3)/N;
    
    dedssignal31=dedsss(receivesignal3,c1,chipRate,fs);
    demoSignal31=demodu(dedssignal31,dataRate,fc,fs);
    dedssignal32=dedsss(receivesignal3,c2,chipRate,fs);
    demoSignal32=demodu(dedssignal32,dataRate,fc,fs);
    dedssignal33=dedsss(receivesignal3,c3,chipRate,fs);
    demoSignal33=demodu(dedssignal33,dataRate,fc,fs);
    err_bit31(i)=sum(demoSignal31~=signal1)/N;
    err_bit32(i)=sum(demoSignal32~=signal2)/N;
    err_bit33(i)=sum(demoSignal33~=signal3)/N;
    
    %不进行扩频的BER
    modusignal1=modu(signal1,chipRate/63,fc, fs);
    modusignal2=modu(signal2,chipRate/63,fc, fs);
    modusignal3=modu(signal3,chipRate/63,fc, fs); 
    
    modusignal1= channels (modusignal1,snr(i),3) ;
    modusignal2= channels (modusignal2,snr(i),3) ;
    modusignal3= channels (modusignal3,snr(i),3) ;
 
    demoSignal41=demodu(modusignal1,dataRate,fc,fs);
    demoSignal42=demodu(modusignal2,dataRate,fc,fs);
    demoSignal43=demodu(modusignal3,dataRate,fc,fs);
    err_bit41(i)=sum(demoSignal41~=signal1)/N;
    err_bit42(i)=sum(demoSignal42~=signal2)/N;
    err_bit43(i)=sum(demoSignal43~=signal3)/N;
end
figure(1)
semilogy(snr,err_bit1,'-s',snr,err_bit2,'-h',snr,err_bit3,'-*');
legend('用户1','用户2','用户3');
xlabel('信噪比');
ylabel('误比特率');
title('多径衰落(路径数为2)');

figure(2)
semilogy(snr,err_bit21,'-s',snr,err_bit22,'-h',snr,err_bit23,'-*');
legend('用户1','用户2','用户3');
xlabel('信噪比');
ylabel('误比特率');
title('多径衰落(路径数为3)');

figure(3)
semilogy(snr,err_bit31,'-s',snr,err_bit32,'-h',snr,err_bit33,'-*');
legend('用户1','用户2','用户3');
xlabel('信噪比');
ylabel('误比特率');
title('多径衰落(路径数为4)');

figure(4)
N1=1:length(signal1);
subplot(2,1,1);
plot(N1,signal1);
title('扩频前信号');
axis([0 100 -1.1 1.1]);
dssignal1=dsss(signal1,c1);
N1=1:length(dssignal1);
subplot(2,1,2);
plot(N1,dssignal1);
title('扩频后信号');
axis([0 320 -1.1 1.1]);

figure(5)
modusignal1=modu(dssignal1,chipRate,fc, fs);
N1=1:length(modusignal1);
subplot(2,1,1);
plot(N1,modusignal1);
axis([0 250 -1.1 1.1]);
grid on
N2=1:length(mixsignal);
subplot(2,1,2);
plot(N2,mixsignal);
axis([0 500 -5.1 5.1]);
grid on

figure(6)
receivesignal1= channels (modusignal1,snr(i),2) ;
N1=1:length(receivesignal1);
subplot(3,1,1);
plot(N1,receivesignal1);
axis([0 200 -1.1 1.1]);
dedssignal1=dedsss(receivesignal,c1,chipRate,fs);
subplot(3,1,2);
plot(N1,dedssignal1);
axis([0 200 -1.1 1.1]);
demoSignal1=demodu(dedssignal1,dataRate,fc,fs);
N1=1:length(demoSignal1);
subplot(3,1,3);
plot(N1,demoSignal1);
axis([0 200 -1.1 1.1]);

figure(7)
plot(snr,err_bit21,'-s',snr,err_bit22,'-h',snr,err_bit23,'-*');
legend('用户1','用户2','用户3');
xlabel('信噪比');
ylabel('误比特率');
title('扩频');
% axis([0 100 -1.1 1.1]);

figure(8)
plot(snr,err_bit41,'-s',snr,err_bit42,'-h',snr,err_bit43,'-*');
legend('用户1','用户2','用户3');
xlabel('信噪比');
ylabel('误比特率');
title('不扩频');

接收端解扩代码如下:

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 signal=information(N)
		signal=rand(1,N)>=0.5;
      signal=signal*2-1;
   end

扩频码的产生(只产生一个周期的m序列)、扩频、调制。
解扩实现代码如下:

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 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

仿真结果

扩频通信的理论基础为香农公式:C=Blog(1+S/N)。我们可以用牺牲带宽的办法来换取较低的信噪比,增加系统的抗干扰能力。直接序列扩频,是直接利用具有高码率的扩频码序列在发送端扩展信号的频谱,而在接收端,用相同的扩频码序列进行解扩,把展宽的扩频信号还原成原始的信息,是一种数字调制方法。
扩频通信系统具有较强的抗干扰能力,且具有很强的隐蔽性和抗侦查,抗窃听的能力。这种能力随着扩频增益的增大而增大。扩频增益的提高就需要提高扩频码m序列的位数了。
因为m序列具有良好的自相关特性和互相关特性,正是这两大特性使得在接收端可以很好的进行扩频码的同步,以及多路用户的区分,从而具有很好的抗多径干扰能力。

要求一
1、原信号和扩频之后的信号,如下图所示。
Matlab 移动通信原理-扩频通信系统仿真实验(扩频通信系统的多用户数据传输、利用蒙特卡罗仿真方法对扩频增益进行性能仿真)_第7张图片

2、第一个用户信号经过扩频,调制之后的信号以及三个用户信号分别经过2径,3径,4径信道后的叠加信号之和如下图所示。
由上到下第一个坐标系为用户1经过扩频、调制的信号,第二、三、四为三个用户经过叠加的信号再分别通过2径、3径、4径的信道之后的信号,由图可知,经过多径之后的信号已经和原信号的图形相差很大。这是因为信道的衰落使用延时来进行模拟的,会造成一些误差。
Matlab 移动通信原理-扩频通信系统仿真实验(扩频通信系统的多用户数据传输、利用蒙特卡罗仿真方法对扩频增益进行性能仿真)_第8张图片

3、第一个原始用户信号与其经过接收端解扩,解调,抽样判决之后的最终信号的比较,如下图所示。
Matlab 移动通信原理-扩频通信系统仿真实验(扩频通信系统的多用户数据传输、利用蒙特卡罗仿真方法对扩频增益进行性能仿真)_第9张图片

4、3个用户的信号分别经过多径衰落。衰落信道的个数为2、3、4,通过下面三张图可以发现,随着多径数目的增加,3个用户的误码率都呈现增加的趋势。同一个用户随着信噪比的增加,误码率会减小。
多径衰落路径数为2时,3个用户的误码率比较图如下:
Matlab 移动通信原理-扩频通信系统仿真实验(扩频通信系统的多用户数据传输、利用蒙特卡罗仿真方法对扩频增益进行性能仿真)_第10张图片
多径衰落路径数为3时,3个用户的误码率比较图如下:
Matlab 移动通信原理-扩频通信系统仿真实验(扩频通信系统的多用户数据传输、利用蒙特卡罗仿真方法对扩频增益进行性能仿真)_第11张图片

多径衰落路径数为4时,3个用户的误码率比较图如下:
Matlab 移动通信原理-扩频通信系统仿真实验(扩频通信系统的多用户数据传输、利用蒙特卡罗仿真方法对扩频增益进行性能仿真)_第12张图片
要求二
在数据传输过程中进行扩频和不进行扩频的BER性能比较如图所示。
进行扩频的BER曲线(第一张图)更加平缓,并且经过扩频的信号在信噪比比较低的情况下,呈现出优于不扩频信号的性能,这体现了扩频通信可以提高系统的信噪比,改善系统的性能。
通过直接序列扩频得到的BER曲线较为平滑。直扩系统有较强的抗多径干扰的能力,多径信号到达接收端,由于利用了伪随机码的相关特性,只要多径时延超过伪随机码的一个切普,则通过相关处理后,可消除这种多径干扰的影响,甚至可以利用这些多径干扰的能量,提高系统的信噪比,改善系统的性能。

Matlab 移动通信原理-扩频通信系统仿真实验(扩频通信系统的多用户数据传输、利用蒙特卡罗仿真方法对扩频增益进行性能仿真)_第13张图片
Matlab 移动通信原理-扩频通信系统仿真实验(扩频通信系统的多用户数据传输、利用蒙特卡罗仿真方法对扩频增益进行性能仿真)_第14张图片

你可能感兴趣的:(MATLAB)