2017-02-21 99 views
0

我正在嘗試執行音頻輸入的線性縮放,每個通道上的縮放比例相同。縮放聲音Java

總體效果是,輸入流的幅度逐漸減小直到其靜音。因此,我的第一個樣本將保持不變,而我的最後一個樣本的幅度將爲0。我想知道你是如何實現這一點的。

到目前爲止,這是我的縮放代碼,並想知道是否還需要這樣它位於16位二進制補碼範圍之間縮放樣本。

for (int i=0; i<data.length; ++i){ // data[i] is sample in intger form 
     data[i] = (int) (data[i]*(something/something)); 
} 

如果可以解釋縮放到某個特定因素,這會有幫助嗎?

謝謝!

+1

你真正的問題是什麼?如果你正確地進行了縮放,而你只是在減小幅度,它將自動處於16位的範圍內。然而,你的代碼是不正確的 - 爲什麼你需要將樣本與最大值相乘 - 這使得它的32位範圍和更大聲?如果在循環的第一次迭代中除以零,會發生什麼?你甚至運行過代碼嗎? –

+0

@erwin bolwidt我的問題是你如何線性縮放到0.我只是將每個樣本除以0? – Hawwa

回答

1

我假設您正在使用短價值觀合作,爲您的音頻數據(例如,[-32768..32767])和轉換和從字節別處處理。

在你的分數,「東西/某事」,分子會而分母仍然是一個固定值的範圍從零等於分母下降的值。

實施例,如果要破壞體積範圍爲128個的步驟中,最響亮的體積將是128/128,最安靜的體積將是0/128。

爲了避免除法,則可以預先計算等於1/128的因子,和包容在範圍[0..128]內的值相乘。

然後,你會有「東西* precalculatedFactor」這可能會運行一點點快。

但是,存在線性體積縮放問題。實際感知量不會線性跟蹤。因此,X的音量區間可能幾乎不會在高端產生音量差異,但會很大以至於導致不連續並在低端點擊。

我認爲人們經常使用指數函數來更好地將音量映射到線性輸入。有哪些是最好的分歧。但是,假設您的音量撥號從[0..1]開始。例如,如果您在應用該值之前對該值進行了三次冪化,例如,爲了創建1/2的響度而輸入0.5(0.5 * 0.5 * 0.5)=> 0.125,這將比0.5更接近1/2的響度。

因此, 「什麼事* * *的東西precalculatedFactorCubed」 可能會更好地工作。

+0

如何使用兩個通道進行縮放? – Hawwa

+0

渠道左右交錯。您可以將相同的因子和計算應用於這兩個值中的每一個。 –