2011-11-26 25 views
2

,我對我的第四個年頭的項目一個小例子應用程序中工作(與官能團反應性編程處理)。這個想法是創建一個簡單的程序,它可以播放一個.wav文件,然後顯示播放歌曲當前音量的「彈跳」動畫(就像在音頻錄製軟件中一樣)。我在Scala中構建它,所以主要考慮了Java庫和現有的解決方案。尋找一個.wav的「量」在給定時間

目前,我已成功地輕鬆播放.wav文件,但我似乎無法達到第二個目標。基本上有,我可以解碼一個.wav文件的方式,所以我可以在任何給定的時間訪問 '音量'?通過容積我想我是指它的幅度,但我可能是錯的這一點 - 高等物理學是前一陣子....

很顯然,我不知道很多關於這個在所有所以它,如果有人可以大指向正確的方向!

+0

看看像RMS和dB的東西。 –

+0

像[這些](http://stackoverflow.com/questions/5048852/using-jfreechart-to-display-recent-changes-in-a-time-series)之一可能會作出適當的看法。 – trashgod

回答

4

在您通常指的是信號的瞬時峯值幅度的數字音頻處理(這也被稱爲PPM -- peak programme metering)。根據您想如何準確的是,或者如果你希望模型的一些標準化的計量與否,你既可以

  • 只是用樣本幀的滑動窗口(發現每個窗口的最大絕對值)
  • 實施某種峯值保持機制,該機制在給定的持續時間內保留最後的峯值,然後開始以每秒給定的分貝數「跌落」。

其它測量模式是由一個特定的時間窗口上積分來計算RMS(由窗口長度添加的平方樣本值,除和取平方根,從而根均方RMS) 。這給出了信號的「能量」的更好的概念,移動比峯值測量更平滑,但沒有捕獲到觀察到的最大值。這種模式有時也被稱爲VU meter。你可以用一種滯後(低通)濾波器來近似這個值,例如y[i] = y[i-1]*a + |x[i]|*(a-1),對於一些價值0 < a < 1

您通常在對數顯示decibels的值,即,因爲這相當於我們的信號強度更好的感知,也爲大多數信號產生的屏幕空間更經常報道。

三個項目我參加可以幫助你:

  • ScalaAudioFile,你可以用它來讀取從AIFF或WAVE文件
  • ScalaAudioWidgets這是一個還年輕,不完整的項目樣本幀在scala-swing之上提供一些音頻應用程序部件,包括PPM視圖 - 只需使用滑動窗口並定期設置窗口的當前峯值(以及可選的RMS),並且該視圖將負責峯值保持和下降時間
  • ScalaCollider,客戶t用於SuperCollider聲音合成系統,您可以使用它來回放聲音文件並實時測量峯值和RMS幅度。後者對於您的項目來說可能是一種矯枉過正,如果您從未聽說過SuperCollider,將會涉及到一些嚴重的學習曲線。好處是你不需要擔心你的聲音播放與儀表顯示同步)
+0

ScalaAudioFile看起來很棒,所以我決定使用它。有沒有什麼幫助可以告訴我如何獲得wav每秒的強度。我目前正在做這件事(做出一組數值):https://gist.github.com/1398345 – seadowg

5

在wav文件,在流中的一個給定的點上的數據是體積(由一半的動態範圍的移位)。換句話說,如果您知道什麼類型的wav文件(例如8位,單聲道),則每個字節代表一個樣本。如果你知道採樣率(比如說44100HZ),那麼把時間乘以44100,那就是你想看的字節。

的字節的值是體積(從中間.. 0和255是峯值距離,127是零)。這是假定編碼不是mu-law編碼。我發現瞭如何分辨出來,或者更好的是,在這裏這些格式之間進行轉換一些好的信息:

http://www.gnu.org/software/octave/doc/interpreter/Audio-Processing.html

您可能希望在一些固定數目的樣本的窗口來平均這些樣本雖然。

+0

*「流中給定點處的數據是音量。」*否,不是。不是OP所指的那種音量。例如。信號中的「扁平線」值127不是全音量,而是0音量。 –

+0

是的。我試圖在第二段中說清楚。我會編輯以澄清;雖然這是簡單的,因爲這不能解釋mu-law編碼的可能性。 – snapfractalpop

+0

你正在混合伸長和振幅。聲音文件中的幀表示採樣的伸長率。例如,正弦波'y [i] = sin(ω* i)'具有在-1和1之間振盪的伸長,而振幅是恆定的(1)。按體積你可以參考某種幅度測量。 –

相關問題