|
Библиотека (dll) расчета фильтров, Посоветуйте pls |
|
|
|
Nov 21 2014, 09:11
|
Группа: Участник
Сообщений: 12
Регистрация: 10-02-14
Пользователь №: 80 434

|
Господа, посоветуйте чайнику библиотеку расчета (синтеза) цифровых фильтров, совместимую с дельфями. На входе задал параметры фильтра: тип, частота среза, порядок - на выходе коэффициенты.
Применение. Пишу прогу для писюка, работающую со звуковушкой. Частота дискретизации звуковушки может переустанавливаться - частота среза ранее посчитанного фильтра естестьвенно сдвинется, надо пересчитывать. Также будет реализация фильтров с параметрами, задавемыми пользователем - например, частота резонансного пика - тоже надо рассчитывать на лету.
|
|
|
|
Guest_TSerg_*
|
Nov 22 2014, 09:14
|
Guests

|
|
|
|
|
|
Dec 6 2014, 15:14
|
Группа: Участник
Сообщений: 12
Регистрация: 10-02-14
Пользователь №: 80 434

|
Цитата(Genadi Zawidowski @ Nov 22 2014, 15:34)  Поищите по словам FIRDsgn, в исходниках на С - функция расчёта фильтров до десятка строк на каждый вид. И без .dll обойдётесь. Не найдёте - в аттачменте возьмите. Спасибо. Все понятно, код легко можно выдернуть и т.п. Только там КИХ-фильтры, а нужны и КИХ, и БИХ. В первую очередь БИХ, забыл конкретизировать. Попробую погуглить IIRDsgn.  Цитата(TSerg @ Nov 22 2014, 14:14)  Спасибо, не то. В той компоненты реализованы: 1) Фильтр Калмана, в настоящий момент абсолютно мне не нужный. 2) Какой-то сложный универсальный ФНЧ, базирующийся на ПФ. Мне же нужна процедура расчета классических КИХ и БИХ фильтров - такая, например, как в Matlab\FDATool, только реализованная в виде dll-ки без всяких гуёвых интерфейсов. Цитата(stealth-coder @ Nov 21 2014, 21:52)  Intel Integrated Performance Primitives Тут, если я правильно понял краткое описание, есть лишь реализация самих алгоритмов _обработки_. Мне же нужна процедура расчета. Поправьте pls, если я понял неправильно, а то там наверное копать - не перекопать.
Сообщение отредактировал ymv - Dec 6 2014, 14:50
|
|
|
|
|
Jan 25 2015, 10:52
|
Группа: Участник
Сообщений: 12
Регистрация: 10-02-14
Пользователь №: 80 434

|
Цитата(thermit @ Dec 6 2014, 23:27)  Спасибо. Руки дошли, качнул FDes.rar (f_design.cpp), прикрутил. Только результаты не совпадают с моими контрольными данными. Может, есть дока или кто юзал эту библиотеку?
|
|
|
|
|
Jan 25 2015, 18:14
|
Группа: Участник
Сообщений: 12
Регистрация: 10-02-14
Пользователь №: 80 434

|
Цитата(thermit @ Jan 25 2015, 18:05)  Какие еще контрольные данные? Задается шаблон фильтра. По рассчитанным к-там строится ачх и смотрится факт ее вписывания/не вписывания в шаблон. На моей памяти, все было нормально с этой либой. Ну я вообще сравнивал по коэффициентам. Очень уж сильный разнобой. В случае с FDesign вообще получил коэффициенты больше единицы, для БИХ-фильтра разве возможно? Наверное, не так её юзаю. Контрольный пример. В WinFilter задаю ФНЧ с БИХ, порядок 2, Баттерворт, частота дискретизации 44100, частота среза 9кГц. Получаю коэффициенты: float ACoef[NCoef+1] = { 0.21320719693741449000, 0.42641439387482899000, 0.21320719693741449000 }; float BCoef[NCoef+1] = { 1.00000000000000000000, -0.33915118494314400000, 0.19197997269398712000 }; Строю АЧХ. Соответствует. Теперь по FDesign: В переменной типа Filt_Params задаю: apass1:=-1; apass2:=-1; astop1:=-80; //В децибелах? Иначе ругается. astop2:=-80; wpass1:=9000; //В герцах или круговая частота? wpass2:=9000; wstop1:=9100; wstop2:=9100; fsamp:=44100; gain:=0; acoefs:=@aCoeff; bcoefs:=@bCoeff; order:=2; select:=#0; approx:=#0; implem:=#0; Это задавалось из дельфей, но переменные передаются правильно, цеплялся дебаггером. Вызываю функцию Calc_Butter_Coefs (оно?). Получаю ACoeffs: (0, 0, 1.96522672836027), BCoeffs: (1, 1.98253712618972, 1.96522672836027) Может, глянешь, есть под рукой примеры применения этой чудо-либы?
|
|
|
|
|
Jan 25 2015, 19:15
|
Знающий
   
Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730

