либа для расчета фильтров

Все что касается фильтрации
Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1114
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: либа для расчета фильтров

Сообщение Бахурин Сергей »

Константинидис это могучий дядька. Отлично что ответил.

По поводу фортрана я понимаю что подпрограммы можно транслировать. Однако это не лучший путь потому что получается двойная работа. А вы сравнивали производительность компилятора фортрана с сишными компиляторами для одних и тех-же процедур?

Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Re: либа для расчета фильтров

Сообщение Santik »

Бахурин Сергей писал(а):Константинидис это могучий дядька. Отлично что ответил.
Хорошо бы его на наш форум пригласить... :D Может тему открыть "англоязычную"?
Бахурин Сергей писал(а): По поводу фортрана я понимаю что подпрограммы можно транслировать. Однако это не лучший путь потому что получается двойная работа. А вы сравнивали производительность компилятора фортрана с сишными компиляторами для одних и тех-же процедур?
Если не пользоваться библиотекой, то различий нет :D

Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Re: либа для расчета фильтров

Сообщение Santik »

Вычисление коэффициентов полосового фильтра Баттерворта 3 порядка на ATmega8 :shock:
Внимание! Внесено изменение 21.05.2015 06:55 мск

Код: Выделить всё

 #include <math.h>
float b1,b2,b3,a0,a1,a5,zz,Psi,Psi2,Beta;
float A[7],B[7];
void BP_Filter(float F0){
Psi=cos(F0*PI)*zz;
Psi2=Psi*Psi;
A[1]=Psi*a1;
A[2]=a0*((Psi2+1.)*(3.+b1)-b2-3.*b3);
A[3]=a0*Psi*(Psi2+6.-2*b2);
A[4]=a0*((Psi2+1.)*(3.-b1)-b2+3.*b3);
A[5]=Psi*a5;
return;}

void BP_Filter_Init(float Fs){
float z;
z=Fs*0.5*PI;
Beta=tan(z);
zz=-2./cos(z);
b1=2.*Beta;
b3=Beta*Beta;
b2=2.*b3;
b3=Beta*b3;
a0=1.0/(1.+b1+b2+b3);
A[0]=1.;
a1=a0*(3.+2.*b1+b2);
a5=a0*(3.-2.*b1+b2);
A[6]=a0*(1.-b1+b2-b3);
B[0]=b3*a0;
B[1]=0.;
B[2]=-3.*B[0];
B[3]=0.;
B[4]=-B[2];
B[5]=0.;
B[6]=-B[0];  
return;
}
void main(void){
float F0,Fs;
int i,N;
N=10;
Fs=0.1;  // полоса фильтра
BP_Filter_Init(Fs);  //
for(i=1;i<N;i++){
F0=0.3+i/20;
BP_Filter(F0);  }
return;              
} 
При частоте 8 МГц:
Инициализация полосы: 2 мс
Изменение центральной частоты: 1мс
Маловато будет (с) - в смысле скорости :D
Кто-нибудь на STM32 может испытать?

Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Re: либа для расчета фильтров

Сообщение Santik »

Бахурин Сергей писал(а): А вы на си не пишите? Есть идея сделать сишную либу с алгоритмами и фильтрами. Есть желание поучаствовать? Кстати можем заодно сравнить производительность фортрановских и сишных функций ;)
В теме http://dsplib.ru/forum/viewtopic.php?f= ... 9&start=70 опубликована моя программа на Си - полосовой фильтр 5 порядка. Вычисления по быстрому алгоритму позволяют почти в 2 раза "разрядить" матрицу z- преобразования. Вот эту прорамму было бы интересно сравнить по производительности.
Эффект скорее всего будет значителен только на фильтрах высокого порядка. Поэтому сейчас работаю над полосовым фильтром 8 порядка :D

Ответить