реклама на сайте
подробности

 
 
> Реализация БИХ фильтра, что делать с С-Header из MATLAB ?
sysel
сообщение Apr 26 2010, 08:49
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 3-07-07
Пользователь №: 28 852



Здравсвуйте!
Столкнулся со следующей проблемой:
Разрабатываю IIR (БИХ) фильтр в MATLAB (fdatool), получаю коэффиециенты фильтра (Direct-Form II, Second-Order Sections), (Order = 6, Sections = 3).
Делаю С-header с этими самыми коэффиециентами (Targets -> Generate C header).
Получаю некие массивы.

Как мне теперь реализовать этот фильтр на языке C ?

Следую принципу каскадной реализации и реализации Direct Form II - но фигня какая-то выходит.

Поделитесь, пожалуйста, рабочим кодом.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
bahurin
сообщение Apr 26 2010, 10:05
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 20-09-08
Пользователь №: 40 347



Цитата(sysel @ Apr 26 2010, 11:49) *
Поделитесь, пожалуйста, рабочим кодом.


Код
typedef struct structIIR{    
    double*    b;
    int        lb;
    double* a;
    int        la;
}IIR, *PIIR;


int conv(double *a, int la, double *b, int lb, double *c){
    if((!a)||(!b)||(!c)||(!la)||(!lb))
        return 0;
    memset(c, 0, (la+lb-1)*sizeof(double));
    for(int i = 0; i < la; i++){
        for(int j = 0; j < lb; j++)
            c[i+j] += a[i]*b[j];
    }
    return 1;
}

int iir_filter(PIIR piir, double *s, int n){
    double* c = (double*)malloc(piir->la*sizeof(double));
    double* d = (double*)malloc(piir->lb*sizeof(double));
    double* v = (double*)malloc((piir->lb+n-1)*sizeof(double));

    for(int i =0; i<piir->la; i++)
        c[i] = piir->a[i]/piir->a[0];
    for(int i =0; i<piir->lb; i++)
        d[i] = piir->b[i]/piir->a[0];
    conv(d,piir->lb,s,n,v);
    s[0] = v[0];
    
    for(int i = 1; i<n; i++){
        int k = 1;
        s[i] = v[i];
        while(((i-k)>=0)&&(k<piir->la)){
            s[i]-=c[k]*s[i-k];
            k++;
        }
    }
    free(c);
    free(d);
    free(v);
    return 1;
}


Коэффициенты пишем в структуру IIR и указатель на нее в функцию фильтрации. А вообще вот dll весит 20 кБ умеет считать фильтры аналогично матлабу. Есть документация с примерами.

Сообщение отредактировал bahurin - Apr 26 2010, 10:07
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 14:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01363 секунд с 7
ELECTRONIX ©2004-2016