2012-07-31 67 views
0

從Java中的流中讀取時聲音數據的低級別實際格式是什麼?例如,使用44.1khz採樣率,16位採樣深度,2通道,有符號數據,bigEndian格式的以下數據線。聲音數據格式

TargetDataLine tdLine = new TargetDataLine(new AudioFormat(44100,16,2,true,true));

據我所知,它每秒採樣44100次,每個採樣是16位。我不明白的是16位或16位中的每一位表示什麼。另外,每個通道是否有自己的16位採樣?

+1

16位構成一個數字,它是離散樣本時聲波的幅度,最終測量值介於-1和1之間。但爲什麼底層數據格式很重要? – bzlm 2012-07-31 12:46:42

+0

我希望能夠讀取數據並挑選某個特定頻率的實例。 – user1565671 2012-07-31 12:56:16

+1

然後你需要學習[不僅僅是數字音頻基礎知識](http://en.wikipedia.org/wiki/Fast_Fourier_transform)。 :)爲了擴展[@ IronMensan的答案](http://stackoverflow.com/a/11740529/7724),一部分採樣聲音中包含的頻率是光圈在移動時所產生的所有聲波的波長。 [這是可計算的](http://stackoverflow.com/questions/3287518/reliable-and-fast-fft-in-java),但複雜,而不是一個確切的科學。 – bzlm 2012-07-31 13:00:16

回答

0

我首先從最後一個問題開始,是的,每個通道都有自己的16位樣本,用於每秒44100個樣本。

至於你的第一個問題,你必須知道揚聲器內部的硬件。有隔膜和electormagnet。如果你取下蓋子,隔膜就是你可以看到的大圓形部分。當電磁鐵充電時,它會拉動或推動連接在隔膜上的鐵片,使其移動。這種運動變成了一種聲音。

每個樣本的價值是發送給揚聲器的電量。所以當樣品爲零時,隔膜處於靜止狀態。當它是積極的時候,它被推向一個方向,當它是消極的時候,另一個方向。樣品越大,隔膜移動得越多。

如果您繪製數據中的所有樣本,則可以繪製揚聲器隨時間推移的運動圖。

0

您應該瞭解有關Digital Audio Basics(維基爲您提供了一個開始和大量的鏈接以及更多的閱讀內容)。之後44.1khz採樣率,16位採樣深度,2通道,有符號數據,bigEndian格式應該立即告訴你低級格式。

在這種情況下,它意味着44100個樣本/秒,16比特簽署表示每個樣品整數和最後字節序確定以何種順序16位INT的字節被放入流(大端=最顯著字節第一)。