Re: Цифровой фильтр
От: elmm_ Украина http://herocraft.com
Дата: 12.03.05 22:54
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Мне надо сделать цифровой аудио фильтр.

А>Есть поток данных со звуковой карты, и надо отфильтровывать две частоты.
А>Как можно сделать такие полосовые фильтры, чтоб можно было их параметры
А>менять и автоматически рассчитывать?


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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.