精华内容
下载资源
问答
  • ①传输的数据随机产生,要求采用频带传输(BPSK调制); ②扩频码要求采用周期为63(或127)的m序列; ③仿真从基站发送数据到三个不同的用户,各不同用户分别进行数据接收; ④设计三种不同的功率延迟分布,从基站...

    一、仿真要求

    扩频通信系统的多用户数据传输
    ①传输的数据随机产生,要求采用频带传输(BPSK调制);
    ②扩频码要求采用周期为63(或127)的m序列;
    ③仿真从基站发送数据到三个不同的用户,各不同用户分别进行数据接收;
    ④设计三种不同的功率延迟分布,从基站到达三个不同的用户分别经过多径衰落(路径数分别为2,3,4);
    ⑤三个用户接收端分别解出各自的数据并与发送前的数据进行差错比较。

    二、仿真方案设计原理

    1.扩频通信的基本原理
    ①香农公式:C=Blog(1 + S / N) (C是信道容量,指单位时间内无差错传播的最大信息量,单位为b/s;B是信号频带带宽,单位HZ;S是信号功率,单位W;N为噪声功率,单位W;其中S/N为输入功率与噪声功率之比,称为性躁功率比,简称性躁比)
    由信号频谱图知,减小时域周期持续时间更短,频谱更宽,可以提高信号带宽B。
    ②信号频谱
    在这里插入图片描述
    2.发射端频谱如何发展?
    Tc = Tb / L
    (L是频谱的扩展倍数,扩频增益;Tb是比特周期;Tc是码片周期 )
    ①将一个数据位的持续时间进行分片
    ②一个数据位的持续时间有多个小片组成,显然从频谱的角度看,每个小片的持续时间比一个数据位的持续时间短,显然其频谱就宽
    ③其频谱的扩展倍数 L= Tb / Tc
    ④码片速率也就变成数据数率的L倍
    3.接收端如何解扩恢复原来的带宽?
    如表所示
    在这里插入图片描述
    在这里插入图片描述
    4.其中的关键问题
    对扩频码的要求:
    ①自相关特性(良好的自相关特性,便于扩频码的同步):时间延迟τ = 0时达到峰值,其他情况尽量等于0。
    ②互相关特性(良好的互相关特性,便于区分不同的用户):希望互相关系数ρ(x,y)在0附件完全正交。
    在这里插入图片描述
    由上图知,m序列在一个点达到峰值,其他情况接近0,,所以它的自相关特性很好,互相关特性在0附件还行,所以一般。
    5.扩频通信系统发射机模型
    本文采用的是BPSK调制解调方式。发送端将扩频后的信号s乘上载波
    cos(2πft)即完成了调制
    在这里插入图片描述
    6.扩频通信系统发射机设计
    在这里插入图片描述
    7.参数设置
    数据速率:dataRate
    载波速率:fc
    抽样频率:fs(将连续信号变为离散信号)
    码片速率:chipRate

    8.接收机原理
    接收端再乘以载波cos(2*πft)做相干解调,再经过一个低通滤波器滤除相乘过程中产生的高频成分即完成了解调
    在这里插入图片描述
    思考:扩频通信系统中为什么要先解扩再解调,而不是发射机端处理过程的逆过程?
    答:因为我们通过发送端扩频调制出来的信号,功率很低,像噪声一样,无法解调,所以在接收端应该先解扩检查出信号,然后再解调,通过低通滤波器。
    注意:仿真中没有考虑所有的同步问题,都假定是精准同步的
    9.接收机设计
    在这里插入图片描述
    10.扩频通信系统仿真的主程序
    在这里插入图片描述
    信道主要模拟信号的多径传输,在这个信道中一共有三个用户的数据进行传输,用户一经过了2径衰落,用户二经过了3径衰落,用户三经过了4径衰落。接收端接收到的信号是几路多径信号的加噪后的叠加,首先要完成信号的解扩,然后再解调,滤波,抽样判决最后分别与原始信号比较并统计误码率。
    在这里插入图片描述
    11.如图,扩频码采用周期为63的m序列,可知其对应的级数为6,反馈系数Ci对应的八进制(二进制)分别为103(1000011)、147(1100111)、155(1101101)。因此本实验中设计的反馈系数为

    b1=[1,0,0,0,0,1,1]; %C0=1,C1=1,C2=0,C3=0,C4=0,C5=0,C6=1
    b2=[1,1,0,0,1,1,1]; %C0=1,C1=1,C2=1,C3=0,C4=0,C5=1,C6=1
    b3=[1,1,0,1,1,0,1]; %C0=1,C1=0,C2=1,C3=1,C4=0,C5=1,C6=1
    

    m序列部分反馈系数:
    在这里插入图片描述
    12.线性反馈移位寄存器(m序列)
    在这里插入图片描述

    三、详细仿真代码

    1.产生随机的-1,1信号,函数information()

    function signal=information(N)  %N为本次产生的数据个数
    %产生随机的-1,1信号
    signal=rand(1,N)>=0.5;
    signal=signal*2-1;
    end
    

    2.产生m序列,函数genMseq()

    function c=genMseq(b)
    %产生m序列
    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=c*2-1;                       %变为1,-1的序列
    end
    

    3.扩频,函数dsss()

    function ssignal=dsss(signal,c)
    %扩频
    ssignal=[];
    for i=1:length(signal)
        ssignal=[ssignal,signal(i)*c];
    end
    end
    

    4.采用BPSK调制方式,函数modu()

    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
    

    5.解扩,函数dedsss()

    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
    

    6.解调,函数demodu()

    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
    

    7.模拟多径衰落 函数channels()

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

    8.扩频通信系统仿真的主程序 函数main()

    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);
        %产生m码
        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);
        %模拟多径衰落
        modusignal11=channels(modusignal1,snr(i),2);
        modusignal22=channels(modusignal2,snr(i),3);
        modusignal33=channels(modusignal3,snr(i),4);
        %混合接收
        receivesignal=modusignal11+modusignal22+modusignal33;
        %解扩
        dedssignal1=dedsss(receivesignal,c1,chipRate,fs);
        dedssignal2=dedsss(receivesignal,c2,chipRate,fs);
        dedssignal3=dedsss(receivesignal,c3,chipRate,fs);
        %解调
        demoSignal1=demodu(dedssignal1,dataRate,fc,fs);
        demoSignal2=demodu(dedssignal2,dataRate,fc,fs);
        demoSignal3=demodu(dedssignal3,dataRate,fc,fs);
        %求误码率
        err_bit1(i)=sum(demoSignal1~=signal1)/N;
        err_bit2(i)=sum(demoSignal2~=signal2)/N;
        err_bit3(i)=sum(demoSignal3~=signal3)/N;
    end
    figure;
    semilogy(snr,err_bit1,'-s',snr,err_bit2,'-h',snr,err_bit3,'-*');
    legend('用户1','用户2','用户3');
    xlabel('信噪比');
    ylabel('误比特率');
    

    四、仿真结果比较

    模拟信号的多径传输,用户1经过了2径衰落,用户2经过了3径衰落,用户3经过了4径衰落仿真结果:
    在这里插入图片描述
    结论:由上图可以知道,用户1通过2径衰落、用户2通过3径衰落,用户3通过4径衰落,随着信噪比的增加,用户的误比特率会降低,信噪比越大,误比特率越低也可看见用户2在≥-14的性躁比时,后面没有显示出来,表示后面没有任何错误的比特;其次,也能知道每个用户在很低的性躁比下误比特率也还可以,在性躁比达到-10时的误比特率几乎快接近于0。因此,扩频通信扩频码特性确实能够以很低的功率进行传播来实现很小的误比特率。由于信号是随机产生,接收信号是PDP构成的,PDP不同,接收信号不一样,故每次的运行结果都不一样,但是并不影响最后的误比特率与信噪比的整体关系。


    • 加油!💚在这里插入图片描述

    展开全文
  • 很多基于扩频通信的实现现在大多数仿真...林君学长主要带大家了解如何通过python编程,实现对扩频通信系统的BPSK调制解调,进而实现对多用户数据的传输仿真! 多用户扩频通信系统仿真的具体要求如下: 传输的数据随...

    很多基于扩频通信的实现现在大多数仿真都是通过matlab进行实现仿真,但其实,python也完全可以进行仿真,只要理解原理,任何语言都可以实现对扩频通信系统的仿真,不过通过python和matlab比较简单实现一点,本次博客,林君学长主要带大家了解如何通过python编程,实现对扩频通信系统的BPSK调制解调,进而实现对多用户数据的传输仿真!
    多用户扩频通信系统仿真的具体要求如下:

    1. 传输的数据随机产生,要求采用频带传输(BPSK调制)
    2. 扩频码要求采用周期为63(或127)的m序列
    3. 仿真从基站发送数据到三个不同的用户,各不同用户分别进行数据接收
    4. 设计三种不同的功率延迟分布,从基站到达三个不同的用户分别经过多径衰落(路径数分别为2,3,4)
    5. 三个用户接收端分别解出各自的数据并与发送前的数据进行差错比较

    接下来,进行实验之前,我们需要先了解一下什么是BPSK调制?

    一、BPSK调制的理解

    1、什么是BPSK调制

    1)、BPSK (Binary Phase Shift Keying)-------二进制相移键控。是把模拟信号转换成数据值的转换方式之一,利用偏离相位的复数波浪组合来表现信息键控移相方式。BPSK使用了基准的正弦波和相位反转的波浪,使一方为0,另一方为1,从而可以同时传送接受2值(1比特)的信息。
    由于最单纯的键控移相方式虽抗噪音较强但传送效率差,所以常常使用利用4个相位的QPSK和利用8个相位的8PSK

    2、BPSK调制解调原理(框图)

    1)、BPSK调制原理
    BPSK 调制方式时,因为发送端以某一个相位作为基准,所以在接收端也一定有这样一个固定的基准相位作为参考。假如参考相位发生变化了,那么接收端恢复的信息也会出错,也就是存在“倒π”现象。因此需要在接收端使用载波同步,才能够正确恢复出基带的信号。
    在这里插入图片描述
    2)、BPSK解调原理
    BPSK信号的幅度与基带信号无关,故不能用包络检波法而只能用相干解调法解调BPSK信号,在相干解调过程中需要用到与接收的BPSK信号同频同相的相干载波,相干接收机模型如下图所示:
    在这里插入图片描述
    因此、PBSK解调原理由上面可得出如下解调原理框图:
    在这里插入图片描述

    3、BPSK调制解调总结

    1)、BPSK调制过程,特别是移动通信原理学习之后,大致就分为如下六个过程:
    信号发生器----->扩频----->调制----->解扩----->解调----->信号接收
    当然,中间还有高斯白噪声的加入,这里主要在调制过程中加入,现实仿真模型中必须考虑噪声的影响!

    二、扩频通信系统的多用户数据传输仿真方案设计

    1、该扩频通信系统的多用户数据传输仿真的总体方案如下所示:

    在这里插入图片描述

    2、发射机、接收机的设计框图如下:

    1)、发射机设计框图
    在这里插入图片描述

    说明: 发射端主要完成 m 序列的产生,随机 0,1 序列的产生。然后利用 m 序列对产生的随机序列进行扩频,然后再用 相干载波cos(wt) 对其进行调制。 信道主要模拟信号的多径传输,在这个信道中一共有三个用户的数据进行传输,并经过了多径衰落。

    2)、接收机设计框图
    在这里插入图片描述

    说明: 接收端接收到的信号是几路多径信号的加噪后的叠加,首先要完成信号的解扩,然后再解调,滤波,抽样判决最后分别与原始信号比较并统计误码率

    三、python代码实现发射机设计功能

    准备阶段: 该项目需要导入的库如下:

    import numpy as np
    import random
    import matplotlib.pyplot as plt
    

    numpy用来做数组的运算、random用于随机数的产生、matplotlib用于作误比特率和信噪比的线性图

    1、信号发射器的python代码模拟

    1)、随机产生信号的python代码如下所示:

    #产生信息(1,-1)的信息流
    def information(N):#输入比特流的个数N,输出我们的信号,要么是1,要么是0
        signal=np.array([])              #定义信号数组
        for i in range(N):               #进行循环输出N个比特
            x=random.randint(0,1)        #随机产生0-1之间的一个随机数
            if x>=0.5:                   #当产生的随机数大于0.5,我们设定为1,小于0.5,我们设定为0
                x=1
            else:
                x=0
            signal=np.insert(signal,len(signal),x*2-1)#向信号数组中插入处理后的比特,只有-1和1
        return signal                    #返回信号
    

    2)、函数说明:
    以上函数为比特流的产生函数,给定我们需要产生的比特流的个数N,函数随机产生0-1之间的N个比特的数据流,并经过处理,最终发射出的只有-1和1的比特流

    2、M序列产生的python代码模拟

    1)、定义产生M序列函数的python代码如下所示:

    #扩频码的产生,只产生一个周期的M序列
    def genMseq(b):#b为c0-cn的个数   b0对应Cn,bn对应C0
        N=len(b)-1#N指寄存器个数
        D=np.ones(N)#寄存器初始状态全1
        A=b[N-1::-1]#c0--->cn的取值,分别对应b(n-1)--->b0
        c=np.array([])#定义扩频后的序列数组(M序列)
        for i in range((2**N)-1): #扩频的序列为2^N-1次循环
            c1=(np.dot(D,A))%2#点乘求和,并与2求余数,最终得到的结果不是0就是1
            c=np.insert(c,len(c),D[N-1])#为M序列插值,对应最后一个寄存区的状态
            D=D[0:N-1]#每次操作之后,寄存区的数组D中的数据往后移一位
            D=np.insert(D,0,c1)#将c1插入D的最前面!
        for i in range(len(c)):
            c[i]=int(c[i]*2-1)#处理M序列,返回-1和1
        return c
    

    2)、函数说明:
    以上函数为扩频序列函数,给出一个周期的序列b,经过扩频函数产生M序列,达到扩频的效果,最终返回为2^N-1的M序列,最终的返回序列也为-1和1的序列比特

    3、扩频过程的python代码模拟

    1)、扩频函数的python代码如下所示:

    #扩频 
    def dsss(signal,c):
        ssignal=np.array([])
        for i in range(len(signal)):
            ssignal=np.insert(ssignal,len(ssignal),signal[i]*c)#M序列与信号相乘,得到扩频序列
        return ssignal 
    

    2)、函数说明
    以上为模拟扩频过程函数,将上面的信号与产生的M序列进行扩频,最后返回的是一个N维度数组,数组中的每一个元素包含M序列周期个的元素,例如1000个维度,每个元素中的长度为31;[[,…,],[,…,]…[,…,],[,…,]]

    4、调制过程的python代码模拟

    1)、调制函数的python代码如下所示:

    #调制  采用BPSK调制
    def modu(signal,dataRate,fc,fs):#dataRate符号周期 fc载波频率 fs采样频率    Tb=1/dataRate
        t=np.linspace(0,1/dataRate,int(fs/dataRate))#抽样采集,返回的(fs/dataRate)个的采集点的值
        carrier=np.array([])#定义相干载波数组
        carrier=np.insert(carrier,len(carrier),np.cos(2*(np.pi)*fc*t))#相干载波复制
        modusignal=np.array([])#定义调制信号数组
        for i in range(len(signal)):
            modusignal=np.insert(modusignal,len(modusignal),signal[i]*carrier)#相干载波与扩频序列的乘积
        #print(modusignal)
        return modusignal #返回调制信号
    

    2)、函数说明:
    调制过程其实就是扩频序列与相干载波相乘,既然要乘以相干载波,那么我们必须要设计相干载波,框图中我们可以看出,相干载波为cos(2pifc*t),这也是我们设计相干载波的方法!而扩频序列乘以相干载波就得到了我们的调制信号!

    四、python代码实现接收机设计功能

    1、信道的python代码模拟

    1)、高斯白噪声函数的python代码如下所示:

    #高斯白噪声产生
    def awgn(x, snr):
        snr = 10**(snr/10.0)
        xpower = np.sum(x**2)/len(x)
        npower = xpower / snr
        return np.random.randn(len(x)) * np.sqrt(npower)+x
    

    2)、函数说明
    以上函数主要是模拟高斯白噪声的产生,X为我们的调制信号,snr为信噪比,经过处理之后,调制信号中会混合高斯白噪声,从而达到现实中的模拟!以上高斯白噪声的函数来自网络,大家可以百度查看该函数中的具体内容!
    3)、多径衰落的python函数代码

    #信道模拟多径衰落
    def channels(modusignal,k):
        L=len(modusignal)
        x1=np.random.randn(1,L)
        y1=np.random.randn(1,L)
        h1=np.abs(x1+j*y1)
        r1=np.array([])
        r1=h1*modusignal
        #print(r1)
        r1=r1[0:len(modusignal)-6]
        for i in range(6):
            r1=np.insert(r1,0,0)
        r1=r1[0:len(modusignal)]
        x2=np.random.randn(1,L)
        y2=np.random.randn(1,L)
        h2=np.abs(x2+j*y2)
        r2=np.array([])
        r2=h2*modusignal
        #print(r2)
        r2=r2[0:len(modusignal)-7]
        for i in range(7):
            r2=np.insert(r2,0,0)
        r2=r2[0:len(modusignal)]
        x3=np.random.randn(1,L)
        y3=np.random.randn(1,L)
        h3=np.abs(x3+j*y3)
        r3=np.array([])
        r3=h3*modusignal
        r3=r3[0:len(modusignal)-8]
        for i in range(8):
            r3=np.insert(r3,0,0)
        r3=r3[0:len(modusignal)]
        multiS=np.array([])
        if k==2:
            multiS=modusignal+r1
        elif k==3:
            multiS=modusignal+r1+r2
        elif k==4:
            multiS=modusignal+r3+r2+r1
        return multiS
    

    4)、函数说明
    以上函数模拟多径衰落的函数,为了是解决用户1进行2径衰落、用户2进行3径衰落、用户3进行4径衰落;其中用户1延时6个采样点模拟衰落、用户2延时7个采样点模拟衰落、用户3延时8个采样点模拟衰落!

    2、解扩过程的python代码模拟

    1)、解扩函数的python代码如下所示:

    #解扩实现
    def dedsss(receiveSignal,c,chipRate,fs):
        L=int(fs/chipRate)#16
        c1=np.array([])
        a=np.ones(L)
        for i in range(len(c)):
            c1=np.insert(c1,len(c1),c[i]*a)
        dessignal=np.array([])
        for i in range(0,len(receiveSignal),len(c1)):
            h=receiveSignal[i:i+len(c1)]
            dessignal=np.insert(dessignal,len(dessignal),h*c1)
            #print(h)
        return dessignal
    

    2)、函数说明:
    解扩函数,是将上面的带着高斯白噪声的函数进行扩频序列的还原,输出解扩信号,传递的参数为带着高斯白噪声的扩频信号、 fs采样频率 Tb(chipRate)=1/dataRate,c1为M序列,也就是去掉M序列,还原为带着噪声的信号!

    3、解调过程的python代码模拟

    1)、解调函数的python代码如下所示:

    #解调实现
    def demodu(Resignal,datarate,fc,fs):
        t=np.linspace(0,1/datarate,int(fs/datarate))
        carrier=np.array([])
        carrier=np.insert(carrier,len(carrier),np.cos(2*(np.pi)*fc*t))
        Lc=len(carrier)
        Ls=len(Resignal)
        designal=np.array([])
        for i in range(0,Ls,Lc):#从0到解扩信号长度,以载波信号长度为步长进行解扩信号的周期划分进而与载波信号相乘得到解调信号周期的抽样值
            h=Resignal[i:i+Lc]
            designal=np.insert(designal,len(designal),h*carrier)
        demoSignal=np.array([])
        sum=0
        for i in range(0,Ls,Lc):
            threshold=np.sum(designal[i:i + Lc - 1])
            if threshold>0:
                tt=1
            else:
                tt=-1
            demoSignal=np.insert(demoSignal,len(demoSignal),tt)#输出解调信号
        return demoSignal
    

    2)、函数说明:
    与想干载波相乘,去除高斯白噪声,得到解调信号,并与原始信号做对比,进而求得误比特率,解调函数的主要功能就是滤除带外噪声、回复原始信号,传递的参数为解扩信号、符号周期(dataRate)、载波频率(fc)、采样频率(fs)

    五、扩频通信系统测试

    1、进行相关变量赋值,调用相关函数进行测试

    1)、进行相关变量的赋值

    dataRate=1000
    chipRate=31*dataRate
    fc=chipRate*2
    fs=fc*8
    N=300
    c=31
    b1=[1,0,0,1,0,1]
    b2=[1,1,0,1,1,1]
    b3=[1,1,1,1,0,1]
    snr=np.array([])
    for i in range(-20,-8,2):
        snr=np.insert(snr,len(snr),i)
    

    定义300个比特的数据流、符号周期、载波频率、采样频率
    2)、调用函数,实现BPSK调制过程

    err_bit1=np.array([])
    err_bit2=np.array([])
    err_bit3=np.array([])
    for j in range(len(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)
        modusignal11=channels(modusignal1,2)
        modusignal2=modu(dssignal2,chipRate,fc,fs)
        modusignal22=channels(modusignal2,3)
        modusignal3=modu(dssignal3,chipRate,fc,fs)
        modusignal33=channels(modusignal3,4)
        mixsignal=modusignal11+modusignal22+modusignal33
        receivesignal=awgn(mixsignal,snr[j])
        dedssignal1=dedsss(receivesignal,c1,chipRate,fs)
        demoSignal1=demodu(dedssignal1,dataRate,fc,fs)
        dedssignal2=dedsss(receivesignal,c2,chipRate,fs)
        demoSignal2=demodu(dedssignal2,dataRate,fc,fs)
        dedssignal3=dedsss(receivesignal,c3,chipRate,fs)
        demoSignal3=demodu(dedssignal3,dataRate,fc,fs)
        q=0
        for i in range(len(signal1)):
            if demoSignal1[i]!=signal1[i]:
                q=q+1
        err_bit1=np.insert(err_bit1,j,q/N)
        p=0
        for i in range(len(signal2)):
            if demoSignal2[i]!=signal2[i]:
                p=p+1
        err_bit2=np.insert(err_bit2,j,p/N)
        s=0
        for i in range(len(signal3)):
            if demoSignal3[i]!=signal3[i]:
                s=s+1
        err_bit3=np.insert(err_bit3,j,s/N)
    

    依次进行信号输入、产生M序列、序列扩频、调制、加入高斯白噪声、解扩、解调、输出
    3)、输出结果,并作出误比特率与信噪比的线性图

    print("用户1的误比特率:",err_bit1)
    print("用户2的误比特率:",err_bit2)
    print("用户3的误比特率:",err_bit3)
    plt.plot(snr,err_bit1)
    plt.plot(snr,err_bit2)
    plt.plot(snr,err_bit3)
    plt.grid()
    plt.legend("123",loc='upper right')
    plt.xlabel('SNR')
    plt.ylabel('BER')
    plt.title('SNR-BER')
    plt.show()
    

    作出信噪比与误比特率的线性图!

    2、运行结果分析

    1)、扩频通信仿真运行结果
    在这里插入图片描述
    2)、运行结果分析
    (1)、用户一通过2径衰落、用户二通过3径衰落,用户四通过4径衰落,的图像可以看出,从上之下为用户1,2,3!
    (2)、随着信噪比的增加,用户的误比特率会降低,信噪比越大,误比特率越低。
    由于信号是随机产生,故每次的运行结果都不一样,但是并不影响最后的误比特率与信噪比的线性关系哦!

    3、项目整体代码

    import numpy as np
    import random
    import matplotlib.pyplot as plt
    #产生信息(1,-1)的信息流
    def information(N):#输入比特流的个数N,输出我们的信号,要么是1,要么是0
        signal=np.array([])
        for i in range(N):
            x=random.randint(0,1)
            if x>=0.5:
                x=1
            else:
                x=0
            signal=np.insert(signal,len(signal),x*2-1)
        #print(signal)
        return signal
    #signal(15)
    #扩频码的产生,只产生一个周期的M序列
    def genMseq(b):#b为c0-cn的个数   b0对应Cn,bn对应C0
        N=len(b)-1#N指寄存器个数
        D=np.ones(N)#寄存器初始状态全1
        A=b[N-1::-1]
        #print(A)
        c=np.array([])
        for i in range((2**N)-1): #循环
            c1=(np.dot(D,A))%2#点乘求和,并与2求余数
            #print(c1)
            c=np.insert(c,len(c),D[N-1])
            D=D[0:N-1]
            D=np.insert(D,0,c1)
            #print(D)
        for i in range(len(c)):
            c[i]=int(c[i]*2-1)
        #print(c)
        return c
    #genMseq([1,0,1,0])
    #扩频 
    def dsss(signal,c):
        ssignal=np.array([])
        for i in range(len(signal)):
            ssignal=np.insert(ssignal,len(ssignal),signal[i]*c)
        #print(ssignal) 
        return ssignal 
    #dsss([1,-1,1],1)
    #调制  采用BPSK调制
    def modu(signal,dataRate,fc,fs):#dataRate符号周期 fc载波频率 fs采样频率    Tb=1/dataRate
        t=np.linspace(0,1/dataRate,int(fs/dataRate))
        carrier=np.array([])
        carrier=np.insert(carrier,len(carrier),np.cos(2*(np.pi)*fc*t))
        #print(carrier)
        modusignal=np.array([])
        for i in range(len(signal)):
            modusignal=np.insert(modusignal,len(modusignal),signal[i]*carrier)
        #print(modusignal)
        return modusignal
    #高斯白噪声产生
    def awgn(x, snr):
        snr = 10**(snr/10.0)
        xpower = np.sum(x**2)/len(x)
        npower = xpower/snr
        return np.random.randn(len(x)) * np.sqrt(npower)+x
    #解扩实现
    def dedsss(receiveSignal,c,chipRate,fs):
        L=int(fs/chipRate)#16
        c1=np.array([])
        a=np.ones(L)
        for i in range(len(c)):
            c1=np.insert(c1,len(c1),c[i]*a)
        dessignal=np.array([])
        for i in range(0,len(receiveSignal),len(c1)):
            h=receiveSignal[i:i+len(c1)]
            dessignal=np.insert(dessignal,len(dessignal),h*c1)
            #print(h)
        return dessignal
    #解调实现
    def demodu(Resignal,datarate,fc,fs):
        t=np.linspace(0,1/datarate,int(fs/datarate))
        carrier=np.array([])
        carrier=np.insert(carrier,len(carrier),np.cos(2*(np.pi)*fc*t))
        Lc=len(carrier)
        Ls=len(Resignal)
        designal=np.array([])
        for i in range(0,Ls,Lc):
            h=Resignal[i:i+Lc]
            designal=np.insert(designal,len(designal),h*carrier)
        demoSignal=np.array([])
        sum=0
        for i in range(0,Ls,Lc):
            threshold=np.sum(designal[i:i + Lc - 1])
            if threshold>0:
                tt=1
            else:
                tt=-1
            demoSignal=np.insert(demoSignal,len(demoSignal),tt)
        return demoSignal
    dataRate=1000
    chipRate=31*dataRate
    fc=chipRate*2
    fs=fc*8
    N=300
    c=31
    b1=[1,0,0,1,0,1]
    b2=[1,1,0,1,1,1]
    b3=[1,1,1,1,0,1]
    snr=np.array([])
    for i in range(-20,-8,2):
        snr=np.insert(snr,len(snr),i)
    #print(snr)
    err_bit1=np.array([])
    err_bit2=np.array([])
    err_bit3=np.array([])
    for j in range(len(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[j])
        dedssignal1=dedsss(receivesignal,c1,chipRate,fs)
        demoSignal1=demodu(dedssignal1,dataRate,fc,fs)
        dedssignal2=dedsss(receivesignal,c2,chipRate,fs)
        demoSignal2=demodu(dedssignal2,dataRate,fc,fs)
        dedssignal3=dedsss(receivesignal,c3,chipRate,fs)
        demoSignal3=demodu(dedssignal3,dataRate,fc,fs)
        q=0
        for i in range(len(signal1)):
            if demoSignal1[i]!=signal1[i]:
                q=q+1
        err_bit1=np.insert(err_bit1,j,q/N)
        p=0
        for i in range(len(signal2)):
            if demoSignal2[i]!=signal2[i]:
                p=p+1
        err_bit2=np.insert(err_bit2,j,p/N)
        s=0
        for i in range(len(signal3)):
            if demoSignal3[i]!=signal3[i]:
                s=s+1
        err_bit3=np.insert(err_bit3,j,s/N)
    print("用户1的误比特率:",err_bit1)
    #print("发射信号:",signal1)
    #print("解调信号:",demoSignal1)
    print("用户2的误比特率:",err_bit2)
    #print("发射信号:",signal2)
    #print("解调信号:",demoSignal3)
    print("用户3的误比特率:",err_bit3)
    #print("发射信号:",signal3)
    #print("解调信号:",demoSignal3)
    plt.plot(snr,err_bit1)
    plt.plot(snr,err_bit2)
    plt.plot(snr,err_bit3)
    plt.grid()
    plt.legend("123",loc='upper right')
    plt.xlabel('SNR')
    plt.ylabel('BER')
    plt.title('SNR-BER')
    plt.show()
    

    以上的所有代码建立在M序列周期为31的基础上哦,至于题目要求的M序列63或者127周期,需要小伙伴们自己修改哈,该的地方比较简单,你们需要锻炼一下啦!

    以上就是本次博客的全部内容啦,通过本次博客,大家可以更好的了解到BPSK的的调制与解调原理,也能够对BPSK应用于生活中的调制解调问题有一定的了解,同时,林君学长也希望大家能够深入的了解代码的具体意思,理解原理;代码有错误的地方记得给林君学长留言改正。
    同时、遇到问题的小伙伴也记得评论区留言,林君学长看到会给大家回复解答的,这个学长不太冷!

    陈一月的又一天编程岁月^ _ ^

    展开全文
  • 扩频通信理论基础,主要讲述了bpsk调制
  • ①传输的数据随机产生,要求采用频带传输(BPSK调制); ②扩频码要求采用周期为63(或127)的m序列; ③仿真从基站发送数据到三个不同的用户,各不同用户分别进行数据接收; ④设计三种不同的功率延迟分布,从基站...

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

    仿真要求

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

    仿真方案设计

    要求一:
    通信系统的总体框图如下所示:
    在这里插入图片描述
    在这里插入图片描述
    发射机原理图:
    在这里插入图片描述
    接收机原理图:
    在这里插入图片描述
    其中发射端主要完成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, 其具体的寄存器结构图如下图所示:

    在这里插入图片描述
    2、 m序列的扩频
    扩频的主要思想是每一位数据位都扩展成长度为m序列长的信息,其具体做法是将数据信息中的‘1’用m序列代替,而对于‘0’用-m序列代替,这样对每一个数据位都进行扩展就实现了对原始数据的扩频。其结构框图如下:
    在这里插入图片描述
    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、原信号和扩频之后的信号,如下图所示。
    在这里插入图片描述

    2、第一个用户信号经过扩频,调制之后的信号以及三个用户信号分别经过2径,3径,4径信道后的叠加信号之和如下图所示。
    由上到下第一个坐标系为用户1经过扩频、调制的信号,第二、三、四为三个用户经过叠加的信号再分别通过2径、3径、4径的信道之后的信号,由图可知,经过多径之后的信号已经和原信号的图形相差很大。这是因为信道的衰落使用延时来进行模拟的,会造成一些误差。
    在这里插入图片描述

    3、第一个原始用户信号与其经过接收端解扩,解调,抽样判决之后的最终信号的比较,如下图所示。
    在这里插入图片描述

    4、3个用户的信号分别经过多径衰落。衰落信道的个数为2、3、4,通过下面三张图可以发现,随着多径数目的增加,3个用户的误码率都呈现增加的趋势。同一个用户随着信噪比的增加,误码率会减小。
    多径衰落路径数为2时,3个用户的误码率比较图如下:
    在这里插入图片描述
    多径衰落路径数为3时,3个用户的误码率比较图如下:
    在这里插入图片描述

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

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 北京邮电大学 移动通信课程设计 实验报告 学院 信息与通信工程学院 姓名 XXXXX 班级 2009211119 学号 092105XX - 1 - 目录 一背景 4 二基本要求 4 三设计概述 4 四 Matlab 设计流程图 5 五 Matlab 程序及仿真结果图 ...
  • 用SIMULINK对BPSK调制技术仿真JD06郭忠志-用MATLAB_SIMULINK对WCDMA中关键调制技术仿真.rar 用MATLAB_SIMULINK对WCDMA中关键调制技术仿真  内容提要  目前移动通信正向B3G和4G发展,但是无论是3G的高速下行...
  • 针对无线扩频通信频带利用率有限的问题,提出了一种准正交混合扩频通信算法及其实现方案。该算法利用扩频码码极性特点在同相支路上进行BPSK调制的直接序列扩频传输,利用扩频码码相位特点在正交支路进行M元扩频传输...
  • 使用Kasami码的扩频通信系统,使用QPSK和BPSK,并在虚构的60GHz信道上工作。 文件:## spread.m用于生成随机序列的Matlab代码,Kasami代码,进行BPSK(二进制相移键控)和QPSK(正交相移键控)调制,添加噪声和通道...
  • 一个完整的直接序列扩频系统 拥有BPSK调制模块 扩频模块 解扩模块 M序列模块 已校调 可用。
  • ①传输的数据随机产生,要求采用频带传输(BPSK调制); ②扩频码要求采用周期为63(或127)的m序列; ③仿真从基站发送数据到三个不同的用户,各不同用户分别进行数据接收; ④设计三种不同的功率延迟分布,从基站...

    一、题目

    扩频通信系统仿真实验

    二、仿真要求

    要求一:扩频通信系统的多用户数据传输

    ①传输的数据随机产生,要求采用频带传输(BPSK调制);

    ②扩频码要求采用周期为63(或127)的m序列;

    ③仿真从基站发送数据到三个不同的用户,各不同用户分别进行数据接收;

    ④设计三种不同的功率延迟分布,从基站到达三个不同的用户分别经过多径衰落(路径数分别为2,3,4);

    ⑤三个用户接收端分别解出各自的数据并与发送前的数据进行差错比较。

    三、仿真方案详细设计

    我选择扩频通信系统的多用户数据传输

    通信系统的总体框图如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tJ6eqszq-1588732523745)(media/a360d582a4d7ca95767ae4d6dc999d44.png)]

    发射机原理框图:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G28eMW1y-1588732523748)(media/7c0c1c64e50f7bc2e65540eb958fab15.png)]

    接收机原理框图:

    在这里插入图片描述

    由上图可知,整个设计由发送端、信道和接收机组成。

    其中发射端主要完成m序列的产生,随机0, 1序列的产生。然后利用m序列对产生的随

    机序列进行扩频,然后再用cos (wt)对其进行调制。

    信道主要模拟信号的多径传输,在这个信道中一共有三个用户的数据进行传输,用户一经过了2径衰落,用户二经过了3径衰落,用户三经过了4径衰落。

    接收端接收到的信号是几路多径信号的加噪后的叠加,首先要完成信号的解扩,然后再解调,滤波,抽样判决最后分别与原始信号比较并统计误码率

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BTFQRkmE-1588732523751)(media/b93a2604ddfd95c167186585cd3bad33.png)]

    现对主要功能部分进行详细描述:

    1.扩频码(m序列)的产生

    扩频码为伪随机序列,本实验采用自相关特性好,互相关特性较差的M序列,因为有三路用户,故选取带有6位移位寄存器,周期为63的m序列。根据上图可以得出其对应的二进制序列分别为:
    1000011, 1100111, 1101101.以1000011为例,其具体的寄存器结构图如下所示:

    初始化各寄存器单元内容为1

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tX6eGjal-1588732523752)(media/ca39951f396890c0e36a50ebbfcaf5c6.png)]

    2.产生信息(1,-1)的数据流

    代码如下:

    function signal=information(N)
    
    signal=rand(1,N)\>=0.5;
    
    signal=signal\*2-1;
    
    End
    
    % 其中参数N是指本次产生的数据个数。
    
    3.产生扩频码(只产生一个周期的m序列)
    
    代码如下:
    
    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=c\*2-1; %变为1,-1的序列
    
    end
    

    4.扩频

    扩频的主要思想是每一位数据位都扩展成长度为m序列长的信息,其具体做法是将数据信息中的‘1’
    用m序列代替,而对于‘-1’
    用-m序列代替,这样对每-一个数据位都进行扩展就实现了对原始数据的扩频。

    代码如下:

    %扩频
    
    function ssignal=dsss(signal,c)
    
    ssignal=[];
    
    for i=1:length(signal)
    
    ssignal=[ssignal,signal(i)\*c];
    
    end
    
    end
    

    5.调制,使用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
    

    6.解扩

    代码如下:

    %解扩实现
    
    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
    

    7.解调

    代码如下:

    %解调实现.
    
    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
    

    四、主函数仿真代码

    %扩频通信系统仿真的主程序.
    
    clear all;
    
    close 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);
    
    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));
    
    dedssignal1=dedsss(receiveSignal,c1 ,chipRate,fs);
    
    demoSignal1=demodu(dedssignal1,dataRate,fc,fs);
    
    dedssignal2=dedsss(receiveSignal,c2,chipRate,fs);
    
    demoSignal2=demodu(dedssignal2,dataRate,fc,fs);
    
    dedssignal3=dedsss(receiveSignal,c3,chipRate,fs);
    
    demoSignal3=demodu(dedssignal3,dataRate,fc,fs);
    
    err_bitl(i)=sum(demoSignal1\~=signal1)/N;
    
    err_bit2(i)=sum(demoSignal2\~=signal2)/N;
    
    err_bit3(i)=sum(demoSignal3\~=signal3)/N;
    
    end
    
    semilogy(snr,err_bitl,'-s',snr,err_bit2,'-h',snr,err_bit3,'-\*');
    
    legend('用户1',' 用户2','用户3');
    
    xlabel('信噪比');
    
    ylabel('误比特率');
    emoSignal3=demodu(dedssignal3,dataRate,fc,fs);
    
    err_bitl(i)=sum(demoSignal1\~=signal1)/N;
    
    err_bit2(i)=sum(demoSignal2\~=signal2)/N;
    
    err_bit3(i)=sum(demoSignal3\~=signal3)/N;
    
    end
    
    semilogy(snr,err_bitl,'-s',snr,err_bit2,'-h',snr,err_bit3,'-\*');
    
    legend('用户1',' 用户2','用户3');
    
    xlabel('信噪比');
    
    ylabel('误比特率');
    

    五、仿真结果

    各项的数值如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l9xIGNQJ-1588732523753)(media/d972b178efcb23c78a8529cbdcc8cef5.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-942xb3eq-1588732523754)(media/2da480d7ff2d16b180de512ebe6fa5b8.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3Tq4ZoNt-1588732523755)(media/6df6883cda3ba8d29f1bed2f4f4b9677.png)]

    结论:
    
    ①当误比特率一定时,看曲线图总体来说,用户1的信噪比\>用户2的信噪比\>用户3的信噪比。
    
    ②当误信噪比一定时,看曲线图总体来说,用户3的误比特率\>用户2的误比特率\>用户1的误比特率。
    
    ③解调是,一定是先解扩在解调。
    
    展开全文
  • 在《BPSK调制仿真》基础上,(1)将BPSK换成直接扩频通信方式。包括扩频和解扩部分,要求发送信号与接收、解码后的信号相同。 (2)与BPSK\QPSK比较,并画出扩频前后的时域与频域对比图。 (3) 验证直扩系统对窄带...
  • 使用VHDL语言进行直接序列扩频通信系统的仿真,实现信源产生、解扰、交织、直扩、BPSK调制、解调、相关、解交织、解扰、判决等一系列功能。PS:有同学反映文件损坏,又重新上传了一遍
  • 随着通信技术的发展,矿井透地无线数字通信技术得到迅速发展。透地通信技术在抢险救灾等...采用软件无线电的设计思想,使用直接序列扩频BPSK调制解调、分组码编码等技术,通过DSP编程来设计并实现了信令和短信息通信
  • ①传输的数据随机产生,要求采用带宽传输(BPSK调制); ②扩频码要求采用周期为63(或127)的m序列; ③仿真从基站发送数据到三个不同的用户,各不同用户分别进行数据接收; ④设计三种不同的功率衰减分布,从...
  • matlab实现扩频通信系统的多用户数据传输

    千次阅读 热门讨论 2020-05-14 22:02:19
    要求一:扩频通信系统的多用户数据传输 ①传输的数据随机产生,要求采用频带传输(BPSK调制); ②扩频码要求采用周期为63(或127)的m序列; ③仿真从基站发送数据到三个不同的用户,各不同用户分别进行数据接收; ...
  • 该过程中的扩频与解扩均采用63位PN码序列。 给出源码如下: clear all; close all; SNR = -30:1:-20; Eb_No = SNR-10*log10(4);...%并进行BPSK调制 rs=randint(1,bit*T); rs(1)=1; rs(2)=0; rs=rs-0....

空空如也

空空如也

1 2 3
收藏数 58
精华内容 23
关键字:

扩频通信bpsk调制