Реализация после обработанного фильтра низкого прохода с использованием Core Audio
-
08-10-2019 - |
Вопрос
Я реализовал элементарный фильменту с низким уровнем передачи, используя значение на основе времени. Это нормально, но пытаясь найти правильный промежуток времени, - это угадывать работу, и дает разные результаты на основе различных входных аудиофайлов. Вот что у меня сейчас:
- (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);
}
}
Что я могу сделать, чтобы преобразовать этот код в код, который позволит мне сократить частоты на определенный HZ на определенном уровне БД?
Решение
Я настоятельно рекомендую Численные рецепты в C. Отказ Снаружи этого я не уверен, что могу помочь вам.
При разработке фильтра необходимо рассчитать коэффициенты этого фильтра на основе частоты, поэтому вам почти нужен класс для обработки его, а не только функцией.
Это внутри C ++ Но это должно вас начать. Извините, я не могу предоставить конкретный ответ.
Другие советы
То, что у вас есть, это IIR-фильтр, и для большего количества контроля я предлагаю использовать ель фильтр, который легче рассчитать коэффициенты для. Я создаю функцию окна:
y = sin (x * bandwidth) / (sin (x) * windowWidth)
Где WindowWidth - это сколько образцов широко вашего окна, х варьируется от -2 * Pi до 2 * Pi, а полоса пропускания:
bandwidth = 2 * frequency * n / sampleRate;
Это создает множество номеров, которые вы относитесь к ряду образцов, сосредоточенных вокруг того, как вы хотите вывести. Вы повторяете это через каждый образец.
Я подвел свой собственный код для этого, поскольку исходный код довольно Crufty.
Я реализовал фильтр, используя Интерактивный фильтр дизайнер.
Вот несколько примерных кодов, с ним интегрирован: https://github.com/davidcairns/mediaplayerDemo.