通訊原理軟體實驗(2)
文章目錄
實驗二 AMI和HDB3編碼與譯碼
本實驗的目的是用MATLAB實現AMI碼和HDB3碼的編譯碼。其中AMI碼的編碼規則是將“1”變為“+1”和“-1”交替的序列,“0”不變,這樣的編碼方式雖然簡單,但當基帶出現連續的多個“0”時,AMI碼中就不能提取出同步訊號。
由於AMI碼存在這樣的缺點,HDB3碼就由此而來,雖然編碼方式較為繁瑣(這裡附上知乎上一個介紹HDB3碼編碼方式的網址:連結),但是其譯碼卻非常簡單,只需在HDB3碼中找到與前一個非零碼極性相同的破壞碼V,然後將其與之前面的三個碼全部變成0,最後對整個序列取絕對值,即可得到原始序列。
話不多說,直接上程式碼。
1.AMI編碼與譯碼的實現
實現此功能的程式碼如下:
close all;
clear all;
clc;
in = [1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1];
num = 0;
len = length(in);
AMI = zeros(1, len); % AMI編碼結果
for i = 1:len
if in(i) == 1
num = num+1;
if num / 2 == fix(num / 2)
AMI(i) = 1;
else
AMI (i) = -1;
end
end
end
decodeAMI = abs(AMI); % AMI譯碼結果
figure(1);
subplot(3, 1, 1);stairs([0:length(in) - 1], in);axis([0 length(in) -2 2]);
subplot(3, 1, 2);stairs([0:length(in) - 1],AMI);axis([0 length(in) -2 2]);
subplot(3, 1, 3);stairs([0:length(in) - 1],decodeAMI);axis([0 length(in) -2 2]);
這裡直接參考了實驗指導書上的程式碼,做了一點微小的改動,該程式碼的思路就是在編碼過程中對輸入訊號的“1”進行模為2的計數,將奇次的“1”變為“-1”,偶次的“1”變為“+1”。對編碼結果取絕對值就得到譯碼結果。
將這段程式碼複製進MATLAB指令碼檔案後便可直接執行,執行後生成的波形如下:
最上方的圖是輸入訊號,中間的圖是AMI編碼訊號,最下方的圖是AMI譯碼訊號。
2.HDB3編碼與譯碼的實現
在上述程式碼後方新增如下程式碼段實現HDB3的編碼和譯碼:
HDB3 = AMI; % HDB3編碼結果
num = 0;
last1 = 0;
lastV = 0;
for i = 1:len
if HDB3(i) == 0
num = num + 1;
if num == 4
if lastV == last1
HDB3(i) = -last1;
HDB3(i - 3) = -last1;
else
HDB3(i) = last1;
end
lastV = HDB3(i);
last1 = lastV;
num = 0;
end
else
if HDB3(i) == last1
HDB3(i) = -last1;
end
last1 = HDB3(i);
num = 0;
end
end
decodeHDB3 = HDB3; % HDB3譯碼結果
last1 = 0;
for i = 1:len
if decodeHDB3(i) ~= 0
if decodeHDB3(i) == last1
last1 = decodeHDB3(i);
for j = 0:3
decodeHDB3(i - j) = 0;
end
else
last1 = decodeHDB3(i);
end
end
end
decodeHDB3 = abs(decodeHDB3);
figure(2);
subplot(3, 1, 1);stairs([0:length(in) - 1], in);axis([0 length(in) -2 2]);
subplot(3, 1, 2);stairs([0:length(in) - 1],HDB3);axis([0 length(in) -2 2]);
subplot(3, 1, 3);stairs([0:length(in) - 1],decodeHDB3);axis([0 length(in) -2 2]);
該程式碼段是筆者拍腦袋寫的,主要分為兩個模組:HDB3的編碼和HDB3的譯碼,先簡單講解一下實現的思路:
- HDB3的編碼
該段程式碼利用了之前編好的AMI碼,設定了兩個新的變數last1和lastV,其中last1用於記錄上一個非零資料的極性,lastV用於記錄上一個破壞碼V的極性。
第5行到第26行的for迴圈就是對HDB3編碼的具體實現,首先對整個輸入資料進行遍歷,出現0就將變數num的值+1,如果出現連續的4個0,num的值變為4,就進入第6行的if語句,根據變數last1和lastV的值對這連續4個0進行HDB3規則的編碼,編碼完成後更新last1和lastV的資料,同時將num置0。
出現非0的資料就進入第19行的else語句,判斷當前資料和變數last1的極性是否相反,如果不是相反就將它設定成相反,設定完成後更新last1的值並將num置0.
- HDB3的譯碼
第27行到第41行是對HDB3譯碼的具體實現,其中last1變數仍然是用於記錄上一個非零資料的極性,第29行到第40行的for迴圈用於尋找HDB3碼中的破壞碼V,找到後將其和前面的3個數據全部置為0。隨後對處理後的序列取絕對值就得到譯碼結果。
將這段程式碼新增完成後執行就能得到如下結果:
最上方的圖是輸入訊號,中間的圖是HDB3編碼訊號,最下方的圖是HDB3譯碼訊號。
本實驗到這裡就結束了,後續實驗教程筆者會依次上傳到本專欄中,實驗過程中如有操作不當之處,歡迎留言指正。