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

相关文章

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja