Мне надо сделать цифровой аудио фильтр.
Есть поток данных со звуковой карты, и надо отфильтровывать две частоты.
Как можно сделать такие полосовые фильтры, чтоб можно было их параметры
менять и автоматически рассчитывать?
Здравствуйте, Аноним, Вы писали:
А>Мне надо сделать цифровой аудио фильтр.
А>Есть поток данных со звуковой карты, и надо отфильтровывать две частоты.
А>Как можно сделать такие полосовые фильтры, чтоб можно было их параметры
А>менять и автоматически рассчитывать?
short PassFilter::Work(short c) /* c - амплитуда сигнала в текущий момент
вpемени. */
{ /* функция будет возвpащать новую амплитуду для
записи */
/* в выходной поток */
int lo_tale; /* Хвост для фнч */
int hi_tale; /* Хвост ждя фвч */
if(--e_head < 0)
e_head = buff_size-1; /* заносим в буфеp новое
*/
e_buff[e_head] = c; /* значение */
/* ФHЧ */
lo_tale = e_head + low_frq; /* опpеделяем последнее значение окна */
if(lo_tale >= buff_size)
lo_tale -= buff_size;
lo_acc -= e_buff[lo_tale]; /* поддеpживаем сумму всех значений окна в*/
lo_acc += c; /* аккумулятоpе. для каждого нового значения*/
/* окно смещается */
/* ФВЧ */
hi_tale = e_head + high_frq; /* опpеделяем последнее значение окна */
if(hi_tale >= buff_size)
hi_tale -= buff_size;
hi_acc -= e_buff[hi_tale]; /* поддеpживаем сумму всех значений окна в*/
hi_acc += c; /* аккумулятоpе. для каждого нового значения*/
/* окно смещается */
/* для получения полосового фильтpа вычитаем из значения фнч значение фвч*/
switch(this->type) {
case BENDPASS: return hi_acc / (high_frq+1) - lo_acc / (low_frq+1);
case LOWPASS: return lo_acc / (low_frq+1);
case HIGHPASS: return c - hi_acc / (high_frq+1);
default: return lo_acc / (low_frq+1) - hi_acc / (high_frq+1);
};
}
Где взял не помню...
Кажись где-то на
здесь
C.E.O. HeroCraft Ukraine — fun on the run.
Здравствуйте, elmm_, Вы писали:
_>_>short PassFilter::Work(short c) /* c - амплитуда сигнала в текущий момент
_>вpемени. */
_>{ /* функция будет возвpащать новую амплитуду для
_>записи */
_> /* в выходной поток */
_> int lo_tale; /* Хвост для фнч */
_> int hi_tale; /* Хвост ждя фвч */
_> if(--e_head < 0)
_> e_head = buff_size-1; /* заносим в буфеp новое
_>*/
_>
_>Где взял не помню...
_>Кажись где-то на здесь
очень бестолковый фильтр. Фильтр является прямоугольным окном свернутым с сигналом, что дает плохую частотную характеристику и слабую фильтрацию. Единственное преимущество -- быстрота и возможность работы с целыми числами.
Здравствуйте, Olegovich, Вы писали:
O>Thanks!
O>осталось перегнать в дельфу...
O>Генератор синусоиды уже на ней написал...
рекомендую более общую доку по созданию фильтров. Большая часть фильтров там второго порядка, что вполне достаточно для фильтрации звука, однако не для детектирования сигналов.
Смотреть
здесь
если что непонятно будет -- welcome.