前面《UAC+PDM音頻播放實踐之-使用邏輯分析儀分析PDM信號》https://mp.weixin.qq.com/template/article/1711549811/index.html一文介紹了如何使用邏輯分析儀進(jìn)行PDM分析。前面大概介紹了如何去判斷一個PDM輸出信號是否大致正確,涉及到了一些感性的理解,未涉及具體的原理。這一篇開始我們開始介紹PDM的原理。我們不一上來就擺公式,算法,而是依賴于自己的思考,問題,慢慢去引出相關(guān)概念,思想,原理。
所以本篇前菜篇,都是感性的思考,不涉及嚴(yán)格理論,重點在引出問題,引出思考,引出思想。
學(xué)習(xí)一個新的技術(shù),個人覺得不需要一上來就陷入該技術(shù)的原理。而是先去思考一些問題,一項技術(shù)不會憑空產(chǎn)生,肯定是有其背景,所以自然而然我們會問這些問題:”這個新的技術(shù)為什么會出現(xiàn)?”,”這個新的技術(shù)出現(xiàn)是為了解決什么問題?”,”這個新的技術(shù)是基于什么舊的技術(shù)嗎?”。面對新的內(nèi)容,新的技術(shù)時刻問自己這些問題,然后自己先去思考,搜索資料,你會發(fā)現(xiàn)其實你也可以重新發(fā)明一遍這項技術(shù),那么你才是真正的吸收了該項技術(shù),真正學(xué)習(xí)到了其核心思想,這才是最重要的。一上來就上一堆公式,一堆原理的肯定根本沒有理解其核心。
所以我們就以上述幾個問題來問自己,然后去尋找答案。
我們看到PDM,脈沖密度調(diào)制,就去思考,查詢其近親,或者其先驅(qū)。自然很簡單的大家都熟悉的PWM就映入眼簾了.PWM大家都知道,脈沖寬度調(diào)制,脈沖周期不變,寬度變化,即可等效于其平均電壓不同,很簡單的原理。
如下圖:理想PWM,寬度可以0%~100%無極調(diào)整。
?

如果脈沖寬度可以無極變化,那么就可以實現(xiàn)電壓的無極調(diào)整,當(dāng)然實際這是不現(xiàn)實的。實際PWM是由時鐘驅(qū)動的,時鐘有最小的CLK單位,那么PWM的占空比調(diào)整顆粒度就是PWM的時鐘顆粒度,無法無極調(diào)整。如果一個周期有1024個CLK,從0到1023,那么脈寬可以0到1023,即0%到100%,調(diào)整的分辨率是1/1024,即最多1024個等級。對應(yīng)的就是分辨率是10位(2^10)。
如下圖:實際PWM,寬度不能無極調(diào)整,顆粒度是1CLK。
?

以上我們看到了PWM的顆粒度CLK,我們再換個角度來思考,我們來關(guān)注CLK,以CLK為單位進(jìn)行劃分,那么每個CLK對應(yīng)的電平要么就是0,要么就是1,占空比就是1的個數(shù)的占比。轉(zhuǎn)化為數(shù)字信號就是10序列。比如一個周期有10個CLK,占空比50%,對應(yīng)的數(shù)字信號就是1111100000。實際上我們這里做了具體事務(wù)到抽象的過程,即脈沖寬度到01編碼的抽象過程,具體到抽象,是進(jìn)行一般分析的一般步驟,只有抽象才能找到一般規(guī)律。至此我們是不是可以給我們的這個抽象行為取個名字了,1的個數(shù)的比例代表不同的電壓,比例不就是密度嗎,那么就叫做脈沖密度調(diào)制吧,這不就是PDM嗎,恭喜你就快要發(fā)明新的技術(shù)了,你看發(fā)明一項新的技術(shù)不就是這么簡單樸實無華,只要自己多問幾個為什么就自然而然能想到了。
?

好的我們繼續(xù),我們上一節(jié)發(fā)明的PDM,不就是PWM嗎,我們什么也沒做,就是把PWM變?yōu)榱?/span>10的序列來描述。沒錯這一小步就是創(chuàng)新發(fā)明的一大步,具體到抽象,這就是0到1的突破,后面才是1到99的優(yōu)化。沒錯我們發(fā)明的PDM他就是PWM,這里先劇透一個結(jié)論”PWM就是特殊的PDM,就是頻率不變的PDM”。別急慢慢來,任何一項技術(shù)都是要解決具體的問題的,我們來看看我們原來的PWM有什么問題。
PWM占空比能等效不同電壓如下所示,PWM原始是一部分高,一部分低,這樣不能實際使用,那么需要經(jīng)過儲能元件,電容來實現(xiàn)均衡。高時給電容充電,低時放電,這樣就是后面的這種有脈動的形狀,還不夠理想,理想希望是一條直線,但是至少比原來好了。
?

