1. 程式人生 > 其它 >【數字基帶訊號】基於matlab三階高密度雙極型碼【含Matlab原始碼 990期】

【數字基帶訊號】基於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