继续讲解!本堂课开始给出直接序列扩频的程序实例。程序虽然简单,但是能说明和验证部分理论。学习就是要从简单入手,然后再逐步深入。之前给出的直接序列扩频程序就是纯理论仿真程序。
不过讲之前先聊聊5G。喊了好几年了,真的快来到了。中国企业这次不会再是旁观者了。2018年6月,随着5G新空口(NR: New Radio)独立组网功能的冻结,5G已经完成第一阶段的全面标准化工作,进入全面产业化阶段,预计2020年实现全面商用。与前几代移动通信相比,5G的系统性能大幅提高,峰值速率可达10Gbps~20Gbps,用户体验速率可达100Mbps~1Gbps,连接数密度每平方公里可达100万,每平方米流量密度可达10Mbps,能够支持500km/h运动情况下的通信。从业务能力来说,5G能够满足更为丰富的业务需求。过去几代移动通信主要实现“人与人”之间的通信;而在5G时代,还要实现“人与物”、“物与物”之间的高效通信,最终实现“万物互联”。国际电信联盟(ITU)将增强的移动宽带(eMBB)、高可靠低延迟通信(uRLLC)以及大规模机器通信(mMTC)定义为5G的三大主要应用场景。2018年,国家喊出了6G。对于这个消息,我有点晕!5G似乎还没能稳定运行啊?技术可以先行。2022年了,5G有了,芯片被卡脖子了。
来看程序吧。
这可是老师当年在企业时写的研发代码哦!
珍惜的看吧!
% 卫星地球站多进制位移m序列扩频系统算法仿真 %
%%********* 程序说明 **********%
%% File: IF_satelliteMaryds_sim1.m %%
%% date: 2008-03-31 author: 算法工匠%%
%%% 目的
%%% 本程序进行卫星地球站中多进制位移m序列扩频系统算法仿真。
%%% 为测试程序的误码率性能,故没有捕获部分。
%%% 仿真环境
%%% 信号源设置:信号源仅含有同步码。
%%% 采样速率:码片速率的4倍,奈奎斯特采样, 设置有采样偏差
%%% 中频频率:1倍码片速率 载波偏差:200Hz
%%% 码片速率: 2.4KHz 加噪采用awgn方式
%%% 无捕获部分。
%%% 程序结构
%%% 系统的同步码采用32位的m序列作为对频偏和同步的引导,
% 帧头采用码长63位m序列的前32位比特,采用BPSK调制方式
%%% 数据传送采用QPSK调制方式(以后可改进为oqpsk方式),
% 数据传送过程中有同步辅助。
%%% 伪码跟踪在I信道中完成。
%%% I信道使用位移的m序列(采用[5,2]反馈结构)进行同步,
% BTR、帧头和帧尾是包含在该路信号中。使用差分调制。
%%% Q路用16ary多进制扩频。
% Q信使用位移的m序列(采用[5,4,2,1]反馈结构)进行数据传输。
%%% I路的BTR码采用全1的模式,利于用fft的捕获方式。
%%% 切记:改抽样因子的同时,要改动捕获门限值。
%%% 改进之处
clear all;
%%************ 程序主体 ************%%
format long;
start_time = clock;
%%%%%%%%%% %%%%%%%
%% 固定参数部分 %%
%%%%%%%%%%%%%%%%%%
%--升滚降平方根滤波器的参数设置---
ins_value = 8; % 内插因子
br = 4; % 信息源比特率
sr = 1;
cr = 2.4e3*1 ; % 码片速率
%---产生扩频序列----
stg = 5;
taps = [ 2, 5 ];
inidata = [ 1, 1, 1, 1, 1 ];
n = 1;
I_mseq = funct_mseq(stg, taps, inidata, n);
I_mseq_nrz = [2*I_mseq-1 -1]; % Unbipolar -> Bipolar
time_Iseq = ceil(1/ins_value.*(1:length(I_mseq_nrz)*ins_value));
I_mseq_nrz_ceil = I_mseq_nrz(time_Iseq);
I_mseq_fft = fft(I_mseq_nrz_ceil);
I_mseq_ceil_triple = [I_mseq_nrz_ceil I_mseq_nrz_ceil I_mseq_nrz_ceil];
stg = 5;
taps = [ 1, 2, 4, 5 ];
inidata = [ 1, 1, 1, 1, 1 ];
n = 1;
Q_mseq = funct_mseq(stg, taps, inidata, n);
Q_mseq_nrz = [2*Q_mseq-1 -1]; % Unbipolar -> Bipolar
Q_mseq_nrz_ceil = Q_mseq_nrz(time_Iseq);
Q_mseq_ceil_triple = [Q_mseq_nrz_ceil Q_mseq_nrz_ceil Q_mseq_nrz_ceil];
Q_mseq_doub = [2*Q_mseq-1 -1 2*Q_mseq-1 -1];
for i = 1:16
Q_mseqmarix(i,:) = Q_mseq_doub(2*(i-1)+1:2*(i-1)+32);
end
%---采样频偏参数---
offset=0.01;
ideal_samplefre = ins_value*cr;
samplefre = ideal_samplefre+offset;
%----载波和频偏参数----
fcarrier = 1*cr;
foffset = 110;
ophase = pi/3;
%----DLL参数设置 ----
Bd = 0.001;
% 环路噪声带宽
damp = 0.707;
% 阻尼系数
td = 32/cr;
% 相关积分时间
Kd = 1;
% 环路增益
Wd = 2*Bd/(damp+1/(4*damp));
% 自然角频率
Cd1 = 8*damp*Wd*td/(Kd*(4+4*damp*Wd*td+(Wd*td)^2));
% 环路滤波器的系数
Cd2 = 4*(Wd*td)^2/(Kd*(4+4*damp*Wd*td+(Wd*td)^2));
%%%%%%%%%%%
%% 发射机部分 %%
%%%%%%%%%%
%----- 信息组帧 -----
%---- I路成帧 ----
%---BTR码--
% I_BTR = [ 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 ]; % 16位
I_BTR = ones(1,16);
%-帧头 采用63码长的m序列中前32比特--
I_framestart_uwcode = [ 1 -1 1 1 1 -1 1 -1 1 1 -1 1 -1 -1 1 1 -1 1 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 1 1];
%---帧尾 采用3个barker码级联--
I_frameend_uwcode = [ -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 1];
%--- 帧信息内容 ------
frame_msg = 2*randint(1,2000)-1;
%-串并转化 分解为I路和Q路信息---
IQdata = reshape(frame_msg,5,length(frame_msg)/5);
IQdata(1,151:190) = ones(1,40); % 设置标志以便调试程序
Iinformation = IQdata(1,:);
Qinformation = reshape([IQdata(2,:);IQdata(3,:);IQdata(4,:);IQdata(5,:)],1,4*length(frame_msg)/5);
%---- 成帧 --------
frame_msg_infI = [ I_BTR I_framestart_uwcode Iinformation I_frameend_uwcode ];
frame_msg_infQ = [zeros(1,length([I_BTR I_framestart_uwcode])) Qinformation zeros(1,length(I_frameend_uwcode))];
%---- 调制 ------
%--- I路信息的DBPSK调制 ---
len=2;
inf_phase(1)=0;
for i=1:length(frame_msg_infI)
if frame_msg_infI(i) == 1
inf_phase(len) = inf_phase(len-1);
elseif frame_msg_infI(i) == -1
inf_phase(len) = inf_phase(len-1) + pi;
end
len =len +1;
end
Tra_baseI = cos(inf_phase);
% 注意:这里会导致I路多出一个符号,因此信号源要多加32个0
%---I路信息的直扩调制-----
for index = 1:length(Tra_baseI)
I_tx_dsseq ((index-1)*32+1:index*32) = Tra_baseI(index)*I_mseq_nrz;
end
%--Q路信息的多进制扩频调制----
Mary_bits = 4;
for index = 1:length(Qinformation)/Mary_bits
if (Qinformation(Mary_bits*index-3)== -1 && Qinformation(Mary_bits*index-2)== -1 && Qinformation(Mary_bits*index-1)== -1 && Qinformation(Mary_bits*index)== -1)
Q_tx_dsseq((index-1)*32+1:index*32) = Q_mseqmarix(1,:);
Q_mseqsite(index) = 1; % 本语句的目的是为了可以进行误码的追踪。
elseif (Qinformation(Mary_bits*index-3)== 1 && Qinformation(Mary_bits*index-2)== -1 && Qinformation(Mary_bits*index-1)== -1 && Qinformation(Mary_bits*index)== -1)
Q_tx_dsseq ((index-1)*32+1:index*32) = Q_mseqmarix(2,:);
Q_mseqsite(index) = 32*ins_value - 2*(2-1)*ins_value + 1;
elseif (Qinformation(Mary_bits*index-3)== -1 && Qinformation(Mary_bits*index-2)== 1 && Qinformation(Mary_bits*index-1)== -1 && Qinformation(Mary_bits*index)== -1)
Q_tx_dsseq ((index-1)*32+1:index*32) = Q_mseqmarix(3,:);
Q_mseqsite(index) = 32*ins_value - 2*(3-1)*ins_value + 1;
elseif (Qinformation(Mary_bits*index-3)== 1 && Qinformation(Mary_bits*index-2)== 1 && Qinformation(Mary_bits*index-1)== -1 && Qinformation(Mary_bits*index)== -1)
Q_tx_dsseq ((index-1)*32+1:index*32) = Q_mseqmarix(4,:);
Q_mseqsite(index) = 32*ins_value - 2*(4-1)*ins_value + 1;
elseif (Qinformation(Mary_bits*index-3)== -1 && Qinformation(Mary_bits*index-2)== -1 && Qinformation(Mary_bits*index-1)== 1 && Qinformation(Mary_bits*index)== -1)
Q_tx_dsseq ((index-1)*32+1:index*32) = Q_mseqmarix(5,:);
Q_mseqsite(index) = 32*ins_value - 2*(5-1)*ins_value + 1;
elseif (Qinformation(Mary_bits*index-3)== 1 && Qinformation(Mary_bits*index-2)== -1 && Qinformation(Mary_bits*index-1)== 1 && Qinformation(Mary_bits*index)== -1)
Q_tx_dsseq ((index-1)*32+1:index*32) = Q_mseqmarix(6,:);
Q_mseqsite(index) = 32*ins_value - 2*(6-1)*ins_value + 1;
elseif (Qinformation(Mary_bits*index-3)== -1 && Qinformation(Mary_bits*index-2)== 1 && Qinformation(Mary_bits*index-1)== 1 && Qinformation(Mary_bits*index)== -1)
Q_tx_dsseq ((index-1)*32+1:index*32) = Q_mseqmarix(7,:);
Q_mseqsite(index) = 32*ins_value - 2*(7-1)*ins_value + 1;
elseif (Qinformation(Mary_bits*index-3)== 1 && Qinformation(Mary_bits*index-2)== 1 && Qinformation(Mary_bits*index-1)== 1 && Qinformation(Mary_bits*index)== -1)
Q_tx_dsseq ((index-1)*32+1:index*32) = Q_mseqmarix(8,:);
Q_mseqsite(index) = 32*ins_value - 2*(8-1)*ins_value + 1;
elseif (Qinformation(Mary_bits*index-3)== -1 && Qinformation(Mary_bits*index-2)== -1 && Qinformation(Mary_bits*index-1)== -1 && Qinformation(Mary_bits*index)== 1)
Q_tx_dsseq ((index-1)*32+1:index*32) = Q_mseqmarix(9,:);
Q_mseqsite(index) = 32*ins_value - 2*(9-1)*ins_value + 1;
elseif (Qinformation(Mary_bits*index-3)== 1 && Qinformation(Mary_bits*index-2)== -1 && Qinformation(Mary_bits*index-1)== -1 && Qinformation(Mary_bits*index)== 1)
Q_tx_dsseq ((index-1)*32+1:index*32) = Q_mseqmarix(10,:);
Q_mseqsite(index) = 32*ins_value - 2*(10-1)*ins_value + 1;
elseif (Qinformation(Mary_bits*index-3)== -1 && Qinformation(Mary_bits*index-2)== 1 && Qinformation(Mary_bits*index-1)== -1 && Qinformation(Mary_bits*index)== 1)
Q_tx_dsseq ((index-1)*32+1:index*32) = Q_mseqmarix(11,:);
Q_mseqsite(index) = 32*ins_value - 2*(11-1)*ins_value + 1;
elseif (Qinformation(Mary_bits*index-3)== 1 && Qinformation(Mary_bits*index-2)== 1 && Qinformation(Mary_bits*index-1)== -1 && Qinformation(Mary_bits*index)== 1)
Q_tx_dsseq ((index-1)*32+1:index*32) = Q_mseqmarix(12,:);
Q_mseqsite(index) = 32*ins_value - 2*(12-1)*ins_value + 1;
elseif (Qinformation(Mary_bits*index-3)== -1 && Qinformation(Mary_bits*index-2)== -1 && Qinformation(Mary_bits*index-1)== 1 && Qinformation(Mary_bits*index)== 1)
Q_tx_dsseq ((index-1)*32+1:index*32) = Q_mseqmarix(13,:);
Q_mseqsite(index) = 32*ins_value - 2*(13-1)*ins_value + 1;
elseif (Qinformation(Mary_bits*index-3)== 1 && Qinformation(Mary_bits*index-2)== -1 && Qinformation(Mary_bits*index-1)== 1 && Qinformation(Mary_bits*index)== 1)
Q_tx_dsseq ((index-1)*32+1:index*32) = Q_mseqmarix(14,:);
Q_mseqsite(index) = 32*ins_value - 2*(14-1)*ins_value + 1;
elseif (Qinformation(Mary_bits*index-3)== -1 && Qinformation(Mary_bits*index-2)== 1 && Qinformation(Mary_bits*index-1)== 1 && Qinformation(Mary_bits*index)== 1)
Q_tx_dsseq ((index-1)*32+1:index*32) = Q_mseqmarix(15,:);
Q_mseqsite(index) = 32*ins_value - 2*(15-1)*ins_value + 1;
elseif (Qinformation(Mary_bits*index-3)== 1 && Qinformation(Mary_bits*index-2)== 1 && Qinformation(Mary_bits*index-1)== 1 && Qinformation(Mary_bits*index)== 1)
Q_tx_dsseq ((index-1)*32+1:index*32) = Q_mseqmarix(16,:);
Q_mseqsite(index) = 32*ins_value - 2*(16-1)*ins_value + 1;
elseif (Qinformation(Mary_bits*index-3)== 0 && Qinformation(Mary_bits*index-2)== 0 && Qinformation(Mary_bits*index-1)== 0 && Qinformation(Mary_bits*index)== 0)
Q_tx_dsseq ((index-1)*32+1:index*32) = zeros(1,32);
Q_mseqsite(index) = 0;
end
end
%--- 扩频调制信息成帧 -----
% Ibit_flow = [ zeros(1,100) I_tx_dsseq zeros(1,100) ]; %
% Qbit_flow = [ zeros(1,100) Q_tx_dsseq zeros(1,100) ];
% 信息添加起始内容表征突发模式
Ibit_flow = [ I_tx_dsseq zeros(1,100) ]; %
Qbit_flow = [ zeros(1,(length([I_BTR I_framestart_uwcode])+1)*32) Q_tx_dsseq zeros(1,length(I_frameend_uwcode)*32) zeros(1,100) ]; %
%%% 帧尾加0是为方便本程序比较误码率所设,实际系统中没有该部分内容
%-- 内插ins_value倍并加入采样频偏 -
ins_seq = ceil(cr/samplefre.*(1:length(Ibit_flow)*ins_value));
Isignalsample = Ibit_flow(ins_seq);
Qsignalsample = Qbit_flow(ins_seq);
%---生成有载波调制的数据---
time = (0:length(Isignalsample)-1)/samplefre;
tra_IFsignal = Isignalsample.*cos(2*pi*(fcarrier+foffset).*time+ophase) + Qsignalsample.*sin(2*pi*(fcarrier+foffset).*time+ophase);
什么是多进制扩频?这些可是当年本人在企业研发的干货啊,就先给出调制部分的内容吧,让同学们近距离的接触“实战”程序。如果想深入学习,那就请考研吧。毕竟只有到了研究生阶段才会深入学习扩频知识,本科阶段的学习以掌握基本原理为主。未完,待续!
20181118记录:
【流量主】公众号文中流量主违规示例及操作建议周知
为保障你持续获取文中广告位展示收益,避免出现如违规遮盖、诱导点击等违规行为,请认真阅读公众号文中流量主违规示例及操作建议。
如有疑问:可通过公众号“微信广告助手”联系我们。
微信广告团队
2018年11月16日
收到了微信发来的邮件,值得好好读一下。
不能违规,要严格遵守。
毕竟公众号是在微信的帮助下不断的成长!
如果公众号已经是流量主了,请注意不要违规,不然会被封号。
修订记录
20181123 完成初稿;
20221213修订内容v2;
-
通信网络
+关注
关注
21文章
2028浏览量
51962
原文标题:计算机通信与网络v2 实验课程(22)
文章出处:【微信号:gh_30373fc74387,微信公众号:通信工程师专辑】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论