從以上我們可以看出,充電和放電時間越長脈動越大,對于需要的比較均勻地輸出不友好。此時我們可以調(diào)整電容的值來進(jìn)行調(diào)整,輸入源頭PWM的周期大,即高和低都持續(xù)比較長時間時,可以電容大一點儲能能力強一點,能長時間保持均衡,實際對應(yīng)的就是對于低頻信號,RC的低通濾波,截止頻率為1/(2*PI*R*C),C增大就是截止頻率降低,我們這里從更能直接感性理解的儲能角度來說明。相應(yīng)的PWM周期小,頻率大,則電容可以小一點,這樣可以快速充放電,快速響應(yīng)變化,如果此時還用大電容,則來不及響應(yīng)原始信號就變了,跟不上原始信號的變化,也就是截止頻率為1/(2*PI*R*C),C減小就是截止頻率增加,從頻率角度看就是對于原始高頻信號,截止頻率也要高,避免濾掉了有效的高一些的頻率成分。
以上我們知道我們的目的是要輸出均勻的電壓,即固定輸入占空比,輸出是一條直線。但是這是不可能的,電容儲能也有充放電過程輸出就有脈動。那么怎么減小脈動呢,那就從源頭來看,原因是源頭的高和低的持續(xù)時間,持續(xù)時間越大,越不利于均勻輸出。那么怎么辦,自然而然的就是減小這種持續(xù)時間,也就是將高和低均勻的分開。得益于我們之前的抽象PWM即對應(yīng)10的序列,我們依然以50%的PWM為實例,原來是1111100000,我們重新排列為1010101010,這樣不就是更均勻了嗎。
?

我們再仔細(xì)一看,哎不對呀,這不就是把頻率變?yōu)樵瓉淼?/span>5倍了嗎,不還是PWM嗎?確實是,解決PWM波動的問題的一個思路就是增加PWM的頻率,這里看起來就是變?yōu)榱嗽瓉淼?/span>5倍的頻率,但是思想的本質(zhì)是不一樣的。不要小看我們這里111110000到1010101010的思想背后的魅力,這時0到1的一大步創(chuàng)新。
我們再來看依然是周期是10個CLK,占空比是3/10的情況呢,這時可以盡量讓1均勻分布,就變?yōu)榱?/span>1001001000,或者0100100100,可以看到他不是固定頻率的PWM了,而是頻率會變了,但是我們依然還是以1的個數(shù)占的比例來等效電壓。所以現(xiàn)在問題變?yōu)榱私o定一個占空比即一個1的比例,如何去分配這些1,我們將原來的問題抽象為了一個數(shù)學(xué)問題,而這個即PDM編碼算法,我們后面再講。這一篇都是從簡單的感性思考層面去考慮。
我們繼續(xù)來優(yōu)化我們發(fā)明的PDM。
我們前面看到PWM是以一個PWM周期為單位進(jìn)行等效的,哪怕你CLK單位很小,但是前后兩個PWM的等效還是間隔為一個PWM周期,這樣造成了不均勻。解決不均勻的一個方式就是細(xì)分我們前面已經(jīng)應(yīng)用了。既然我們已經(jīng)建立了CLK為單位的10序列的數(shù)據(jù)流,那么我們理應(yīng)想到以CLK為單位進(jìn)行處理分析了,于是我們可以應(yīng)用常用的窗口滑動平均的思路來分析了,即對數(shù)據(jù)流定一個窗口,每次流入1位然后流出1位,對這個窗口內(nèi)的數(shù)據(jù)求1的占比不就等效于其等效電壓嗎,此時我們將電壓平均的顆粒度降低到了CLK為單位,恭喜你又發(fā)明了PDM的過采樣的思想?。?!。
如下所示,原來10個bit等效一個電壓,間隔10bit,現(xiàn)在還是10個比特等效一個電壓,但是間隔一個bit,后面的更精細(xì),這就是所謂的過采樣,即1個CLK就有一個等效電壓。
?

好的上面實際上我們已經(jīng)知道如何根據(jù)一個PDM的數(shù)據(jù)流,大概去分析其對應(yīng)的電壓了,即框定一個窗口,數(shù)該窗口內(nèi)的1比例,一次推進(jìn)1位。

