本文主要是介绍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实现扩频通信系统的多用户数据传输的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!