Реализация фильтра нижних частот с постобработкой с использованием основного звука - PullRequest
2 голосов
/ 12 ноября 2010

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

- (void)processDataWithInBuffer:(const int16_t *)buffer outBuffer:(int16_t *)outBuffer sampleCount:(int)len {   
    BOOL positive;
    for(int i = 0; i < len; i++) {
        positive = (buffer[i] >= 0);
        currentFilteredValueOfSampleAmplitude = LOWPASSFILTERTIMESLICE * (float)abs(buffer[i]) + (1.0 - LOWPASSFILTERTIMESLICE) * previousFilteredValueOfSampleAmplitude;
        previousFilteredValueOfSampleAmplitude = currentFilteredValueOfSampleAmplitude; 
        outBuffer[i] = currentFilteredValueOfSampleAmplitude * (positive ? 1 : -1);
    }
}

Что я могу сделать, чтобы преобразовать этот код в код, который позволит мне обрезать частоты с определенной частотой до определенного уровня в дБ?

Ответы [ 3 ]

2 голосов
/ 22 ноября 2010

У вас есть БИХ-фильтр, и для большего контроля я бы предложил использовать КИХ-фильтр, для которого проще рассчитать коэффициенты.Я создаю оконную функцию:

y = sin (x * bandwidth) / (sin (x) * windowWidth)

, где windowWidth - это количество сэмплов ширины вашего окна, x колеблется от -2 * PI до 2 * PI и пропускная способность:

bandwidth = 2 * frequency * n / sampleRate;

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

Я суммировал свой собственный код для этого, поскольку оригинальный код довольно грубый.

2 голосов
/ 12 ноября 2010

Я настоятельно рекомендую числовые рецепты в c .Помимо этого, я не уверен, что смогу вам помочь.

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

Это в C ++ , но оно должно помочь вам начать.Извините, я не могу дать конкретный ответ.

1 голос
/ 22 апреля 2011

Я реализовал фильтр с помощью интерактивного конструктора фильтров .

Вот пример кода со встроенным кодом: https://github.com/davidcairns/MediaPlayerDemo

...