標籤:

基於arduino的環境雜訊測試儀需要哪些東西?

元件的組裝以及寫入單片機的程序


關於分貝計,我很有興趣分享我們的經歷,因為我們曾經用STM32做過一個分貝計。

這個問題可能比較偏門,所以總共也才3個回復。不知道有沒有看。

首先來說說聲音的大小的單位db,db這個單位其實可以叫沒有單位,因為他其實表示的是一種比例關係,給出計算公式:

SPL=20 x log10[ p(e) / p(ref) ]

SPL及我們所說的分貝,p(e)為待測聲壓,p(ref)為參考聲壓。也就是說其實我們所說的XXdb都是說的這個聲音相對於我們規定的一個聲音的大小的比值,並取以10為底的對數再乘以20。之所以採用取對數是因為這個比值可能會非常大。例如正常的人耳能夠聽到最微弱的聲音叫作「聽覺閾」,為20微帕斯卡 (μPa) 的壓強變化,即20 x 10-6 Pa (百萬分之二十 帕斯卡)。而一架太空穿梭機在發出最大馬力時能在近距離產生大約 2,000 Pa 或2 x 109μPa的噪音這麼大的數值處理起來非常不方便。弱採用db的形式,他們差距將只有160db.

所以首先要理解db這種單位帶來了形式上的簡單,也在直覺上讓我們覺得一個噪音計從30db測到90db好像很簡單,其實仔細算算便能得出,這個2個聲音的聲壓大小相差了1000倍,所以其實做好一個噪音計並不是很簡單的。

再來說說實際上的聲音大小我們是怎麼計算的。

我們知道人耳對於不同頻率的聲音的感受是不一致的,類似於一個帶通濾波器,首先只對20-20000HZ之間的頻率有反應,造成同樣的聲壓,頻率不同,對人聽覺的影響也不同。下圖即為人耳對於不同頻率的反應程度。注意,單位同樣是db。

圖1

此曲線叫做A率曲線,用他測出的分貝值較多dBA,這也是聲音用的最多也是最接近人耳的加權方式。

所以綜上,要測定一個對於人耳感受有參考意義的聲音大小,必須對不同頻率的聲音進行加權。那麼問題來了,怎麼得到聲音的頻率?

關於這個問題,可能是大部分人都弄不清楚的。一般認為,通過測定麥克風輸出信號的有效值,我們就能得到對應的聲音大小。但是經過上面的研究我們已經發現,不同聲音頻率對於我們感受有很大影響,最簡單的可以舉例超聲波和次聲波,麥克風可能仍有很大信號,但對於我們人來說,無論多大,可能我們都無法感受到了。若此時顯示幾十上百db,那對於拿著這個雜訊計的人一定是非常莫名其妙的。

又扯了這麼多,還是這個問題,如何得到聲音的頻率?

這設計到大學電信專業的一門課程,名為:數字信號處理,這門課程對於數學的要求如此之高以至於大部分並沒有想去看他的慾望。基本只需要記住幾個公式就完事了。

但其中有一個我們這需要使用到的數學方法傅里葉變換。

那麼什麼叫做傅里葉變換?

傅立葉變換在應用中算是一種分析信號的方法,它可分析信號的成分,也可用這些成分合成信號。

他的數學公式是這樣的。。 當然這只是裝個B。

作為工程狗基本上不用了解這麼詳細的數學公式,簡單的理解傅里葉變換就是,他可以把一個信號分解為無數個由他的諧波信號相加而成。

及 a=a1+a2+a3+...+an

後面全部是他的諧波信號,及各種頻率的波的疊加。

所以當實際的聲音信號經過傅里葉變換之後,就可以分解為各種不同頻率的聲音的疊加,也可以說,真實的聲音必然是不同頻率的正弦波的疊加。而經過傅里葉變換之後,聲音也就由時域轉換到了頻域。

此時就可以方便的得出各給頻率處聲音的強度和大小。便能對聲音大小進行加權計算了。

由圖1可以看出a率加權曲線是連續的,那我們是否需要把每個頻率都進行加權?答案是可以,但也沒必要。在實際中我們對於頻率的選取叫做倍頻程。倍頻程的中心頻率為31.5、63、125、250、500、1K、2K、4K、8K、16KHz,某些要求更精細的條件下可以使用1/3倍頻程。

一個聲音在倍頻程上的分量可能是這樣,是不是很熟悉,很多音樂軟體都有這個顯示,以前的dvd播放機或者功放也大多有這個顯示。

如此一來,通過編程我們實現傅里葉變換,得到頻域,取出倍頻程上的值,通過加權,最終計算出聲音的分貝。然後呢?然後就需要做最後一步,那就是校準。

通過與專業的儀器進行校準,對比輸出。我的經驗是只要完全按照以上理論,硬體上ok,基本上只需要調節聲音的放大倍數,就可以和專業的幾百塊的雜訊計符合的相當完美。

註:本答案只涉及聲音分貝演算法知識。其實對於分貝計還有同樣重要的信號調理能力,畢竟是1000倍信號大小的差距。

==============================================

創客這麼火,為什麼身邊沒創客?

還一個人玩DIY?

Arduino入門難?

DFRobot淘寶最大代理商,首個Arduino知識分享公眾號,更適合GEEK的公眾號。理論與實踐並重。期待你的關注。


環境雜訊測試儀難就難在如何對雜訊正確定標可信測量

雜訊的單位是分貝(dB),但分貝本身其實是一個表示比值而不是能量強度。實際上聲音強度的真正定義是聲壓(Pa, 帕斯卡)。分貝用於噪音計量的時候其實隱含了基準點(0dB)等於20微帕(μPa)的信息。

所以聲音雖然容易採集,但定標沒法定——如何把這個聲音引發出來,從而確定麥克感測到的電壓值,所對應的分貝數到底是多少呢?要知道我們日常生活的環境底噪尚且有20-40dB甚至更多。

另外一個問題就是測量的可信與權威性。如何保證測量設備感測、頻響和模數轉換的正確?又如何向別人證明這一點?這幾乎是個無解的問題。當然可以去記錄測量的全程錄音,但這也只是個參考。

我的建議是乾脆不要自己去測量雜訊,而是購買一個成品的噪音計。例如勝利的這一款:

然後好好做一個精度比較高的模數轉換電路,把噪音計的DC類比信號輸出直接接上。這樣,測量到的電平和雜訊之間,就有了經過權威儀器標定的關係,你就可以自由的讀取、利用或永久記錄雜訊的權威測量數據了。——測准電壓並不是什麼難事。

當然如果你堅持自己製作,你也可以用這種成型的雜訊計,去調教、標定和檢驗你用麥克風測量到的聲音強度,與雜訊分貝數之間的關係。

總之做儀器的原則就是:無基準,不做事。千萬別忘記。


不知道題主有沒有搞定...最近正好也在弄這個,供題主參考下吧

我不是想要做出多精確的儀器,就是想做個東西監測環境的噪音情況,所以是不是嚴格按照分貝什麼的計算要求去測也就沒管

我的方案是:arduino uno+ 某寶買的麥克風咪頭(最好自帶放大器的)

接線是:麥克風咪頭為3線,模擬量輸出的,電源和GND分別接arduino的5V和GND,輸出線(OUT有的寫的是S)接arduino的A0口

程序是:

setup里只把serial初始話以下,Serial.begin(9600); 噪音檢測都放在loop里;

通過analogRead(A0),讀取A0口的模擬量(0-1024),讀取1000次後求方差,方差的數值就可以代表噪音的情況;

我讀取到的A0口的模擬量數據大概是這樣的...

(木有示波器什麼的東西,導出數據到EXCEL里做的,湊合看看吧)

平均值是533(不同的麥克風咪頭模塊貌似平均值不一樣,另外一個是700左右);

半夜啥都不做的時候方差2.5左右,手機APP顯示分貝是25db左右;

放白雜訊音頻(較輕)的時候方差6.5左右,手機APP顯示分貝是70db左右;

放白雜訊音頻(較響)的時候方差25左右,手機APP顯示分貝是100db左右;

雖然,計算結果和APP顯示的分貝不是線性相關的...不過也能湊合表示以下環境的噪音情況...

希望能對題主有幫助


樓上答得很專業!

學生時代做過一個遠程雜訊監測的項目。用了5塊錢的麥克風模塊,直接接到單片機的ADC,然後不停地採樣並且顯示數據。接著用樓上說的標準聲級計來標定,得到ADC的輸出和聲壓之間的關係。

我記得還挺準的。


如果僅僅是單機的手持檢測儀器,arduino方案可能用到的元器件有:Arduino Uno, 聲音感測器模塊(如 @何忠傑 所言),LCD顯示模塊,電池。

切記校準(如 @Super璐璐 所言),即在採集感測器數據後,可轉化成分貝單位何專業的儀器比對。然後在arduino程序中,進行相應的數值補償。

如果這是您需要的答案,請點贊。歡迎進一步交流。謝謝。


推薦閱讀:

Ruff 和 Arduino 最大區別是什麼?
用Arduino連接感測器收集數據,以無線方式發送到RaspberryPi,由樹莓派處理數據並保存,行不行?怎麼做?
Arduino 是什麼?
Arduino 的 Serial.write() 和 Serial.print() 的區別在哪裡?
arduino與電腦利用wifi數據互通,是怎麼實現的?

TAG:Arduino |