2016-08-18 24 views
-1

甲函數返回0和128之間的離散數據欲該數據轉換成一個尺度以這種方式是a值...離散數據以對數標度

0將導致0 128將導致128

兩者之間的值應該以這種方式加權,其中較低數字被「更快」地轉換爲較高數字,其中較高數字將變得更慢。

背景:我想做一個分貝規模VU表(-inf爲0dB)這樣的(請注意距離如何減少對以dB爲單位的相同的絕對變化)

L ||||||||||||||||||||    | 
R |||||||||||||||||||||||||||   | 
-inf   -36  -18 -6 -3 0 
0         128 

我如何變換這些值以反映寬度爲255像素的VU上峯值的寬度,例如?

回答

1

一個直接的映射是做這樣的事情

f(x) = b * (log(a + x) - log(a)) 

它的f(0)=0財產,小數字的變化快於大數更快。您可以調整a以更改與對數曲線的距離(距離越近)。一旦確定a,則可以通過求解等式f(128)=128來確定b,其導致b=128/(log(128+a)-log(a))

這背後的想法是f(x)=log(x)-Infx=0,所以要彌補一點點,說f(x)=log(a+x),然後做一個線性變換,以確保[0128]映射到[0128]: f(x) = k * log(a+x) + b 並確定kb,通過求解線性方程f(0)=0f(128)=128

+0

哇 - 太快了!我害怕,我不是那種日誌。所以x是我的函數給出的值,a會是一些「調整」數字,但我不明白b是如何起作用的。你介意解釋嗎?謝謝! –

+0

因爲你想'f(128)= 128'嗎?如果你沒有'b',那麼'f(128)= log(128 + a)-log(a)',所以你需要'b'來擴展它。 –