数字调制2ASK误码率分析matlab实现
寫在開頭:
·關于香農三大定理,以個人學習情況和個人理解以學習總結的形式給出。
香農三大貢獻(定理)
一 香農第一定理(可變長無失真信源編碼定理)
本課程第一節課,老師給出了信息量的度量方式。信息量的度量應該與消息的種類,重要程度無關,與種類無關是比較容易接受的,如果信息量與消息的重要程度失去關聯這是開始讓人難以接受的,但是重要程度這一概念是摻雜有很大的主觀因素的。香農跳脫開了信息重要性的束縛,轉而投靠了“概率”這一概念,一般地我們認為,越小概率發生的時間包含有更多的信息,而越確定發生的事件對我們來說越是“廢話”,包含的信息量更少;除此之外,我們希望信息量之間的疊加對應其概率的相乘(相互獨立的條件下)。以上是我們對信息量度量的絕大部分性質的期待,恰好對數函數擁有這個性質。 信息熵對應平均信息量的概念,也即符號信息量的期望。
之所以要對“信息”這一對外行來說抽象的概念進行度量,其目的是為了communication中信息的壓縮。舉個課上曾舉過的例子,運輸一箱燈泡的過程中,保險安全起見我們會用塑料泡沫包裹燈泡,同樣運輸一大箱同型號的燈泡,但是因為其中泡沫的體積占比不同,導致我們的運輸效率(同體積箱子中燈泡個數)不同,那么我們是否可以通過某種方式,得到燈泡的極限運輸速率?即保證運輸燈泡的安全性的前提下,無限壓縮泡沫的體積。
香農第一定理指明了
·一段信息的信息量是固定的,這稱為這段信息的信息熵(H)
·無論怎么壓縮,信息熵是無失真信源編碼的極限值
·若編碼的平均碼長小于信息熵值,必然發生差錯(也就是有損)
感悟思考:從莫爾斯碼到香農編碼到霍夫曼編碼
莫爾斯碼中常用的字母多用比較簡單的短線表示,使用頻率低的字母長線較多,我認為這體現了一種資源配置的思想,使用頻率或者講出現概率越高的代碼,我們給它分配更快速更便捷實現的方法,以期望平均的工作效率提升。香農將這一思想再次量化,將信源符號按照出現的概率進行了排列,出現頻率高的采用更短的碼長,同時這里暗含了一個編碼壓縮的極限,也就是之后的霍夫曼編碼方式,霍夫曼編碼充分利用短碼,也即將短碼全部占用完成后,再擴充碼長,從而達到了比香農編碼理論中的壓縮極限。
個人認為關于香農第一貢獻,就是天才般的將信息量這一抽象的概念與概率建立了聯系并且將其量化,有了這個度量工具,進而才能指標性的優化壓縮方法,對壓縮數據提供了方向和評判標準。二 香農第二定理(有噪信道編碼定理)
如果說第一定理指出了壓縮編碼(無損)的極限,那么第二定律則指出了信號傳輸速率的極限。公式2-1與我們的直觀認知是相符的,首先是信道容量與信道帶寬呈正相關;而后與信噪比也呈正相關,當噪聲占比大時,傳輸越來越無效。因此也指出了提高傳輸速率的兩個途徑,即增加信道帶寬與提高信噪比。從了解到資料中提及了一個例子,即網速與距離路由器遠近之間有什么關系?為什么距離路由器遠網速越慢?解釋比較容易理解,在信息傳輸過程中會疊加許多噪聲,隨著距離增加,噪聲功率增加,而信號由于信道對其衰減作用功率也會下降,造成信噪比惡化,進而導致信道容量減小,傳輸速率上限降低,網速變慢。
這個公式給出了傳輸速率上限信道容量的影響因素,對于實際的意義還不僅于此。這讓我想到了信息傳輸可靠性與有效性之間的博弈,第二定理啟發性如下:
·有噪信道編碼定理指出,盡管噪聲會干擾通信信道,但還是有可能在信息傳輸速率小于信道容量的前提下,以任意低的錯誤概率傳送數據信息。
犧牲了信息傳輸速率,則有效性降低,換取的是傳輸更加可靠。
三 香農第三定理(保失真度準則下的有失真信源編碼定理)
以上定理:
·給出了信息壓縮的極限:
·R(D)在實際工程中可以作為衡量各種壓縮編碼方法性能優劣的一種標尺
·量化、數模轉換、頻帶壓縮和數據壓縮的理論基礎
關于第三定理的理解不太深入,大概意思理解如下:比如玩而你畫我猜游戲,這個游戲的本質即信息的傳遞,我們假定表達者和接受者之間的認知差異為噪聲,比如傳遞信息“三長兩短”,如果我們一下子表達清楚這個概念是相對困難的,于是我們可以和同伴事先規定一個“通信協議”或者說“校驗”,我們第一個表達動作代表字符個數,然后依次傳輸每一個字符信息,如此,信息的傳遞會變得更加可靠。回到原理本身,第三定理指明了在滿足第一定理壓縮極限,第二定理傳輸速率極限的前提下,如何通信不出錯。
參考:
如何理解「香農定理」,包含哪些內容,它的發現有什么意義?
https://www.zhihu.com/question/447161080/answer/1759158425
三種編碼方式的比較
https://zhuanlan.zhihu.com/p/52234093
如何連貫地理解香農三大定理?
https://www.zhihu.com/question/39296849/answer/1467262363
仿真實驗部分:
·1關于Huffman壓縮編碼
·Huffman編碼思路
霍夫曼編碼使用一種特別的方法為信號源中的每個符號設定二進制碼。出現頻率更大的符號將獲得更短
的比特,出現頻率更小的符號將被分配更長的比特,以此來提高數據壓縮率,提高傳輸效率。
算法步驟:
1.對字符出現的頻率降序排列,進行步驟2
2.查找頻率位于最底層的兩個字符(字符組),并將其組合成新的字符組,字符組出現的頻率等于內部字符(字符組出現頻率之和),如果只剩下兩個字符(字符與字符組;字符組與字符組)進行步驟4;否則進入步驟3
3.將步驟2中組合后的字符與字符組重新按照出現頻率降序排列,重復步驟2
4.如果按照字符組(字符)的排列順序進行編碼,按照左孩子為1,右孩子為0(或者相反)的順序進行編碼,一直到葉子節點,完成編碼
實現如圖1-1,選取信號符號為’aaabbiieubaddyss’,最終壓縮比為1.3333。
圖1-1 Huffman編碼
·2關于Haming信道編碼
規則:
1.設分組碼(n,k)中,k個為有效信息碼,n為編碼后長度,r = n-k為監督碼
2.r個監督碼元構造r個監督關系式指出一位錯碼的n種可能位置,r需要滿足:
3.2^r-1 =n 滿足此線性分組的編碼方式為漢明碼----能夠糾正1位錯碼
為了避免重復造輪子,并且考慮到漢明編碼和解碼實現較為復雜,此處引用matlab內置的函數。
·3 2ASK
思路:
·采用與模擬調制相同的方法,直接將信號與載波相乘
·需要注意:
周期性:一個電平周期應該是載波信號周期的整數倍
問題及解決:
·在濾波的時候,應用lowpass,結果發現總是濾不掉,查閱資料,可以設置濾波器的陡峭特性,重新設置為0.95左右,work
·在進行抽樣判決的時候,起初混淆了理論中判別門限A/2(0 1 概率相同的前提下,雖然0 1 頻率不相等,方便起見假設為0)A的含義,誤當作了解調后的幅值,導致無論怎么加大噪聲,最終誤碼的概率非常之低,經過排查發現了該錯誤。
·關于2ASK采用相干解調誤碼率的極限為多少:許多教材以及相關資料給出了圖3-2中的圖,該圖表明誤碼率的極限應該為0.5,即隨機“瞎猜”也應該為0.5,這與直觀的認知是相符的。
·4 2FSK
調制:
·2FSK可以視為2個不同載頻的2ASK疊加,故仍然可以采用模擬調頻法,不過這里需要對電平范圍進行邏輯轉換
·原電平∈{1,0},可以將原電平整體邏輯取反,然后對取反前后的信號分別做2ask在w1,w2的調制,再疊加
解調:(包絡檢波法較為簡單,此處采用相干解調法)
分別通過兩路帶通濾波器,然后經過相乘器,然后低通濾波,抽樣判決
流程:
S2fsk -| |----抽樣判決----out
|— w2 帶通濾波器 —>相乘器(載波w2)—低通----|
2FSK仿真省略。。。。。。
·5 誤碼率測試問題及解決
誤碼率分辨精度過低:
由于所給信號長度有限,因此誤碼率的分辨精度(這里我指錯一個碼元引起的誤碼率變化)不高,即每錯一個代碼,就會引起誤碼率波動很大,導致最終做出的圖有很多“尖刺”,如圖,這是由于添加高斯噪聲時的隨機性引起的,
解決方法:
1.可以在每一個信噪比點上,多次重復實驗,取誤差率的平均值,相當于在每一個點上進行均值濾波,可以有效抵抗誤碼率分辨精度不高以及awgn函數隨機性引起的“噪聲”干擾。
2.可以將仿真中psr的仿真步長設置的小一些,取得最終的誤差率為相鄰幾個誤差率的平均值,也相當于一個均值濾波。
最佳判別門限:
由于仿真時,代碼數量少,導致01出現的頻率并不相同,經過計算發現這種誤差不可忽略。因此重新計算判別門限,而非簡單取a/2作為判別門限。
最終仿真結果如圖:
參考:
https://blog.csdn.net/qq_45654781/article/details/106579495
https://blog.csdn.net/hxxjxw/article/details/82628565
代碼
%% 信號初始化,為了與真實情況對照,適當增加了字符,調整0-1比例大致為0.5 close all;clear;clc; signal = 'aaabbiieubaddsssyusongsong';% 為提高分辨率精度,又添加了幾個字符 %% 信號Huffman編碼 + haming(7,4)編碼 [dict,huffman_code,H_ratio,num] = En_Huffuman(signal);fprintf('霍夫曼編碼完成\n 壓縮比為:%f\n',H_ratio);global haming_code; haming_code = encode(huffman_code,7,4);fprintf('漢明編碼完成\n 編碼效率為:%f\n',4/7); %% 2ASK調制與解調 --- 時間大約0.5min左右 tic;[err,BStar,reHaming_code,snr] = deCode(huffman_code,num);toc; figure(1);draw(err,snr);function [reHaming_code,bStar] = ASK(snr,lnP) % 功能說明:實現漢明碼載波調制+信道傳輸+相干解調+抽樣判決+輸出單次誤碼率 % input: % snr:信噪比,單位為dB % lnp:計算最佳判別門限 % % output: % reHaming_code:解調后的漢明碼 % bStar:最佳判別門限global haming_code; reHaming_code=zeros(size(haming_code)); numCode = length(haming_code); % 碼元個數 singleT = 100; % 單個信號,每秒鐘采樣數 fs = 100Hz numTime = singleT*numCode; % 總的信號序列數目 t=linspace(0,100,numTime); % 生成時間序列,方便做圖 fc=10000; % 載波頻率 st=t; % 相當于采樣后的信號 % 信號離散化--->調制 for n=1:numCodeif haming_code(n)==0for m=numTime/numCode*(n-1)+1:numTime/numCode*nst(m)=0;endelsefor m=numTime/numCode*(n-1)+1:numTime/numCode*nst(m)=1;endend end% 載波調制 + 信道加噪 s = cos(2*pi*fc*t);% 載波信號 s_2ask = st.*s; s_2ask = awgn(s_2ask,snr);% 相干解調 ss_2ask = s_2ask.*s; ss_2ask = lowpass(ss_2ask,0.95,singleT,'ImpulseResponse','iir','Steepness',0.99);%低通濾波% 最佳判別門限計算 % a = max(ss_2ask); % a = min(1,a); a = 1; bStar = a/2+a/2/(10^(snr/20))*lnP;% 抽樣判決 for m=0:numCode-1 if ss_2ask(1,m*singleT+singleT/2) < bStarreHaming_code(m+1)=0;elsereHaming_code(m+1)=1;end endendfunction [err,BStar,reHaming_code,snr] = deCode(huffman_code,num) % 功能說明:漢明解碼 + 誤碼率分析 % input: % huffman_code:傳輸之前的霍夫曼碼 % num:霍夫曼代碼長度,為了減少運算復雜度,作為參數傳入 % output: % err:誤碼率 % BStar:最佳判別門限,方便理解 % reHaming_code:解調及抽樣判決后得到的漢明碼 % snr:信噪比序列,方便做圖global haming_code; snr = -6:1:18; L = length(snr); err = zeros(1,L); BStar = zeros(1,L); epoch = 16;% 便于計算最佳判別門限計算參數 lnP1 = sum(haming_code)/length(haming_code); lnP = log((1-lnP1)/lnP1); % numHaming = length(haming_code);%調試用for i = 1:Lfor j = 1:epoch[reHaming_code,bStar] = ASK(snr(i),lnP);rehuffman_code = decode(reHaming_code,7,4);Rehuffman_code = rehuffman_code(1,1:num);err(i) = err(i) + sum(Rehuffman_code~=huffman_code)/(num);endBStar(i) = bStar;err(i) = err(i)/epoch; end % 對err進行移動平均濾波,進一步消除偶然誤差(由于碼數少,導致單位誤差率大) windowSize = 4; b = (1/windowSize)*ones(1,windowSize); err = filter(b,1,err);err = err(1,windowSize+1:end); snr = snr(1,windowSize+1:end);endfunction draw(err,snr) % 做出仿真誤差率曲線以及理論曲線% 仿真誤差率 % Err = log10(err); % plot(snr,Err); semilogy(snr,err); xlabel('r/dB');ylabel('Pe');title('2ASK數字調制系統誤碼率與信噪比的關系'); hold on;% 理論誤差率 r = 10.^(snr/20); Perr = 0.5*erfc(sqrt(r/4)); % PErr = log10(Perr); % plot(snr,PErr); semilogy(snr,Perr);endfunction [dict,code,H_ratio,num] = En_Huffuman(signal) % 功能說明:對signal中的字母進行霍夫曼編碼 % 參數說明: % input: % signal:需要轉換的字符串對象,即所需要傳輸的信息 % output: % dict:霍夫曼字典 % code:對信號的編碼 % H_ratio: 利用Huffman編碼的壓縮比 % num:總碼長Signal = tabulate(signal');% Signal 為 k*3維元胞組,k為字符類數;第一列對應字符,第三列為字符對應的頻率% 計算等長碼的平均碼長b k = size(Signal,1); % k個字符采用等長碼需要的b(bit)滿足 2^(b) > k > 2^(b-1); if log2(k) ~= floor(log2(k))b =floor(log2(k))+1;% 反解出 log2(k) <= b < log2(k) + 1 elseb =floor(log2(k)); end% huffman編碼 p = (cell2mat(Signal(:,3))/100)'; symbols = Signal(:,1)'; dict = huffmandict(symbols,p); code = huffmanenco(signal,dict);% 計算壓縮后的平均碼長 L L = 0; for i = 1 : kL = L + size(cell2mat(dict(i,2)))*p(i); end% 總碼長,用于計算誤碼率 num = length(code);% 提高代碼效率,預先計算代碼長度% 計算壓縮比 H_ratio = b/L(2);end總結
以上是生活随笔為你收集整理的数字调制2ASK误码率分析matlab实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 魔力宝贝手游不花钱怎么玩
- 下一篇: 米家互联网空调和c1区别