2012-04-16 18 views
8

Điều này thực sự là một câu hỏi lý thuyết, nhưng ở đây nó đi:crossfade quyền lực bằng nhau trong Audio Unit?

Tôi đang phát triển một đơn vị âm thanh có hiệu lực và nó cần một quyền lực ngang chéo giữa các tín hiệu khô và ướt. Nhưng tôi đang nhầm lẫn về cách thức đúng đắn để thực hiện chức năng ánh xạ từ vạch kẻ tuyến tính đến hệ số chia tỷ lệ (độ lợi) cho biên độ tín hiệu của luồng khô và ướt.

Về cơ bản, tôi thấy nó được thực hiện với các hàm cos/sin hoặc rễ vuông ... về cơ bản xấp xỉ các đường cong logarit. Nhưng nếu nhận thức của chúng ta về biên độ là logarit để bắt đầu, thì các đường cong này có nên lập bản đồ vị trí fader với một biên độ thực sự là theo cấp số nhân không?

Đây là những gì tôi muốn nói:

Giả định:

  • signal[i] có nghĩa là mẫu thứ i trong một tín hiệu.
  • mỗi mẫu là một phao [-1, 1] cho biên độ giữa [0,1].
  • Điều khiển GUI của chúng tôi là một NSSlider khác nhau, từ [0,1], do đó, nó nằm ở tuyến tính nguyên tắc.
  • fader là biến có giá trị của NSSlider.

Quan sát đầu tiên: Chúng tôi nhận biên độ một cách logarit. Vì vậy, nếu chúng ta có một fader tuyến tính và chỉ điều chỉnh biên độ của tín hiệu bằng cách thực hiện: signal[i] * fader những gì chúng ta đang cảm nhận (nghe, không phụ thuộc vào toán học) là một cái gì đó dọc theo dòng:

enter image description here

Đây là Somali được gọi là crappy fader-effect: chúng tôi đi từ im lặng đến một khối lượng tăng mạnh mẽ trên phân khúc ngoài cùng bên trái trong thanh trượt và qua giữa âm lượng dường như không nhận được to hơn.

Vì vậy, để làm fader "đúng", thay vào đó, hãy biểu thị tỷ lệ dB và sau đó, theo như tín hiệu có liên quan, hãy thực hiện: signal[i] * 10^(fader/20) hoặc, nếu chúng tôi giữ hoặc đơn vị fader trong [0, 1], chúng ta có thể làm: signal[i] * (.001*10^(3*fader))

Dù bằng cách nào, lập bản đồ mới của chúng tôi từ NSSlider vào biến fader mà chúng tôi sẽ sử dụng cho nhân trong mã của chúng tôi, trông như thế này bây giờ:

enter image description here

Đó là những gì chúng ta thực sự muốn, bởi vì vì chúng ta cảm nhận biên độ logarit, chúng ta chủ yếu là mappi ng từ tuyến tính (dải NSSLider 0-1) đến theo số mũ và cho đầu ra mũ này vào nhận thức logarit của chúng ta. Và nó chỉ ra rằng: log(10^x)=x vì vậy chúng tôi cuối cùng nhận thức được sự thay đổi biên độ trong một tuyến tính (aka chính xác) cách.

Tuyệt vời.Bây giờ, suy nghĩ của tôi là một crossfade quyền lực ngang nhau giữa hai tín hiệu (trong trường hợp này một NSSlider ngang khô/ướt để trộn lẫn đầu vào với AU và đầu ra xử lý từ nó) về cơ bản là giống nhau chỉ với một thanh trượt hoạt động trên cả hai tín hiệu giả thuyết khô [i] và ướt [i].

Vì vậy, Nếu dãy trượt của tôi 0-100 và khô là toàn trái và ướt đầy bên phải), tôi muốn kết thúc với mã dọc theo dòng:

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); 

Đồ thị trong đó sẽ là:

enter image description here

Và giống như trước, bởi vì chúng ta nhận thức biên độ loga, lập bản đồ mũ này thực sự nên làm cho nó mà chúng ta nghe thấy crossfade như tuyến tính.

Tuy nhiên, tôi đã nhìn thấy các triển khai của crossfade bằng cách sử dụng xấp xỉ để ghi lại đường cong. Nghĩa là, thay vì:

enter image description here

Nhưng sẽ không những đường cong thực sự nhấn mạnh nhận thức logarit của chúng ta về biên độ?

