matlab实现扩频通信系统的多用户数据传输

2024-04-09 18:58

本文主要是介绍matlab实现扩频通信系统的多用户数据传输,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 一、仿真要求
    • 二、设计方案
        • 1.系统的总体框图
        • 2.发射机原理图及设计
        • 3.接收机原理图
        • 4.主程序流程图
        • 5.扩频码的产生
        • 6.扩频
        • 7.接收端解扩
        • 8.调制与解调
    • 三、程序代码
        • 1.产生m序列代码:
        • 2.扩频代码:
        • 3.多径信道的仿真
        • 4.解扩代码:
        • 5.发送随机序列
        • 6.调制代码
        • 7.解调代码
        • 8.主程序代码:
    • 四、仿真结果

一、仿真要求

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

要求二:利用蒙特卡罗仿真方法对扩频增益进行性能仿真
设计仿真方案,得到在数据传输过程中进行扩频(扩频序列用m序列)和不进行扩频的BER性能结论,要求得到的BER曲线较为平滑,并说明这种结论与理论上的结论是否相符,为什么?

二、设计方案

1.系统的总体框图

在这里插入图片描述

2.发射机原理图及设计

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

3.接收机原理图

在这里插入图片描述
从上面的图可以知道,整个设计由发送端、信道和接收机组成。

在发射端主要完成m序列的产生,随机0,1序列的产生。然后利用m序列对产生的随机序列进行扩频,然后再用cos(wt)对其进行调制。
信道主要模拟信号的多径传输,假设有三个用户在进行数据传输,分别经过了2,3,4径衰落。

接收端接收到的信号是多种信号的叠加,经过解扩,解调,滤波,抽样判决等操作后得到解调信号,最后与原始信号进行比较,并得到误码率。

4.主程序流程图

在这里插入图片描述

5.扩频码的产生

m序列是由多位级移寄存器或其它延迟元件通过线性反馈产生的最长的码序列。在二进制位移寄存器发生器中,若n为级数,则能产生的最大长度的码序列为位。

在这里插入图片描述

6.扩频

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

在这里插入图片描述

7.接收端解扩

在假定扩频码与接收信号同步的情况下, 可对接收信号进行解扩, 其解扩的过程与扩频的过程一样, 也是利用扩频码与接收信号进行相乘即可。其原理图如下:

在这里插入图片描述

8.调制与解调

本次实验采用的是BPSK调制解调方式。发送端将扩频后的信号s乘上载波cos(2Πft)即完成了调制,接收端再乘以载波cos(2Πft)做相干解调,必须保证接收端乘以的载波与发送端的载波是相干的才能很好的解调,最后再经过一个低通滤波器滤除相乘过程中产生的高频成分即完成了解调。

三、程序代码

