關于使用MSGEQ7音頻頻譜分析儀芯片的所有您想知道(但又害怕問到)的信息。
多年來,我已經在幾欄中討論過使用MSGEQ7頻譜分析儀芯片的問題,但是我仍然收到問題,因此我認為將所有相關信息集中到一個位置可能是個好主意。
音頻響應項目
首先,讓我們進行場景設置。假設我們想創建一些對聲音有反應的東西,例如我當前的Audio-Reactive Box項目。您可能還記得,這涉及到一個裝有假真空管的小假古董手提箱。這些燈管將使用三色LED聚寶盆從下面照亮。下圖反映了剛安裝完電子管后盒子的狀態-下一步是在電子設備上工作(我將在以后的專欄中進行討論)。
如果我們希望我們的項目(在這種情況下為盒子)對外部聲音做出反應,那么我們將需要一個麥克風。此類項目的一個很好的解決方案是MEMS駐極體麥克風(一種基于靜電電容的麥克風),并在分線板(BOB)上配有一個小型放大器。
選項1:將音頻輸入到MCU中(不進行FFT)
一種選擇是將麥克風BOB的輸出直接輸入到微控制器(MCU)上的模擬輸入。對于我的大多數項目,我喜歡使用廉價而快樂的Arduino Nano,Uno或Mega MCU開發板。盡管這些在性能上都受到一些限制(8位數據總線,16MHz時鐘,各種內存以及不同數量的輸入/輸出引腳),但我真的很喜歡這些小技巧。
將音頻信號直接饋送到MCU(來源:Max Maxfield)
觀察到我已經顯示了七個從MCU發出的LED(或LED串)。實際上,由于我們將要使用基于WS2812的NeoPixels,它們可以菊花鏈連接在一起并且可以單獨控制,因此我們可以用單個引腳驅動所有LED,但是顯示7串字符串將使事情變得更加清晰。
理想情況下,對于此設置,麥克風BOB的輸出應具有2.5V的DC偏置和5V的pp(峰峰值)擺幅,這與Arduino Nano / Uno / Mega的電源匹配(一個選項這是來自Adafruit的具有可調增益的MAX4466)。Arduino使用10位模數轉換器(ADC)。這意味著當我們對音頻信號執行AnalogRead()函數時,Arduino會將0至5V之間的輸入電壓映射為0至1023之間的整數值。
現在,您可能在想,由于我們的LED要求控制值的范圍是0到255,所以這意味著我們需要將ADC的0到1023的值映射到LED的0到255的等效值,但是還不止這些這很復雜。假設我們從5Vpp正弦波開始,如下圖(a)所示:
處理正弦波(來源:Max Maxfield)
在這種情況下,如果我們在一定數量的讀數上對樣本取平均值,則最終的平均值為511。問題是,如果我們要對4Vpp信號中的多個樣本取平均值,我們將獲得相同的511值。一個3Vpp信號,或者…您明白了。
因此,我們需要做的第一件事就是校正信號,如上面的(b)所示。我們可以使用一個簡單的公式來做到這一點,如下所示:如果數字樣本的值等于或大于512,我們將其保持原樣。如果它的值為511或更低,則將其從1,023中減去。接下來,我們需要消除直流偏置,這是通過從每個值中減去511來實現的,如上面的(c)所示。
最后,我們需要將0到511的值映射到LED所需的0到255的值,如上面的(d)所示。我們可以使用Arduino的map()函數來實現這一點。另外,我們可以簡單地將0到511的值除以2,或者將它們向右移一位,這兩者將具有相同的效果。(如果BOB的輸出具有不同的DC偏置和/或較小的pp擺幅-例如1.25V的DC偏置和2Vpp擺幅,則可以在軟件中適當地重新縮放/預處理信號。)
使用上述基本設置,每次采樣時,我們可以從音頻信號中收集到的唯一信息就是其當前幅度。關于驅動我們的LED,我們可以利用這些信息做幾件事。例如,我們可以用相同的顏色驅動所有LED,同時根據音頻信號的幅度改變它們的強度。或者,我們可以將所有LED完全驅動,同時根據音頻信號的幅度改變它們的顏色。而且,當然,我們可以結合使用這些技術。
記住我們正在設想七串(組)LED,另一種可能性是將音頻信號分成七個“振幅帶”。每次采樣信號時,我們都會決定要點亮哪些LED。如果信號落入最低振幅帶,我們可以簡單地點亮第一串LED。如果信號落入下一個振幅帶,我們可以僅驅動第二串LED,或者我們可以決定同時驅動第一串和第二串LED。依此類推,直到信號落入最高振幅帶,此時我們只能驅動第七串LED,或者我們可以決定驅動所有的LED。而且,當然,我們還可以嘗試各種琴弦的振幅和顏色。
選項2:使用FFT軟件將音頻輸入到MCU中
如果我們決定將音頻信號分成單獨的頻段,事情將變得越來越有趣。例如,在這種情況下,我們可以使用底鼓的節拍來控制一組LED,而另一組可以響應較高的頻率,例如一分錢的汽笛聲。
盡管隨著年齡的增長,我們聽到較高頻率的能力會下降,但是人類的正常聽力范圍會覆蓋20到20,000Hz之間的頻率。假設我們將0到20,000Hz的范圍分成以63Hz,160Hz,400Hz,1,000Hz,2,500Hz,6,250Hz和16,000Hz為中心的七個重疊頻段,如下所示:
將音頻信號劃分為七個頻段(來源:Max Maxfield)
在這種情況下,我們可以使用七個頻帶的幅度來控制七組LED的強度和/或顏色,但是如何從麥克風BOB的音頻信號中提取該頻帶信息呢?
不錯,一種選擇是使用在MCU上運行的軟件算法來實現FFT(快速傅立葉變換)功能。此功能可用于將我們的信號從其原始時域形式轉換為頻域中的相應表示形式。
將音頻信號直接饋送到運行SW FFT的MCU(來源:Max Maxfield)
軟件(SW)FFT可能需要計算,但是如果您真的想走這條路,可以使用許多Arduino FFT庫(有關更多信息,請參見Adafruit的Piccolo Music Visualizer項目)。
說實話,如果我想使用軟件FFT的,我可能會使用一個32位Teensy 3.2(72MHz的的Cortex-M4型)或Teensy 3.6(基于的Cortex-M4F-180MHz的)單片機開發板從PJRC,以及出色的音頻FFT庫。但是,我個人更喜歡使用硬件(HW)FFT替代方案,如下所述。
選項#3:通過MSGEQ7音頻頻譜分析儀提供音頻
讓我們從建議的系統的高級視圖開始。在這種情況下,來自麥克風BOB的輸出被饋入一個名為MSGEQ7的漂亮的8針小芯片,該芯片由一家名為Mixed Signal Integration的公司創建。該音頻頻譜分析儀芯片可與3.3V和5V MCU配合使用,將音頻信號劃分為前面討論的七個頻段,并以一種易于我們的MCU輕松訪問的形式顯示與這些頻段相關的幅度數據。稍后)。
通過MSGEQ7硬件FFT饋送音頻信號(來源:Max Maxfield)
這種方法的最好之處在于,它可以消除您(和您的MCU)的所有辛苦工作。您要做的就是從MSGEQ7訪問頻帶幅度數據,然后決定如何使用它來驅動LED。
非常重要:該MSGEQ7數據表是不是很有益,因為人們可能希望,但它意味著該裝置預計有0.3Vpp(即300mVpp)擺動的音頻輸入。這意味著您必須相應地選擇麥克風。我將在以后的專欄中討論不同的麥克風替代品。就目前而言,我只是注意到我的好友史蒂夫·曼利(Steve Manley)已成功將MSGEQ7與來自SparkFun的男生和女歌手的INMP401 MEMS麥克風BOB配合使用(該視頻的鏈接在本專欄的稍后部分將展示史蒂夫的解決方案)。據說該BOB“在話筒保持臂長并以正常的對話音量進行通話時,具有約200mV的峰峰值輸出。”
介紹MSGEQ7
因此,我們來介紹一下MSGEQ7本身。通孔(LTH)和表面貼裝技術(SMT)封裝都提供這種小流氓。LTH版本可從SparkFun獲得,價格僅為4.95美元(也提供MSGEQ7 BOB;我們將在短期內返回這些內容)
8針MSGEQ7頻譜分析儀芯片和引腳排列(來源:Max Maxfield)
觀察到只有一個DATA_OUT信號,那么我們如何使用它來訪問與七個頻段關聯的數據?為了回答這個問題,我們需要考慮一下MSGEQ7內部的框圖,如下所示:
MSGEQ7框圖(來源:Max Maxfield)
這種工作方式是,我們使用來自MCU的兩個數字輸出來驅動RESET和STROBE信號,并且使用MCU上的模擬輸入來從DATA_OUT信號中讀取值。首先,我們在RESET信號上使用一個正向脈沖來告知MSGEQ7,我們正在準備訪問其數據,然后在STROBE信號上使用一系列的七個負向脈沖來讀取與這七個頻率相關的數據樂隊。此數據表示為0V至5V之間的模擬電壓(對于3.3V供電的MCU /系統,則為0V至3.3V),如果是Arduino及其10位ADC,則將轉換為0到1023之間的整數值。
MSGEQ7時序圖(來源:Max Maxfield)
當然,我們會反復進行此操作,從MSGEQ7讀取數據,然后使用此數據來決定我們希望如何驅動LED。下面是一個示例Arduino函數,用于訪問此數據并將其存儲在7個元素的整數數組中,這些整數稱為bands []:
觀察到我并沒有費心在兩個對RESET信號進行脈沖的digitalWrite()語句之間添加延遲,因為它被指定為最小值為100ns(0.1us),該最小值很小,以至于它被固有的延遲所淹沒。函數調用自己。
MSGEQ7電路圖和分支電路板
如果計劃使用單個MSGEQ7處理單個(單聲道)音頻流,則要使用的電路圖如下所示:
具有單聲道輸入的單個MSGEQ7(來源:Max Maxfield)
觀察到C2顯示為0.1uF(該電容器可消除輸入音頻信號中的任何DC偏置)。官方MSGEQ7數據手冊中的等效電容器顯示為0.01uF,但這是不正確的。
如果您希望使用單個MSGEQ7來處理雙(立體聲)音頻流,則可以通過添加一個額外的22KΩ電阻來修改上圖的輸入,如下所示:
支持立體聲輸入的單個MSGEQ7(來源:Max Maxfield)
與自己進行接線相反,您可以從eBay購買MSGEQ7 BOB。售價$ 15.95加上運費,這雖然有點貴,但這確實意味著您可以實地工作。需要注意的一點是,默認情況下,它將附帶5針接頭連接器和立體聲插孔。如果您愿意,賣方將保留這些附件,但您下訂單時必須要求。
正如您在本視頻中看到的那樣,在Cunning Chronograph中實現音樂模式時,我使用了一個帶有雙輸入的MSGEQ7。
在這種情況下,與使用麥克風不同,我直接從iPod的耳塞/耳機插孔中喂入了MSGEQ7。相比之下,正如您在本視頻中看到的那樣,我的好友史蒂夫·曼利(Steve Manley)使用我們之前簡要提到的SparkFun的INMP401 MEMS麥克風BOB在他的狡猾計時碼表中駕駛了MSGEQ7。
當然,對于某些事情(例如我的BADASS顯示器),您想要實現真正的立體聲功能。在這種情況下,您可以使用兩個MSGEQ7芯片來處理左右聲道的音頻流(您可以使用MCU的單個輸出來驅動兩個MSGEQ7上的RESET引腳;類似地,您可以使用單個輸出來驅動STROBE引腳)。
通過觀看BADASS顯示器早期原型的視頻,您可以更好地了解所有這些工作原理。
編輯:hfy
-
led
+關注
關注
241文章
23136瀏覽量
658466 -
mcu
+關注
關注
146文章
16992瀏覽量
350311
發布評論請先 登錄
相關推薦
評論