ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
5 декабря
823057 Топик полностью
йцукен (11.03.2018 17:25 - 17:28, просмотров: 410) ответил AlexBi на Понадобилось сделать цифровой фильтр 50Гц, полоса около 10%, желательно в целых числах. Очень давно таким не занимался. Вроде сейчас уже есть чуть ли не онлайн составители таких фильтров, даешь ему параметры, он исходник реализации на Си. Ни кто
Вопрос делится на три части: алгоритм самой фильтрации, откуда брать коэффициенты, и как использовать целочисленную арифметику. Ниже пример самого примитивного БИХ-фильтра, дающий ответ на первые два вопроса. С целочисленной арифметикой просто https://dsp.stackexchange.com/questions/21792/best-implementation-of-a-real-time-fixed-point-iir-filter-with-constant-coeffic
получается только для КИХ-фильтра: коэффициенты умножаются на 2^N, результат сдвигается на N бит вправо. К сожалению, сам КИХ требует больше вычислений, чем БИХ. У БИХ есть неприятный нюанс: игреки нужно хранить с большей точностью, чем иксы, и эта избыточная точность тем больше, чем больше отношение частоты дискретизации к центральной частоте фильтра и его добротность. По ссылке интересное обсуждение, но сам я так делать не пробовал. class biquad { double c0, c1, c2; double d1, d2; double x1, x2; double y1, y2; public: biquad(); void make_notch( double Fs, double f0, double Q ); double operator()( double x0 ); }; biquad::biquad() { c0 = c1 = c2 = d1 = d2 = 0.0; x1 = x2 = y1 = y2 = 0.0; } void biquad::make_notch( double Fs, double f0, double Q ) { double r = 1 - 1/Q; c2 = c0 = r; c1 = -2 * r * cos( 2.0 * PI * f0 / Fs ); d1 = -c1; d2 = -r*r; } double biquad::operator()( double x0 ) { double y0 = x0*c0 + x1*c1 + x2*c2 + d1*y1 + d2*y2; x2 = x1; x1 = x0; y2 = y1; y1 = y0; return y0; }