這實際上更多的是一個理論問題,但在這裏它是:音頻單元中的等功率交叉淡入淡出?
我正在開發一個效果音頻單元,它需要乾和溼信號之間的等功率交叉淡入淡出。
但是我對從線性衰減器到幹流和溼流信號幅度的縮放因子(增益)做映射函數的正確方法感到困惑。
基本上,我看到它用cos/sin函數或平方根完成......基本上近似於對數曲線。但是如果我們的幅度感知是對數的,那麼這些曲線不應該將衰減器位置映射到幅度實際上是指數型的嗎?
這就是我的意思是:
假設:
signal[i]
意味着信號的第i個樣本。- 每個樣本都是[-1,1]的範圍,範圍爲[0,1]之間的幅度。
- 我們的GUI控件是一個範圍從[0,1]的NSSlider,所以它在 原理上是線性的。
fader
是一個帶有NSSlider值的變量。
第一觀察: 我們對數的方式感知幅度。因此,如果我們有一個線性推杆,僅僅通過做調整信號的幅度:signal[i] * fader
我們所感知(聽力,無論數學)是沿着線的東西:
這就是所謂的稱爲蹩腳的推子效果:我們從靜音到滑塊最左側的音量增加劇烈,並且音量似乎沒有變大。
所以,我們要做的推子「右」,我們不是任何明示它在一個分貝的規模,然後,儘可能的信號而言,這樣做:signal[i] * 10^(fader/20)
或者,如果我們在[0,以保持或推子單位, 1],我們可以這樣做:signal[i] * (.001*10^(3*fader))
無論哪種方式,我們從NSSlider這是我們將使用在我們的代碼乘以推子變量新的映射,看起來現在這個樣子:
這是我們真正想要的,因爲由於我們以對數方式感知振幅,所以我們本質上是馬比從線性(NSSLider範圍0-1)到指數並且將這個指數輸出饋送到我們的對數感知。事實證明:log(10^x)=x
所以我們最終以線性(正確)方式感知幅度變化。
太好了。
現在,我認爲兩個信號之間的等功率交叉淡入淡出(在這種情況下,幹/溼水平NSSlider將輸入混合到AU以及來自AU的處理輸出)基本上與只有一個滑塊作用於兩個假設信號dry [i]和wet [i]。
所以如果我的滑塊的範圍從0到100和乾燥是全左和溼是全右),我結束了沿着線代碼:
Float32 outputSample, wetSample, drySample = <assume proper initialization>
Float32 mixLevel = .01 * GetParameter(kParameterTypeMixLevel);
Float32 wetPowerLevel = .001 * pow(10, (mixLevel*3));
Float32 dryPowerLevel = .001 * pow(10, ((-3*mixLevel)+1));
outputSample = (wetSample * wetPowerLevel) + (drySample * dryPowerLevel);
其中的曲線將是:
和以前一樣,因爲我們對數感知幅度,這個指數映射實際上應該讓我們聽到交叉淡入淡出線性。
但是,我已經看到使用近似曲線的交叉漸變的實現。含義,而不是:
但不會這些曲線實際上是強調我們振幅的對數看法?
我建議在DSP姊妹網站上詢問這個問題:http://dsp.stackexchange.com/ – 2012-04-16 10:33:18
我想我現在知道了,但嘿,我不知道那個網站! – SaldaVonSchwartz 2012-04-16 10:35:48
很酷。如果你知道了,你應該回答你自己的問題 - 我想爲你想知道你提出的答案。 – 2012-04-17 07:08:48