1.产生m序列代码:
function c=genMseq(b)N=length(b)-1;D=ones(1,N);A=b(N:-1:1);c=[];for i=1:2^N-1c1=rem(sum(D.*A),2);c=[c,D(N)];D=[c1,D(1:N-1)];endc=c*2-1;
end
2.扩频代码:
function ssigna1=dsss(signa1,c)ssignal=[];for i=1:length(signal)ssigna1=[ssignal,signal(i)*c];end
end 
3.多径信道的仿真
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,8),r2(1:length(modusignal)-8)];
x3=randn(1,len);
y3=randn(1,len);
r3=abs(x3+j*y3).*modusignal;
r3=[zeros(1,10),r3(1:length(modusignal)-10)];
if k==2multiS=modusignal+r1;
else if k==3multiS=modusignal+r1+r2;
else if k==4multiS=modusignal+r1+r2+r3;
end
end
end
multiS=awgn(multiS,snr);
end
4.解扩代码:
function dessignal=dedsss(receiveSignal,c,chipRate,fs)L=fs/chipRate;c1=[];for i=1:length(c)c1=[c1,c(i)*ones(1,L)];enddessignal=[];for i=1:length(c1):length(receiveSignal)dessignal=[dessignal,receiveSignal(i:i+length(c1)-1).*c1];end
end
5.发送随机序列
function signal=information(N)%发送随机序列
signal=rand(1,N)>=0.5;
signal=signal*2-1;
end
6.调制代码
function modusignal=modu(signal,dataRate,fc,fs)%采用BPSK调制方式
t=linspace(0,1/dataRate,fs/dataRate);%在0-Tc之间采样fs点
carrier=cos(2*pi*fc*t);%频率为fs载波
modusignal=[];%初始化接收调制矩阵
for i=1:length(signal)modusignal=[modusignal,carrier*signal(i)];
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:Lsdesignal=[designal,carrier.*Resignal(i:i+Lc-1)];
end
demoSignal=[];
for i=1:Lc:Lsthreshold=sum(designal(i:i+Lc-1));if threshold>0tt=1;elsett=-1;enddemoSignal=[demoSignal,tt];
end
end
8.主程序代码:
%主函数
clear all;
clc;
dataRate=1000;
chipRate=31*dataRate;
fc=chipRate*2;
fs=fc*8;
N=1000;
c=31;
b1=[1,0,0,1,0,1];
b2=[1,1,0,1,1,1];
b3=[1,1,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));%多径干扰receivesignal1=channels(receivesignal,snr(i),2);receivesignal2=channels(receivesignal,snr(i),3);receivesignal3=channels(receivesignal,snr(i),4);%衰落路径为2%c1解扩dedssignal1=dedsss(receivesignal1,c1,chipRate,fs);%积分器解调demoSignal1=demodu(dedssignal1,dataRate,fc,fs);dedssignal2=dedsss(receivesignal1,c2,chipRate,fs);demoSignal2=demodu(dedssignal2,dataRate,fc,fs);dedssignal3=dedsss(receivesignal1,c3,chipRate,fs);demoSignal3=demodu(dedssignal3,dataRate,fc,fs);%误比特率计算err_bit11(i)=sum(demoSignal1~=signal1)/N;err_bit12(i)=sum(demoSignal2~=signal2)/N;err_bit13(i)=sum(demoSignal3~=signal3)/N;%衰落路径为3%信号C1解扩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;%衰落路径为4%信号C1解扩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;
%不进行扩频的BERmodusignal1=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_bit21(i)=sum(demosignal21~=signal1)/N;err_bit22(i)=sum(demosignal22~=signal2)/N;err_bit23(i)=sum(demosignal23~=signal3)/N;end
figure(1)
semilogy(snr,err_bit11,'-s',snr,err_bit12,'-h',snr,err_bit13,'-*');
legend('用户1','用户2','用户3');
title('多径衰落路径2')
xlabel('信噪比');
ylabel('误比特率');figure(2)
semilogy(snr,err_bit21,'-s',snr,err_bit22,'-h',snr,err_bit23,'-*');
legend('用户1','用户2','用户3');
title('多径衰落路径3')
xlabel('信噪比');
ylabel('误比特率');figure(3)
semilogy(snr,err_bit31,'-s',snr,err_bit32,'-h',snr,err_bit33,'-*');
legend('用户1','用户2','用户3');
title('多径衰落路径4')
xlabel('信噪比');
ylabel('误比特率');figure(5)
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(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 100 -1.1 1.1]);

四、仿真结果

在这里插入图片描述
三组信号经过解扩,解调,采样判决后的信号对比
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
由上图可得,通过直接扩频得到的BER曲线较为平滑,这种结论与理论上相符,因为扩频技术可以将噪声信号进行展宽,在通过低通滤波器就可以滤掉大量的噪声信号。

这篇关于matlab实现扩频通信系统的多用户数据传输的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/888960

相关文章

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Java easyExcel实现导入多sheet的Excel

《JavaeasyExcel实现导入多sheet的Excel》这篇文章主要为大家详细介绍了如何使用JavaeasyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录1.官网2.Excel样式3.代码1.官网easyExcel官网2.Excel样式3.代码

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

Golang如何用gorm实现分页的功能

《Golang如何用gorm实现分页的功能》:本文主要介绍Golang如何用gorm实现分页的功能方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景go库下载初始化数据【1】建表【2】插入数据【3】查看数据4、代码示例【1】gorm结构体定义【2】分页结构体