繼續講解!本堂課開始給出直接序列擴頻的程序實例。程序雖然簡單,但是能說明和驗證部分理論。學習就是要從簡單入手,然后再逐步深入。之前給出的直接序列擴頻程序就是純理論仿真程序。
不過講之前先聊聊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;
原文標題:計算機通信與網絡v2 實驗課程(22)
文章出處:【微信公眾號:通信工程師專輯】歡迎添加關注!文章轉載請注明出處。
-
通信網絡
+關注
關注
21文章
2074瀏覽量
52783
原文標題:計算機通信與網絡v2 實驗課程(22)
文章出處:【微信號:gh_30373fc74387,微信公眾號:通信工程師專輯】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
微軟OmniParser V2:大模型轉化為計算機智能體
微軟OmniParser V2發布:大模型轉化為計算機智能體
BU-67121W實驗室航空電子接口計算機North Hills
工業中使用哪種計算機?

評論