Здравствуйте, Аноним, Вы писали:
А>Мне надо сделать цифровой аудио фильтр.
А>Есть поток данных со звуковой карты, и надо отфильтровывать две частоты.
А>Как можно сделать такие полосовые фильтры, чтоб можно было их параметры
А>менять и автоматически рассчитывать?
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.