Создайте флэш-эквалайзер (измените выходной звук)

StackOverflow https://stackoverflow.com/questions/1099103

  •  11-09-2019
  •  | 
  •  

Вопрос

Привет, хотелось бы знать, возможно ли вообще создать "параметрический" эквалайзер во flash.Не просто обычные графические эффекты, а инструмент для изменения выходного звука, который передается через приложение.Приветствуются любые рекомендации, подсказки.Спасибо

Это было полезно?

Решение

Это будет не так-то просто...но здесь может быть выход:

var parameters:Array = [1,1,1,1,0.5]
var sound:Sound = new Sound();
sound.addEventListener(SampleDataEvent.SAMPLE_DATA, filter); 
sound.load(soundURLRequest);
sound.play();

private function filter(event:SampleDataEvent):void
{
    var freqDomain:Array = FFT(event.data, parameters.length); // You will need to find a FFT(Fast Fourier Transform) function to generate an array. 
    for(var i:int = 0; i < freqDomain.length; i++)
    {
        freqDomain[i] = freqDomain[i] * parameters[i]; // This is where your EQ parameters get applied.
    }
    var timeDomain:Array = IFFT(freqDomain, event.data.length); // Inverse FFT

    for(value:Number in timeDomain) 
    {
        event.data.writeFloat(value);
    }
}

Что касается функций FFT и IFFT, то FFT обычно выводит комплексные значения (вещественные + комплексные компоненты), которые могут быть преобразованы в амплитудные и фазовые компоненты.Что вам действительно нужно, так это только величина, которая имеет формулу = (sqrt(real ^ 2 + complex ^ 2)).Человеческие уши НЕ чувствительны к фазе (в отличие от глаз, которые очень чувствительны к фазе), поэтому при выполнении обратного БПФ вы можете вставить случайную или плоскую фазу с небольшой разницей.Обратите внимание, что мой подход является очень низкоуровневым с точки зрения реализации фильтра.

Вот функция преобразования Фурье (хотя и не быстрая, это просто свертка (O (n ^ 2)) против FFT O (nlogn)) просто для справки (ошибка..это у меня в голове не укладывается, так что, возможно, что-то не так с константами):

// Note that this only returns the magnitude, I am discarding the phase.
function FFT(sample:Array, size):Array
{
    var frequencies = new Array(size);
    for(int i = 0; i < sample.size; i++)
    {
        for(int j = 0; i < frequencies.size; j++)
        {
            var real:Number = sample[i] * Math.cos(Math.PI/2 * i * j);
            var complex:Number = sample[i] * Math.sin(Math.PI/2 * i * j);
            frequencies[j] += Math.sqrt(real * real + complex * complex);
        }
    }
    return frequencies;
}

Другие советы

Проверьте Страница лабораторий Андре Мишеля.Он много работает с audo во Flash ... Наверное, один из лучших.Я не уверен, что такое параметрический эквалайзер, но вы должны быть в состоянии найти полезную информацию на этой странице.

Обновить: Я нашел пример того, как 3-полосный эквалайзер с использованием Flash 10.Он использует математику, отличную от упомянутой CookieOfFortune, но это работает (ну, так оно и было).Используя это, я обновил пример для 5-полосного интерфейса и преобразовал его для работы в Flex.Ты можешь смотрите код на GitHub.

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


Оригинальное сообщение:Я не уверен, насколько это поможет, но это временный шаг для получения эффекта звукового эквалайзера без проблем с БПФ и тому подобным.

http://www.webdesign.org/web/flash/tutorials/sound-equalizer.5020.html

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

Вы также можете счесть полезной функцию extract() для переменной sound:http://livedocs.adobe.com/flex/3/langref/flash/media/Sound.html#extract

Вероятно, это набор цифровые фильтры это был бы ваш лучший выбор.В отличие от БПФ, с цифровым фильтром вам не нужно сохранять всю форму сигнала в памяти, поскольку цифровые фильтры являются причинно-следственными и просто просматривают несколько моментов в прошлом и / или будущем.Кроме того, если вы можете передавать звук в потоковом режиме, вы можете просто применить их на лету.Простые фильтры можно легко соединить вместе, чтобы создать более сложные фильтры.

Там есть бесплатная книга о цифровых фильтрах в нем есть некоторая базовая теория, но там также можно просто листать страницы и поднимать формулы.Например, беглое прочтение гл.В разделе 19 приведены простые формулы для высокочастотных, низкочастотных и полосовых рекурсивных фильтров, которые, вероятно, справятся с задачей, но если вы хотите поинтереснее, в книге есть множество других фильтров.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top