Кроссфейд равной мощности в аудиоустройстве?

На самом деле это больше теоретический вопрос, но вот оно.:

Я разрабатываю звуковой блок с эффектами, и ему требуется равномощное перекрестное затухание между необработанными и обработанными сигналами.

Но я запутался в правильном способе отображения функции линейного фейдера на масштабный коэффициент (gain)для амплитуд сигналов сухих и влажных потоков.

По сути, я видел, как это делается с функциями cos/sin или квадратными корнями... по сути, аппроксимирующими логарифмические кривые. Но если наше восприятие амплитуды изначально логарифмическое, то не должны ли эти кривые, отображающие положение фейдера в амплитуду, на самом деле быть экспоненциальными?

Это то, что я имею в виду:

Предположения:

  • signal[i]означает i-й образец в сигнале.
  • каждая выборка представляет собой число с плавающей запятой в диапазоне [-1, 1] для амплитуд между [0,1].
  • наш элемент управления с графическим интерфейсом представляет собой NSSlider в диапазоне от [0,1], поэтому он находится в принцип линейный.
  • 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 и обработанного выходного сигнала)от него по существу то же самое только с одним ползунком, воздействующим на оба гипотетических сигнала 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

Но разве эти кривые не подчеркивают наше логарифмическое восприятие амплитуды?

8
задан SaldaVonSchwartz 16 April 2012 в 04:49
поделиться