Прототип WebAudio FDN Lossless Prototype нестабилен при использовании индивидуальных усилений обратной связи

1

Я пытаюсь создать ревербератор FDN в WebAudio, следуя этой статье.

Существует упрощенная реализация FDN Householder, которая использует общий коэффициент обратной связи для всех задержек и выглядит довольно стабильной.

Однако, когда я пытаюсь реализовать более общий случай, смешанный с матрицей, я не могу сделать его стабильным.

Я вложил большую часть кода, чтобы сузить проблему, и поместил ее в JSFiddle.
EDIT: предупреждение, большой объем в неустойчивом корпусе.

Разница сводится к следующему:

var feedback = context.createGain();
feedback.gain.value = gainValue;

for(var i=0; i<n; i++) {
    this.delays[i].connect(feedback);
    feedback.connect(this.delays[i]);
}

По сравнению с:

for(var i=0; i<n; i++) {
    for(var o=0; o<n; o++) {
        var feedback = context.createGain();
        feedback.gain.value = gainValue;

        this.delays[i].connect(feedback);
        feedback.connect(this.delays[o]);   
    }
}

Когда я использую общую обратную связь GainNode для всех задержек, она работает нормально. Когда я создаю индивидуальную обратную связь GainNodes для всех задержек, используя тот же метод gainValue, он становится неустойчивым.

Что я делаю неправильно?

EDIT: Разъяснение из статьи.

Как упоминалось в п. 3.4, "идеальный" поздний резонанс реверберации должен напоминать экспоненциально затухающий шум [314]. Поэтому полезно при проектировании ревербератора начать с бесконечного времени реверберации ("случай без потерь") и работать над тем, чтобы сделать ревербератор хорошим "генератором шума". Такая исходная точка [часто] называется прототипом без потерь [153,430]. Когда в импульсном отклике прототипа без потерь слышен ровный шум, можно затем работать над получением желаемого времени реверберации в каждой частотной полосе (как будет описано ниже в п. 3.7.4).

  • 0
    Если вы не получили ответ здесь, вы можете попробовать dsp.stackexchange.com
  • 0
    Эй спасибо Мигрировал вопрос оттуда сюда :)
Теги:
algorithm
web-audio
delay
feedback

2 ответа

0

В коде это означает:

    for(var i=0; i<n; i++) {
        for(var o=0; o<n; o++) {
            var feedback = context.createGain();
            feedback.gain.value = gainValue/9;

            this.delays[i].connect(feedback);
            feedback.connect(this.delays[o]);   
        }
    }

Я могу повторно использовать этот код когда-нибудь правильно??? Если я устанавливаю n до 30, я получаю вид звука в цимбале.

  • 0
    Ну, это приводит к потере, которая является нежелательной. Я уточню вопрос с уточнением. Что касается разрешения на использование, я положу его на GitHub с соответствующей лицензией, как только мы заработаем :)
  • 0
    это без потерь. Мы не режем звуки, мы просто подстраиваем общую громкость, чтобы она не скрипела. Звук, который он генерирует, звучит как матричная реверберация. Так что вы ищете?
Показать ещё 2 комментария
0

Узлы усиления добавляют громкость друг к другу. Если вы используете несколько узлов усиления, вам нужно разбить их на количество активных узлов усиления.

Так что, если у вас есть 10 узлов усиления, одновременно использующих громкость для узла усиления, это значение /10 (количество активных узлов усиления). Вам необходимо отредактировать значение узлов усиления до и до нового значения. Поэтому лучше всего сохранить все узлы Gain в массиве и перебрать его.

Я не пробовал, но думаю, что это сработает. Это физически совершенно неудобно, потому что, если у вас десять человек, плачущих в одной комнате, db-Meter все еще так же громко, как если бы вы плакали. Попытайтесь больше вычислить узлы усиления математическим способом, чтобы они добавляли сигнал друг к другу.

Кстати, ваш ревербератор - допинг.

  • 0
    Спасибо за ваш ответ! Я попробовал каждую возможную комбинацию изменения выгод, о которых я мог думать, от небольших до больших количеств и в разных местах, и это все еще нестабильно. Из того, что я понимаю, есть положительные и отрицательные выгоды, которые должны компенсировать друг друга. Я могу, например, заставить его нарастить и потерпеть крах, уменьшив одно из усилений с 1 до 0,9. Я согласен, что есть что-то, что должно компенсировать дополнительные линии усиления, я просто не могу понять, что и как.
  • 0
    Я только что проверил в течение пяти минут, и если я делю через 9, он становится довольно стабильным, ...
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню