ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
23 апреля
823142 Топик полностью
plainuser (12.03.2018 08:04 - 08:10, просмотров: 278) ответил AlexBi на Понадобилось сделать цифровой фильтр 50Гц, полоса около 10%, желательно в целых числах. Очень давно таким не занимался. Вроде сейчас уже есть чуть ли не онлайн составители таких фильтров, даешь ему параметры, он исходник реализации на Си. Ни кто
Смотреть в сторону применения хрени типа stm32f4xx с аппаратным блоком плавучки и winfilter с даблами.Результат можно прям сразу запускать на процессоре.Отдельная песня с применением фильтра Бесселя.Матлаб его вообще игнорирует по причине невозможности корректной цифровой реализации а винфильтр как-то синтезирует но возможен траходром.Целочисленные коэффициенты требуют глубокого вникания в тему. Вот пример полосового фильтра 48-52Гц /************************************************************** WinFilter version 0.8 http://www.winfilter.20m.com akundert@hotmail.com Filter type: Band Pass Filter model: Butterworth Filter order: 2 Sampling Frequency: 4 KHz Fc1 and Fc2 Frequencies: 0.048000 KHz and 0.052000 KHz Coefficents Quantization: float Z domain Zeros z = -1.000000 + j 0.000000 z = -1.000000 + j 0.000000 z = 1.000000 + j 0.000000 z = 1.000000 + j 0.000000 Z domain Poles z = 0.994943 + j -0.076018 z = 0.994943 + j 0.076018 z = 0.994472 + j -0.080427 z = 0.994472 + j 0.080427 ***************************************************************/ #define NCoef 4 float iir(float NewSample) { float ACoef[NCoef+1] = { 0.00004595038040017619, 0.00000000000000000000, -0.00009190076080035238, 0.00000000000000000000, 0.00004595038040017619 }; float BCoef[NCoef+1] = { 1.00000000000000000000, -3.97883065352601670000, 5.94890707902649480000, -3.96119229923324710000, 0.99115359586283902000 }; static float y[NCoef+1]; //output samples static float x[NCoef+1]; //input samples int n; //shift the old samples for(n=NCoef; n>0; n--) { x[n] = x[n-1]; y[n] = y[n-1]; } //Calculate the new output x[0] = NewSample; y[0] = ACoef[0] * x[0]; for(n=1; n<=NCoef; n++) y[0] += ACoef[n] * x[n] - BCoef[n] * y[n]; return y[0]; }