2010-11-12 5 views
2

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

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

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

ответ

2

Я настоятельно рекомендую numerical recipes in c. Вне этого я не уверен, что смогу вам помочь.

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

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

+0

Эта функция является мясо класса, который делает буферизацию и файл работы. Все работает нормально, но я хочу преобразовать в hz и db, а не использовать срез, основанный на времени, как только var – coneybeare

+0

ах, нормально. Оформить код, который я связал с 'C++', на самом деле очень хорошо. Он будет возвращать фильтр, основанный на частоте. –

+0

именно то, что я искал. Удивительная находка – coneybeare

2

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

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

где WindowWidth, сколько образцов шириной ваше окно, х находится в диапазоне от -2 * PI до 2 * PI, а пропускная способность:

bandwidth = 2 * frequency * n/sampleRate;

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

Я обобщил свой собственный код для этого, так как исходный код довольно жестокий.

+0

windowWidth - длина массива буфера? Или это что-то меньшее? Я закончил с фильтром нижнего фильтра butterworth, связанным с Stephen Furlani, и, похоже, он работает очень хорошо, поэтому я попробую ваш, если я получу дополнительное время. – coneybeare

+0

'windowWidth' варьируется от 3 до. Верхний предел основан на медленном желании кода. Большее окно приводит к более крутой обрезке. Как правило, вам не нужно проходить мимо 63. Кроме того, нечетные значения работают лучше всего. – lucius

+0

отличный ответ. Я забыл большую часть моей обработки сигналов ... и отправляю код жестокости. : D –