聲音檢測∕聲音放大器(二):計算聲波峰對峰值(振幅大小)的程式

上一篇「模組介紹與自製LM386麥克風聲音放大器」文章使用的程式,對全週聲波沒有太大的用處;應用程式需要的通常是音量大小,也就是波形的振幅大小(或者說峰對峰值)。

振幅、峰對峰值

以右上圖的訊號為例,振幅代表一段時間內的聲波最大(波峰)和最小值(波谷)的差。本實驗採用LM386聲音放大器電路,你可以使用現成的模組,或者依照上一篇文章自行DIY一個。顯示聲波和振幅大小的程式如下:

loop()函式當中的while迴圈,用於在設定的時間間隔(10ms)內,不停地讀取類比A0(聲音)值,並且比較出最低和最高峰值。以讀取下圖左、灰底的訊號為例,一開始sigMin變數刻意被設定成很高的值(2000),因此第1個類比輸入值將成為「最低峰值」;sigMax變數也刻意被設定成0,所以第2個類比輸入值將成為「最高峰值」:

求取峰值

當while迴圈執行完畢後,sigMin和sigMax將分別紀錄了這個取樣間隔的最低和最高峰值。

在序列繪圖家顯示多筆資料的波形

把程式上傳到Arduino Uno之後,選擇IDE裡的「工具→序列繪圖家」指令,將能看到原始的聲頻訊號以及振幅(峰對峰)值:

序列繪圖家繪製的訊號圖

在「序列繪圖家」顯示多個波形圖的方法,是把所有數據都輸出在同一行,中間用逗號分隔。底下兩段敘述將可分別繪製A, B和X, Y, X三個變數值:

把所有數據都輸出在同一行,中間用逗號分隔。

LM386麥克風聲音放大電路說明

LM386技術文件有提供幾個聲頻放大器的示範電路,底下是最基本的增益20倍電路如果不需要調整麥克風輸入音量,就不用接10K可變電阻。

增益20倍的電路

輸出端連接250µF電容,可消除混入輸出訊號的直流。這個電容不必是250µF,常見的數值介於100µF~250µF。

消除輸出訊號的直流

輸出端0.05µF和10Ω串連構成的佐貝爾網路濾波器(Zobel Network Filter),用於控制放大器的輸出阻抗並穩定輸出訊號。

第7腳建議接一個1µF~10µF電容,降低放大電路在開關機時,忽然「爆衝」的湧浪電流干擾。

在1和8腳並接一個10µF電容,就變成增益200倍的聲頻放大器。

增益200倍的電路

LM386的電壓增益倍率公式

LM386的電壓增益倍率,可由第1和8腳之間連接的電阻值調整。底下是LM386技術文件第1頁所示的晶片內部等效電路:

LM386晶片內部等效電路

聲頻放大倍率由電路中的三個電阻值決定,根據LM386 Audio Amplifier Analysis(LM386聲音放大器分析)文章推導的公式,當1和8腳不外接任何元件時,放大增益為20:

增益公式

在1和8腳連接一個電容,對交流(聲頻)訊號相當於短路(對直流則是斷路),所以增益值為200:

增益公式

在1和8腳之間串連一個電阻和電容,就可以調整放大增益:

增益N倍的電路

以串接1.2KΩ電阻為例,它將和R1電阻並聯,根據增益計算公式求出的值大約是38.2。

增益公式

欸…根據LM386技術文件第11頁所述,連接1.2KΩ電阻的增益是50…莫非原廠技術文件有誤?

15 thoughts on “聲音檢測∕聲音放大器(二):計算聲波峰對峰值(振幅大小)的程式

  1. 我在進行17張的觸控式電容鍵盤時,無法正常執行,arduino 顯示:”找到無效的程式庫”

    1. 書本光碟裡面有個「程式庫」資料夾,請將裡面的資料夾都複製到「文件→Arduino→libraries」路徑。另請參閱9-16頁的程式庫安裝說明,以及18-4頁的Keypad程式庫說明。還有,請確認控制板有選擇正確。

      thanks,
      jeffrey

    1. 我是用Adobe Flash(现已改名Animate) 软件,搭配鼠标(偶尔用第一代微软Surface Pro平板的Wacom笔)徒手绘制的。

      thanks,
      jeffrey

  2. LCD1602 可以調整可變電阻嗎,還有接線方式是與arduino直接相接嗎,因為我看不清楚螢幕

    1. 請問:我的型號是LCD1602,他是一種可以直接相接在Arduino上的擴充模組本,並沒有需要接線

    2. 我知道1602,書本第9章和第18章的範例有使用這個LCD。如果你的LCD是原始的並列介面型式,就需要自行外接可變電阻來調整對比(參閱9-5頁電路)。

      thanks,
      jeffrey

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *