2016-08-09 31 views
1

我想實現一個音量計,以幫助用戶使用NAudio來選擇他們的麥克風。我需要盡我所能去除只有背景噪聲的設備,並確保我在說話時顯示某些內容。如何從NAudio的StreamVolumeEventArgs.MaxSampleValues中計算dB?

我們目前在Unity3D應用程序中使用1.7.3版本,因此在崩潰時沒有可用的MMDevice相關方法。

我使用的是一個WaveInEvent,我輸入一個WaveInProvider,隨後輸入SampleChannel。我將SampleChannel填入MeteringSampleProvider,我訂閱了StreamVolume事件。

在我的OnPostVolumeMeter事件處理程序,當我收到StreamVolumeEventArgs(我命名參數e)我想知道如何計算分貝。我已經看到了大量的例子,它們從e.MaxSampleValues[0]中剔除了峯值音量(有時似乎被稱爲振幅)。一些示例檢查它是否是立體聲信號,並將抓取最大值在e.MaxSampleValues[0]e.MaxSampleValues[1]之間。

無論如何,這個數字的值是什麼?這是一個百分比嗎?當我對控制檯進行調試時,它們是相對小的小數(10^-3或10^-4)。

是計算類似,

var peak = e.MaxSampleValues[0]; 
if (e.MaxSampleValues.Length > 1) 
{ 
    peak = Mathf.Max(e.MaxSampleValues[0], e.MaxSampleValues[1]); 
} 
var dB = Mathf.Max(20.0f*Mathf.Log10(peak), -96.0f); 

或是否需要通過32768.0分的峯值?如,

var dB = Mathf.Max(20.0f*Mathf.Log10(peak/32768.0f), -96.0f); 

是這種方法完全不正確的,我需要收集我做的RMS排序計算的,我計算出的平均值由樣本數除以和的平方根樣本的緩衝全部除以32768並將其輸入到Log10中?

我見過幾次提到看NAudioDemo的AudioPlaybackPanel並將這volumeMeter幅度是e.MaxSampleValues[0]e.MaxSampleValues[1]

+0

我還在看這篇[1]維基百科文章,現在我想知道的是我在e.MaxSampleValues []中得到的值是「幅度比」嗎? [1] https://en.wikipedia.org/wiki/Decibel#Absolute_measurements – Scott

回答

0

看你的帖子的日期值這可能是一個解決問題你在這裏的其他人的利益。

音頻信號在波形中的負值和正值之間擺動。揮杆的頻率以及揮杆的幅度或高度會影響您聽到的聲音。

你說的正確的是在尋找振幅以查看音頻是否存在。

對於儀表而言,由於採樣率遠高於您可能顯示的任何儀表的刷新率,因此您需要使用math.max記錄峯值,或者對多個採樣進行平均。在你的情況下,要麼工作,除非你試圖在bdFS中顯示一個精確的儀表,不需要數據庫計算。

在應用程序中,我一直在尋找基於音頻或缺乏音頻觸發事物。我通常將樣本轉換爲浮點數,這會給你一個介於0和1之間的範圍,然後選擇一個閾值0.2,並說明是否有任何樣本超過了我們的音頻。

浮球還提供了一個很好的顯示指示儀表。請注意,如果您的應用是用於專業音頻應用,並且您詢問準確測量我的答案會完全不同。