比如如下示例
0101011011110111111111111111111111011111101101101010100100100000010000000000000000000001000010010101
?
由于要表示正負(fù)數(shù),我們可以設(shè)置一個偏置,即占空比50%處即中間電壓處為0,此時1和0的密度相同即類似于101010序列,而負(fù)數(shù)我們對應(yīng)于0~50%的電壓,即0的比例高,比如負(fù)的最大值對應(yīng)于0000序列,正數(shù)對應(yīng)于50%~100%電壓,即1的比例高,比如正的最大值對應(yīng)于111序列。
我們手動對上序列人工解析,假如我們選擇窗口范圍是10(這里只是假設(shè),實際是根據(jù)過采樣大小,輸入采樣率確定的),那么前面我們計算的1的比例就如下,可以看到是正弦波的上升的部分??梢钥吹诫妷壕戎挥?/span>1/10,如果我們選擇窗口范圍更大則分辨率更高。我們看到輸出的數(shù)據(jù)變?yōu)榱嗣總€CLK都有一個,這就是過采樣了,實際我們可以抽取進(jìn)行降采樣,比如每隔3個選一個
010101101111011111111111111111111101??6/10 ?抽取
010101101111011111111111111111111101??7/10
010101101111011111111111111111111101??7/10 ??
010101101111011111111111111111111101??7/10 ??抽取
010101101111011111111111111111111101??7/10
010101101111011111111111111111111101??8/10
010101101111011111111111111111111101??8/10 抽取
010101101111011111111111111111111101??8/10
010101101111011111111111111111111101??9/10 ?抽取
010101101111011111111111111111111101??9/10
所以要提高電壓分辨率可以提高窗口的范圍,即在更長時間范圍內(nèi)找1的比例,在1000個里面找分辨率就是1/1000,但是隨之而來就是需要更多的時間去反應(yīng)一個值,這樣變化率就低了,無法跟蹤快速變化的值,這就是PDM的缺點,矛盾永遠(yuǎn)是存在的。實際上我們利用了時間換精度,對于慢速變化的信號,我們可以在長時間內(nèi)對其進(jìn)行考察,以達(dá)到更高的精度和分辨率。
以上我們實際知道了數(shù)據(jù)流如何對應(yīng)其電壓值,那么我們現(xiàn)在的問題是已知電壓如何編碼數(shù)據(jù)流呢。 這里先劇透下實際就是1bitSigma-Delta ADC的原理了,也可以簡單劇透下其思想,即使用差分思想,既然用1的密度來表示電壓,那么我們就看當(dāng)前值和目標(biāo)值的差異,當(dāng)前值小于目標(biāo)值就增加一個1,提高電壓,否則就減小一個1減小電壓,最終會達(dá)到收斂,或者來回震蕩,但是其平均值是收斂的。
比如用1代表正參考電壓V+,0代表V-的參考電壓,目標(biāo)值是0即50%的電壓。
如果當(dāng)前編碼是1即V+大于目標(biāo)電壓0,所以下一次輸出0即V-的電壓,對前面兩次電壓輸出的積分0就是等效輸出,即10代表(V+)+(V-)=0. 積分輸出的電壓再和輸入信號比較,繼續(xù)以上過程。利用運放負(fù)反饋的原理,只要反饋值和輸入值有偏差就反向調(diào)整輸出,最終保證輸出和輸入是一樣的,即跟蹤到了輸入值。
這樣輸出10101010序列就代表等效電壓0,即50%的電壓。
從一項技術(shù)背后總結(jié)其核心才是最有意義的,才能舉一反三為己所用,才真正的是學(xué)懂了才能得心應(yīng)手的應(yīng)用,并為自己打開思路。所以PDM實際給我們帶來了一些有價值的思想,我們可以總結(jié)一下。
1.抽象,把具體問題抽象成模型,數(shù)學(xué)問題,來考慮,這是普通人和牛逼的人思考問題的最大的差別,也是有創(chuàng)新創(chuàng)造和無創(chuàng)新創(chuàng)造的人的最大區(qū)別。
2.細(xì)分,即微分思想。
3.差分, 即變化的思想,有時不需要知道絕對,知道變化即可,打了就減小,小了就增大思想就是這么簡單。
4.均攤,窗口滑動的思想。
5.矛盾,時間換精度,從矛盾對立的角度尋找解決方案,一個方向走不通時考慮下其對立面,往往兩個方向是相互的此消彼長。類似的有空間換效率等。
足夠多的bit數(shù)取平均可以得到更精細(xì)的分辨率,但是更多的bit需要更長的時間,所以只能減少每個bit的時間,即增加頻率。正因為該原因所以才使得其對于高頻響應(yīng)比較困難,高頻采樣和精度就是一對矛盾。