+0

Tôi muốn đề nghị yêu cầu điều này trên trang web chị em DSP: http://dsp.stackexchange.com/ –

+0

Tôi nghĩ rằng tôi đã nhận nó ngay bây giờ nhưng hey tôi không biết về trang web đó! – SaldaVonSchwartz

+0

Tuyệt. Nếu bạn đã tìm ra, bạn nên trả lời câu hỏi của riêng bạn - tôi cho một người muốn biết câu trả lời bạn đã đưa ra. –

Trả lời

7

Kết hợp "ngang bằng sức mạnh" mà bạn đang nghĩ đến phải làm với việc giữ tổng công suất ra của hằng số hỗn hợp khi bạn mờ dần từ ướt đến khô. Giữ cho tổng công suất không đổi phục vụ như là một xấp xỉ hợp lý để giữ tổng số liên tục độ ồn lớn (mà trong thực tế có thể khá phức tạp).

Nếu bạn đang chéo giữa hai tín hiệu không tương quan với công suất bằng nhau, bạn có thể duy trì công suất đầu ra không đổi trong suốt quá trình truyền bằng cách sử dụng bất kỳ hai hàm nào có giá trị bình phương tổng cộng 1. Ví dụ chung là tập hợp các hàm

.

g1 (k) = (0,5 + 0,5 * cos (pi * k))^5

g2 (k) = (0,5 - 0,5 * cos (pi * k))^5,

.

trong đó 0 < = k < = 1 (lưu ý rằng g1 (k)^2 + g2 (k)^2 = 1 được thỏa mãn, như đã đề cập). Đây là một bằng chứng cho thấy kết quả này trong một crossfade điện liên tục cho các tín hiệu không tương quan:

Giả sử chúng ta có hai tín hiệu x1 (t) và x2 (t) với công suất bằng E [x1 (t)^2] = E [x2 (t)^2] = Px, cũng không tương quan (E [x1 (t) * x2 (t)] = 0). Lưu ý rằng bất kỳ tập hợp các hàm gain nào thỏa mãn điều kiện trước đó sẽ có g2 (k) = (1 - g1 (k)^2) ^. Bây giờ, tạo thành y sum (t) = g1 (k) * x1 (t) + g2 (k) * x2 (t), ta có:

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, 

nơi chúng tôi đã sử dụng mà g1 (k) và g2 (k) là xác định và do đó có thể được kéo ra ngoài toán tử kỳ vọng E [] và E [x1 (t) * x2 (t)] = 0 theo định nghĩa vì x1 (t) và x2 (t) được giả thiết không được tương quan. Điều này có nghĩa rằng không có vấn đề mà chúng tôi đang ở trong crossfade (bất cứ điều gì k chúng tôi chọn) đầu ra của chúng tôi vẫn sẽ có sức mạnh tương tự, Px, và do đó hy vọng bằng nhau cảm nhận được độ ồn. Lưu ý rằng đối với tín hiệu tương quan hoàn toàn, bạn có thể đạt được công suất đầu ra không đổi bằng cách thực hiện một phai "tuyến tính" - sử dụng và hai hàm tổng hợp thành một (g1 (k) + g2 (k) = 1). Khi trộn các tín hiệu có phần tương quan, các hàm có được giữa hai tín hiệu này về lý thuyết sẽ phù hợp.

Những gì bạn đang nghĩ đến việc khi bạn nói

Và giống như trước, bởi vì chúng ta nhận thức biên độ loga mapping mũ này thực sự nên làm cho nó mà chúng ta nghe thấy crossfade như tuyến tính.

là một tín hiệu perceptually nên giảm ở độ to như một hàm tuyến tính của vị trí thanh trượt (k), trong khi các tín hiệu khác perceptually nên tăng độ to như một hàm tuyến tính của vị trí thanh trượt, khi áp dụng crossfade nguồn gốc của mình. Tuy nhiên, không may là cách tốt nhất để pha trộn các tín hiệu khô và ướt của bạn về tính nhất quán - thường là duy trì độ to đầu ra bằng nhau, bất kể vị trí thanh trượt là điều tốt nhất để chụp. Trong mọi trường hợp, có thể đáng thử một vài chức năng khác nhau để xem những gì có thể sử dụng và nhất quán nhất.

Các vấn đề liên quan