|
Цитата(ymv @ Jan 25 2015, 22:14)  Ну я вообще сравнивал по коэффициентам. Очень уж сильный разнобой. В случае с FDesign вообще получил коэффициенты больше единицы, для БИХ-фильтра разве возможно? Наверное, не так её юзаю.
Контрольный пример.
В WinFilter задаю ФНЧ с БИХ, порядок 2, Баттерворт, частота дискретизации 44100, частота среза 9кГц. Получаю коэффициенты: float ACoef[NCoef+1] = { 0.21320719693741449000, 0.42641439387482899000, 0.21320719693741449000 };
float BCoef[NCoef+1] = { 1.00000000000000000000, -0.33915118494314400000, 0.19197997269398712000 }; Строю АЧХ. Соответствует.
Теперь по FDesign:
В переменной типа Filt_Params задаю: apass1:=-1; apass2:=-1; astop1:=-80; //В децибелах? Иначе ругается. astop2:=-80; wpass1:=9000; //В герцах или круговая частота? wpass2:=9000; wstop1:=9100; wstop2:=9100; fsamp:=44100; gain:=0; acoefs:=@aCoeff; bcoefs:=@bCoeff; order:=2; select:=#0; approx:=#0; implem:=#0;
Это задавалось из дельфей, но переменные передаются правильно, цеплялся дебаггером. Вызываю функцию Calc_Butter_Coefs (оно?). Получаю ACoeffs: (0, 0, 1.96522672836027), BCoeffs: (1, 1.98253712618972, 1.96522672836027)
Может, глянешь, есть под рукой примеры применения этой чудо-либы? Если фильтр полосовой, надо select = 'P' - bandPass implem = 'I' - IIR approx='B' - Butterworth order = 2 - 0 - сам оценит порядок под селективные требования fsamp=44100 apass1=-1 - в дБ astop1 = -80 astop2 = -80 wpass1 = - круговая wpass2 = - круговая wstop1 = - круговая wstop2 = - круговая Calc_Filter_Coefs (оно).
|
|
|
|
|
Feb 2 2015, 10:11
|
Группа: Участник
Сообщений: 12
Регистрация: 10-02-14
Пользователь №: 80 434

|
Цитата(thermit @ Jan 26 2015, 00:15)  Если фильтр полосовой, надо Нужен ФНЧ. Пробовал: apass1:=-3; //дБ apass2:=-3; astop1:=-5; //дБ. Нужен фильтр с низким спадом, приблизительный аналог аналогового ФНЧ 2 порядка astop2:=-5; wpass1:=9000*2*3.14; //9кГц wpass2:=9000*2*3.14; wstop1:=10000*2*3.14; wstop2:=10000*2*3.14; fsamp:=44100; gain:=0; acoefs:=nil; bcoefs:=nil; order:=0; select:='L'; approx:='B'; implem:='I'; end; RetVal:=Calc_Filter_Coefs(@Params); Короче, выдал коэффициенты: Порядок=3 acoeffs 1 1 0 1 bcoeffs 1 -0.145210396025875 0 1 Такой фильтр выдаёт у меня клиппинг. Чтобы не наслаивать проблемы стыковки с дельфями, залезал дебаггером в сишную dll-ку. Ниже трассировка: Calc_DigIIR_Coefs Calc_Filter_Order order=3 Calc_Normal_Coefs Calc_Butter_Coefs acoeffs 0 0 1.00079180388367 0 bcoeffs 0 1 1.00079180388367 1 Unnormalize_Coefs Unnorm_LP_Coefs acoeffs 0 0 65832.8315322196 0 bcoeffs 0 1 65832.8315322196 1 Bilinear_Transform acoeffs 1 1 0 1 bcoeffs 1 -0.145210396025875 0 1 UnWarp_Freqs
|
|
|
|
|
Feb 10 2015, 07:09
|
Группа: Участник
Сообщений: 12
Регистрация: 10-02-14
Пользователь №: 80 434

|
Цитата(thermit @ Feb 9 2015, 03:15)  либа выдает коэффициенты биквадратных звеньев. иначе говоря, для 3-го порядка будет 2 по 3 к-та a и 2 по 3 к-та b. здесь a - к-ты числителей, b - к-ты знаменателей. ну и результат надо умножить на gain или умножить к-ты числителей на корень из gain. Спасибо. Похоже, проще самому эту кухню освоить и прописать.  Чем и займусь. Еще вопрос-офтопик. Не порекомендует ли кто прогу построения АЧХ/ФЧХ цифровых фильтров? Чтоб сунул ей коэффициенты, и вперед. С удобнымм масштабированием и т.п. WinFilter, Matlab/FDATool видел.
|
|
|
|
|
Feb 16 2015, 16:42
|
Группа: Участник
Сообщений: 12
Регистрация: 10-02-14
Пользователь №: 80 434

|
Цитата(thermit @ Feb 9 2015, 03:15)  либа выдает коэффициенты биквадратных звеньев. иначе говоря, для 3-го порядка будет 2 по 3 к-та a и 2 по 3 к-та b. здесь a - к-ты числителей, b - к-ты знаменателей. ну и результат надо умножить на gain или умножить к-ты числителей на корень из gain. Возвращаясь к либе. Не совсем понял эту фразу. Не пояснишь ли тупому, можно ли из этих коэффициентов биквадратных звеньев перейти к обычным коэффициентам, что выдаёт например Matlab/FDATool, WinFilter. Перемножить эти коэффициенты на gain? У меня, кстати, gain получился в этом примере 0.103367640320208, не обратил сразу внимания. Перемножил, получилось что-то похожее, но не совсем то.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|