2012-04-16 157 views
8

這實際上更多的是一個理論問題,但在這裏它是:音頻單元中的等功率交叉淡入淡出?

我正在開發一個效果音頻單元,它需要乾和溼信號之間的等功率交叉淡入淡出。

但是我對從線性衰減器到幹流和溼流信號幅度的縮放因子(增益)做映射函數的正確方法感到困惑。

基本上,我看到它用cos/sin函數或平方根完成......基本上近似於對數曲線。但是如果我們的幅度感知是對數的,那麼這些曲線不應該將衰減器位置映射到幅度實際上是指數型的嗎?

這就是我的意思是:

假設:

  • signal[i]意味着信號的第i個樣本。
  • 每個樣本都是[-1,1]的範圍,範圍爲[0,1]之間的幅度。
  • 我們的GUI控件是一個範圍從[0,1]的NSSlider,所以它在 原理上是線性的。
  • fader是一個帶有NSSlider值的變量。

第一觀察: 我們對數的方式感知幅度。因此,如果我們有一個線性推杆,僅僅通過做調整信號的幅度:signal[i] * fader我們所感知(聽力,無論數學)是沿着線的東西:

enter image description here

這就是所謂的稱爲蹩腳的推子效果:我們從靜音到滑塊最左側的音量增加劇烈,並且音量似乎沒有變大。

所以,我們要做的推子「右」,我們不是任何明示它在一個分貝的規模,然後,儘可能的信號而言,這樣做:signal[i] * 10^(fader/20)或者,如果我們在[0,以保持或推子單位, 1],我們可以這樣做:signal[i] * (.001*10^(3*fader))

無論哪種方式,我們從NSSlider這是我們將使用在我們的代碼乘以推子變量新的映射,看起來現在這個樣子:

enter image description here

這是我們真正想要的,因爲由於我們以對數方式感知振幅,所以我們本質上是馬比從線性(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); 

其中的曲線將是:

enter image description here

和以前一樣,因爲我們對數感知幅度,這個指數映射實際上應該讓我們聽到交叉淡入淡出線性。

但是,我已經看到使用近似曲線的交叉漸變的實現。含義,而不是:

enter image description here

但不會這些曲線實際上是強調我們振幅的對數看法?

+0

我建議在DSP姊妹網站上詢問這個問題:http://dsp.stackexchange.com/ – 2012-04-16 10:33:18

+0

我想我現在知道了,但嘿,我不知道那個網站! – SaldaVonSchwartz 2012-04-16 10:35:48

+0

很酷。如果你知道了,你應該回答你自己的問題 - 我想爲你想知道你提出的答案。 – 2012-04-17 07:08:48

回答

7

您所考慮的「相等功率」交叉淡入淡出必須與保持混合的總輸出功率保持恆定不變,因爲您從褪色變爲乾燥。保持總功率不變是保持總體感知響度不變的合理近似(實際上它可能相當複雜)。

如果正在相等的功率兩個不相關的信號之間的交叉衰減,則可以通過使用任何兩個函數,其平方值總和爲1的一個常見的例子保持交叉淡入淡出期間,恆定的輸出功率是該組的功能

G1(K)=(0.5 + 0.5 * COS(PI * K))^ 5

G2(K)=(0.5 - 0.5 * COS(PI * K))^ 5,

其中0 < = k < = 1(注意,如上所述,g1(k)^ 2 + g2(k)^ 2 = 1)。我們有兩個信號x1(t)和x2(t),它們具有相等的冪E [x1(t)^ 2] = E [x2(t) (E [x1(t)* x2(t)] = 0)。請注意,滿足前一條件的任何一組增益函數將具有g2(k)=(1-g1(k)^ 2)^。現在,在形成值Y(T)= G1(K)* X1(t)的+ G2(K)* X2(t)的,我們有:

E[ y(t)^2 ] = E[ (g1(k) * x1(t))^2 + 2*g1(k)*(1 - g1(k)^2)^.5 * x1(t) * x2(t) + (1 - g1(k)^2) * x2(t)^2 ] 
= g1(k)^2 * E[ x1(t)^2 ] + 2*g1(k)*(1 - g1(k)^2)^.5 * E[ x1(t)*x2(t) ] + (1 - g1(k)^2) * E[ x2(t)^2 ] 
= g1(k)^2 * Px + 0 + (1 - g1(k)^2) * Px = Px, 

在這裏我們使用任何g1(k)的和g2(k)是確定性的,因此可以被拉到期望算子E []外,並且根據定義E [x1(t)* x2(t)] = 0,因爲假定x1(t)和x2不相關。這意味着無論我們處於交叉淡入淡出狀態(無論我們選擇哪個k),我們的輸出仍將具有相同的功率Px,並因此有望與感知的響度相等。請注意,對於完全相關的信號,可以通過執行「線性」淡入使用和兩個總和爲1的函數(g1(k)+ g2(k)= 1)來獲得恆定的輸出功率。當混合有些相關的信號時,這兩者之間的增益函數理論上是合適的。

你想,當你說

的什麼,和以前一樣,因爲我們對數感知幅度, 這個指數映射實際上應該讓我們聽到 交叉淡入淡出線性。

是一個信號應在感知響度作爲減少的滑塊位置(k)的線性函數,同時施加派生淡入淡出時的其他信號應感知響度作爲增加的滑塊位置的線性函數,。雖然你的推導看起來很不錯,但不幸的是,這可能不是最好的方法來融合你乾溼信號的一致性 - 無論滑塊位置如何,保持相同的輸出響度都是最好的選擇。無論如何,可能值得嘗試一些不同的功能來查看哪些是最可用和最一致的。