隨著我們的音頻反應項目越來越復雜,我們可能決定用一個提供自動增益控制的簡單的 MEMS 麥克風和放大器來代替。
這是我之前與 MSGEQ7 相關的專欄的后續文章:“使用 MSGEQ7 頻譜分析儀的提示和技巧”和“使用 MSGEQ7 音頻頻譜分析儀時處理噪音”。
您可能還記得,MSGEQ7 是一款便宜且令人愉悅的八針設備,它接受音頻信號并將其分成與以 63 Hz、160 Hz、400 Hz、1,000 Hz、2,500 Hz 為中心的七個頻段相關的幅度、6,250 赫茲和 16,000 赫茲。然后我們可以使用這個頻率信息來做一些事情,比如控制閃光燈。
事實上,我最近的Awesome Audio-Reactive Artifact項目包含一個 Arduino 微控制器、一個 MSGEQ7 和一個 MEMS 麥克風和放大器分線板 (BOB)。
我現在正在努力解決的問題是確定用于任何未來音頻反應項目的最佳麥克風 BOB。
遺憾的是,MSGEQ7 數據表并沒有人們希望的那么有用,但這意味著該設備需要一個具有 0.3-Vpp(即 300-mV 峰峰值)擺幅的音頻輸入。這意味著您必須相應地選擇您的麥克風。
INMP401 MEMS 麥克風 BOB
在我的 Awesome Audio-Reactive Artifact 的情況下,我目前正在使用基于 ADMP401 的INMP401 MEMS 麥克風 BOB,售價 10.95 美元,來自 SparkFun 的男士和女士。該 BOB 被描述為當麥克風保持一臂距離并以正常的會話音量水平被交談時,其峰峰值輸出約為 200 mV。當播放響亮的音樂時,我實際上并沒有測量輸出(當我有空的時候我真的需要這樣做),但一切似乎都很好地結合在一起。
INMP401 MEMS 麥克風 BOB:麥克風是右側圖像中的小黑點。(來源:SparkFun)
此 BOB 的主要優勢之一是底部端口輸入。這意味著麥克風的 1 毫米直徑輸入可以與項目的外殼齊平。BOB 的輸出具有 VCC/2 的 DC 偏置,這意味著當沒有聲音被拾取時,信號將浮動在 2.5 V。
MSGEQ7 數據表建議使用由 22kΩ 電阻器和 0.1μF 電容器與音頻輸入串聯形成的濾波器。已選擇這些值來傳遞音頻信號,同時消除直流偏置。
請注意,使用 R2 和 C2 注釋(與 R1 和 C1 相對)的原因是為了使此原理圖與我之前的專欄中的電路匹配。將這款麥克風 BOB 與 MSGEQ7 一起使用非常簡單。您所要做的就是連接電源 (VCC) 和接地 (GND) 線(在我的情況下為 5 V 和 0 V)并將音頻 (AUD) 輸出連接到 22-kΩ 電阻器(示例 Arduino 代碼在我的上述文章)。
我不得不說我對 INMP401 MEMS 麥克風 BOB 非常滿意,我會向任何人推薦它。在我的 Awesome Audio-Reactive Artifact 的情況下,當音樂以合理的音量播放時,這個 BOB 工作得非常好,但是 - 理想情況下,如果有選擇的話,如果推來推去 - 我想要更多的動態范圍。
假設我坐在離工件有一段距離的一個非常安靜的房間里。如果我發出像點擊手指或說“你好”這樣的低級聲音,我希望這個神器能以明亮的顯示閃爍起來,但我很幸運看到的不僅僅是閃爍。如果事情已經安靜了一段時間,我想我可以通過執行某種滾動平均并增強任何低電平信號來在軟件中糾正這個問題,但我現在感覺有點懶惰。
或者,假設音樂變得非常響亮。在這種情況下,我當前的系統趨于飽和,導致所有 LED 長時間完全打開。我仍然可以聽到音樂中的基本節奏以及頻譜各個部分的活動,因此我希望我的音頻反應神器以某種方式調整其靈敏度以反映當前的音量。
駐極體麥克風放大器 — 具有自動增益控制功能的 MAX9814
因此,我們來到了基于 Maxim MAX9814 的具有自動增益控制功能的駐極體麥克風放大器BOB,Adafruit 的男士和女士僅售 7.95 美元。
根據它的數據表,這個小美女可以在 2.7 V 到 5.5 V 的電源電壓下工作。除了電源 (VDD) 和接地 (GND) 端子(在我的情況下為 5 V 和 0 V)外,我們還有一個音頻輸出 (OUT)、增益控制輸入 (GAIN) 和啟動/釋放比控制輸入 (AR)。
對于 AR 引腳,不連接意味著我們使用默認的攻擊/釋放比率 1:4,000。將此引腳拉至 VDD 或 GND 允許我們將啟動/釋放比率分別更改為 1:2,000 或 1:500。但是,因為我實際上不知道攻擊/釋放比率是什么或它的作用(我是一名數字硬件設計工程師),我認為我們將其保留為默認/未連接設置。
稍后我們將返回考慮 GAIN 輸入,但首先,我們需要考慮“房間里的大象”,即這個 BOB 輸出 2-Vpp(即 2,000-mVpp)信號和 1.25 -VDC 偏置。這將完全淹沒 MSGEQ7,因此我們需要以某種方式將此 2,000-mVpp 信號轉換為 MSGEQ7 所需的相應 300-mVpp 信號。
再一次,我是一個數字人,這意味著模擬領域搖擺不定的方面往往會讓我頭疼,所以我打電話給 EEWeb 模擬專家Peter “Traneus Rex” Anderson尋求建議,他指導我如下.
Peter 首先指出,通常有無數種模擬方式可以做事,但最簡單的一種是使用分壓器。
在這種情況下,我們純粹根據分壓器使用信號名稱 Vin 和 Vout。解決這個問題的一種方法是用無單位的術語和/或比率來思考事物。我們知道,如果我們的 BOB 輸出其最大值 Vin = 2,000 mVpp,那么我們希望電容器看到的 Vout 信號(并通過電容器到 MSGEQ7)為 300 mVpp。即使是我糟糕的數學也告訴我 2,000/300 = 6.66。這意味著如果我們說 R2b = 1R(無論“R”是什么),那么我們知道 R2a 必須等于 6.66R - 1R = 5.66R。
另一種方法是注意我們的分壓器的等式是 Vout = Vin * (R2b / (R2a + R2b))。如果我們將 R2b = 1R 和 R2a = 5.66R 的值代入,我們得到 Vout = Vin * (1R / (5.66R + 1R)) = Vin * (1R / 6.66R) = Vin/6.66。當然,如果 Vout = Vin/6.66,則 Vin/Vout = 6.66,這使我們回到了開始的地方。
請注意,我們只是在考慮看待同一事物的不同方式,因為有些人發現一種方式比另一種更有意義。
下一部分是有趣的地方,因為我們希望電容器“看到” 22 kΩ 的值。問題在于——由于彼得討論它們時似乎有道理但我發現在這里難以表達的原因——電容器實際上“看到” R2a 和 R2b 是并聯的。反過來,這意味著電容器看到的電阻將為 (R2a * R2b) / (R2a + R2b)。
Peter 還指出 (a) 兩個并聯電阻的總值低于每個單獨的電阻,并且 (b) R2a 的值明顯大于 R2b 的值。基于此,他建議我們首先考慮如果我們首先將 R2b 的值設置為比我們正在尋找的 22-kΩ 值(例如 25kΩ)大一點會發生什么,然后從那里開始。
使用標準 1% (E96) 電阻器作為基礎,我最終使用各種電阻器值運行計算。最終,我最終將 R2b 設置為 26.1 kΩ。反過來,這意味著我們理想情況下希望 R2a 為 5.66 * 26.1 kΩ = 147.72 kΩ,但最接近此值的實際值為 147 kΩ。如果我們將這些值代入我們的“兩個并聯電阻”方程,那么電容器將看到 (26.1 * 147) / (26.1 + 147) = 22.16 kΩ 的電阻,這“對于政府工作來說足夠接近”,因為它們說。
因此,假設我們使用 Arduino Uno 微控制器開發板作為我們的主處理器。
現在,請記住 MAX9814 具有自動增益控制 (AGC)。這是指閉環反饋系統,其目的是在其輸出端保持合適的信號幅度,盡管輸入端的信號幅度發生變化。平均或峰值輸出信號電平用于動態調整放大器的增益,從而使電路能夠在更大范圍的輸入信號電平下令人滿意地工作。
這意味著上述電路可以很好地完成我們的音頻反應項目所需的一切(一旦我開始嘗試它,我將在以后的專欄中報告)。然而,除了其內部 AGC 功能外,BOB 還具有 GAIN 輸入。如果我們不連接此引腳,則默認增益將為 60 dB (1,000);如果我們將此引腳連接到 GND (0 V),增益將為 50 dB (~316);如果我們使用 Arduino 將此引腳拉至 VDD (5 V),增益將為 40 dB (100)。
如果我們希望永久使用 50-dB 或 40-dB 設置,我們可以將 GAIN 輸入分別硬接線至 0 V 或 5 V。或者,我們可以將 GAIN 輸入連接到 Arduino 的數字輸入/輸出 (I/O) 引腳之一。在這種情況下,如果我們告訴 Arduino 將此引腳用作輸入,則 BOB 上的 GAIN 輸入將看到高阻抗 Z 狀態,因此默認為 60-dB 增益值。或者,如果我們告訴 Arduino 將此引腳用作輸出,我們可以將其驅動為低電平或高電平,以使 BOB 分別使用其 50-dB 或 40-dB 增益設置。
因此,除了 BOB 的內部 AGC 之外,我們現在還能夠應用更高級別的增益控制。我們可以從 50-dB 增益設置開始,我們可以使用 Arduino 來監控來自 BOB 的音頻信號。如果我們意識到這個信號在很長一段時間內一直處于全強度狀態(其中“持續”的含義尚未定義),那么我們可以將增益降低到 40 dB。或者,如果我們意識到信號在一段時間內一直很低(其中“真的”和“一些”的含義尚未定義),那么我們可以將增益提高到 60 dB。此外,我們可以根據需要繼續在 40 dB、50 dB 和 60 dB 之間切換主增益。
這里唯一棘手的是標有“?電路?”的塊。請記住,BOB 的輸出可以是 0 mVpp 到 2,000 mVpp 之間的任何值,均以 1.25-VDC 偏壓為中心。我想我們可以將此信號直接輸入到 Arduino 的模擬輸入之一,并在 Arduino 內部進行所有處理,但我更喜歡讓我的生活保持簡單。
什么是理想的?電路?取 BOB 的 0-mVpp 到 2,000-mVpp 信號,進行滾動平均,輸出 0V 到 2V(或 0V 到 5V)之間的直流電壓來反映滾動值。也許這就像緩沖音頻信號一樣簡單(以免影響電路的其余部分),對其進行整流,并將其饋入電阻電容電路以平滑所有內容并生成平均值。
最后一個想法是,我已經考慮用數字控制的等效電阻替換電阻 R2a 和 R2b,其值可以由 Arduino 通過其 I2C 總線設置,但也許我們應該再討論一天。
同時,當談到“電路”時,我擔心這就是搖擺不定的模擬考慮再次發揮作用的地方。我必須承認我在這里有點超出我的深度,所以我將把它交給 EEWeb 專家和其他任何想插話的人。
審核編輯 黃昊宇
評論