Цифровой фильтр
От: Аноним  
Дата: 11.03.05 09:53
Оценка:
Мне надо сделать цифровой аудио фильтр.
Есть поток данных со звуковой карты, и надо отфильтровывать две частоты.
Как можно сделать такие полосовые фильтры, чтоб можно было их параметры
менять и автоматически рассчитывать?
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.
Re[2]: Цифровой фильтр
От: Olegovich Россия  
Дата: 18.03.05 12:52
Оценка:
Thanks!
осталось перегнать в дельфу...
Генератор синусоиды уже на ней написал...
Re[2]: Цифровой фильтр
От: PSP Беларусь  
Дата: 25.03.05 13:42
Оценка:
Здравствуйте, 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 новое
_>*/

_>


_>Где взял не помню...

_>Кажись где-то на здесь

очень бестолковый фильтр. Фильтр является прямоугольным окном свернутым с сигналом, что дает плохую частотную характеристику и слабую фильтрацию. Единственное преимущество -- быстрота и возможность работы с целыми числами.
Всегда Ваш, PSP.
Re[3]: Цифровой фильтр
От: PSP Беларусь  
Дата: 25.03.05 13:47
Оценка:
Здравствуйте, Olegovich, Вы писали:

O>Thanks!

O>осталось перегнать в дельфу...
O>Генератор синусоиды уже на ней написал...

рекомендую более общую доку по созданию фильтров. Большая часть фильтров там второго порядка, что вполне достаточно для фильтрации звука, однако не для детектирования сигналов.

Смотреть здесь

если что непонятно будет -- welcome.
Всегда Ваш, PSP.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.