上一篇-前菜篇,我們對PDM進行了一些頭腦風暴,思考實驗,并沒有涉及具體的理論。但是我們發明了自己的PDM,核心思想是,進行抽象,用10數字流代表PDM,用窗口滑動平均,窗口內平均的1的密度來反映電壓的高低。也留下了問題就是如何來編碼滿足我們這種需求?上一篇實際也大致介紹了思想,即差分思想,實際上我們現在應該能大概設計出這種算法了。
人總是習慣于直接的思維,就是直接給出需要的東西,但是對于計算機等其實這不一定是最好的方式。
我們先舉個簡單的例子來引出,類似我們前面進行的抽象,同樣假設要告訴別人電壓是多少,實際就是要告訴別人數字。
比如我手里有一串數字比如是5和10,要告訴別人,我們有不同的方式,首先是絕對值的方式,只要以下步驟
1.我手里有個5
2.我手里有個10
我們也可以是差分的方式,
假設開始以0為初始狀態。
1.我手里有個比上一個數大5的數,即5。
2.我手里有個比上一個數大5的數,即10。
還不夠,上述每次差分都是變化的,即每次都直接告訴對方差值,其實也可以固定一個幅度的差值。但是方向可以變,比如固定幅值為5,可以正和負,每次都只能告訴對方是+5還是-5,即只能告訴別人大了還是小了,大了就減小,小了就增大.
假設要告訴別人我手里有的值是0.
假設開始以0為初始狀態。
1.手里的值是0,大于等于初始狀態0, 告訴對方要+5. ?這次行為記錄為1.
2.此時雙方記錄的偏差的累積值是5(積分器累計偏差),這時我意識到往上偏了,我實際手里是0,而告訴別人是5,多告訴了,所以現在告訴別人要-5. ??這次行為記錄為0.
以上記錄偏差需要積分器,知道多了還是少了要比較器,+5還是-5是反饋器。
3.此時值變為了5-5=0. 然后繼續前面的過程。
所以記錄的行為是告訴別人1010101010,即+5,-5的來回調整,最終平均下來就是+5和-5的次數一樣,也就是平均值0.
實際上面我們就已經設計出來了,現在來畫出其框圖,很簡單,無需再解釋了。
?

可以使用matlab的工具箱Delta sigma toolbox進行仿真。
ADI有一個在線網頁可以形象的仿真每一步。可以對照上面的描述一步步去理解。
https://www.analog.com/en/design-center/interactive-design-tools/sigma-delta-adc-tutorial.html
設置輸入電壓比如0V, 1bit D/A電壓幅度1V。點擊start over回到初始狀態
?

點擊Next Step進入下一步,先計算偏差,輸入為0,默認DA輸出0,如下紅色的偏差0,
?

點擊Next Step偏差積分為0
?

點擊Next Step,比較器輸出為1
?

點擊Next Step,比較器輸出1,控制DA輸出REF+即+1V
?

點擊Next Step,計算新的偏差為-1
?

點擊Next Step,對偏差積分0+-1=-1
?

后面就是重復前面的步驟,
可以看到最后輸出10101010的序列,計算20步之后是
10101010101010101010,即PDM編碼,對應的就是1的密度為50%,即峰峰值的一半,即0V。
?

如果輸入0.5,20步之后,1的個數為15/20即3/4, 即峰峰值的3/4, 即-1往上偏移2*3/4=-1+1.5=0.5.
?

我們再來看上面的框圖,可以看到對偏差進行積分,然后通過負反饋反向調整。這不就是理想運放的模型嗎。
理想運放放大倍數無限大,所以只要有一丁點偏差就會觸發后面比較器向偏差相反方向調整,通過DA要不就往+REF要不就往-REF調整。最終收斂可以偏差很小,也就是輸出和輸入的偏差很小,作為ADC采樣就是采集的很準,這也就是sigma-delta可以做到24位甚至32位高精度的原因,但是他是用長時間的比較收斂來獲得的,也就是長時間的平均來表示其值,所以采樣率就低了,不適合采樣高速信號,這就是這個世界總是充滿矛盾的,沒有這么完美。
一句話總結,哦豁,原來我們設計的PDM編碼就是一個理想運放模型。
再來一句話總結, 哦豁,差分-反饋,大了就減小,小了就增大,三歲小孩都知道的道理,就這么簡單。但是要保證偏差小精度大,就要很靈敏,即很小的偏差就要能檢測到以決定如何調整,即放大倍數要大。
你看高深的技術,原來總是這么樸實無華,我們能發明PDM也就沒什么奇怪的了。
但是,道理很簡單,應用還是需要深入研究其原理的,我們從感性的認識到抽象的模型再到原理的分析,這樣的步驟去理解會更透徹,而不是一上來就陷入莫名其妙的模型,算法,公式當中完全不知所云。后面我們會再從不同角度:時域,頻域等角度去分析其特性,最終應用到實處,比如PDM播放音頻的實踐。