1. 程式人生 > 其它 >通訊原理軟體實驗(2)

通訊原理軟體實驗(2)

技術標籤:通訊原理軟體實驗matlab

文章目錄

實驗二 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譯碼訊號。

本實驗到這裡就結束了,後續實驗教程筆者會依次上傳到本專欄中,實驗過程中如有操作不當之處,歡迎留言指正。