【數字基帶訊號】基於matlab三階高密度雙極型碼【含Matlab原始碼 990期】
一、簡介
要了解HDB3碼的編碼規則,首先要知道AMI碼的構成規則,AMI碼就是把單極性脈衝序列中相鄰的“1”碼(即正脈衝)變為極性交替的正、負脈衝。將“0”碼保持不變,把“1”碼變為+1、-1半佔空歸零碼錶示的交替的脈衝。如:
NRZ碼:1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 1
AMI碼:-1 0 0 0 0 +1 0 0 0 0 -1 +1 0 0 0 0 -1 +1
HDB3碼是一種AMI碼的改進型,它的編碼原理可簡述為,在訊息的二進位制程式碼序列中:
(1)當連“0”碼的個數不大於3時,HDB3編碼規律與AMI碼相同,即“1”碼變為“+1”、“-1”交替脈衝;
(2)當代碼序列中出現4個連“0”碼或超過4個連“0”碼時,把連“0”段按4個“0”分節,即“0000”,並使第4個“0”碼變為“1”碼,用V脈衝表示。這樣可以消除長連“0”現象。為了便於識別V脈衝,使V脈衝極性與前一個“1”脈衝極性相同。這樣就破壞了AMI碼極性交替的規律,所以V脈衝為破壞脈衝,把V脈衝和前3個連“0”稱為破壞節“000V”;
(3)為了使脈衝序列仍不含直流分量,則必須使相鄰的破壞點V脈衝極性交替;
(4)為了保證前面兩條件成立,必須使相鄰的破壞點之間有奇數個“1”碼。如果原序列中破壞點之間的“1”碼為偶數,則必須補為奇數,即將破壞節中的第一個“0”碼變為“1”,用B脈衝表示。這時破壞節變為“B00V”形式。B脈衝極性與前一“1”脈衝極性相反,而B脈衝極性和V脈衝極性相同。
如:
NRZ碼: 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 1
AMI碼: -1 0 0 0 0 +1 0 0 0 0 -1 +1 0 0 0 0 -1 +1
HDB3碼: -1 0 0 0 -V +1 0 0 0 +V -1 +1 –B 0 0 -V +1 -1
雖然HDB3碼的編碼規則比較複雜,但譯碼卻比較簡單。從上述原理看出:每一個破壞符號V總是與前一非0符號同極性(包括B在內)。這就是說,從收到的符號序列中可以容易地找到破壞點V,於是也斷定V符號及其前面的3個符號必是連0符號,從而恢復4個連0碼,再將所有-1變成+1後便得到原訊息程式碼。
HDB3如此, HDBn是一樣推的. 主要是破壞節的長度不同
這裡記錄一個自己理解的小概念
歸零與不歸零:
比如都是表示 "1"
像這種,在整個碼元期間電平保持不變的 就是不歸零
像這種在一個碼元期間內發生變化的,比如先低後高,或者先高後低的就是歸零的
二、原始碼
x=[1 0 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0];% 輸入原碼 y=x;% 輸出y初始化 num=0;% 計數器初始化 for k=1:length(x) if x(k)==1 num=num+1; % "1"計數器 if num/2 == fix(num/2) % 奇數個1時輸出-1,進行極性交替 y(k)=1; else y(k)=-1; end end end % HDB3編碼 num=0; % 連零計數器初始化 yh=y; % 輸出初始化 sign=0; % 極性標誌初始化為0 V=zeros(1,length(y));% V脈衝位置記錄變數 B=zeros(1,length(y));% B脈衝位置記錄變數 for k=1:length(y) if y(k)==0 num=num+1; % 連“0”個數計數 if num==4 % 如果4連“0” num=0; % 計數器清零 yh(k)=1*yh(k-4); % 讓0000的最後一個0改變為與前一個非零符號相同極性的符號 V(k)=yh(k); % V脈衝位置記錄 if yh(k)==sign % 如果當前V符號與前一個V符號的極性相同 yh(k)=-1*yh(k); % 則讓當前V符號極性反轉,以滿足V符號間相互極性反轉要求 yh(k-3)=yh(k); % 新增B符號,與V符號同極性 B(k-3)=yh(k); % B脈衝位置記錄 V(k)=yh(k); % V脈衝位置記錄 yh(k+1:length(y))=-1*yh(k+1:length(y)); % 並讓後面的非零符號從V符號開始再交替變化 end sign=yh(k); % 記錄前一個V符號的極性 end else num=0; % 當前輸入為“1”則連“0”計數器清零 end end % 編碼完成 % re=[x',y',yh',V',B']; % 結果輸出: x AMI HDB3 V&B符號 % HDB3解碼
三、執行結果
四、備註
版本:2014a
完整程式碼或代寫加1564658423