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

 
 
> Реализация БИХ фильтра, что делать с С-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
Ответов
sysel
сообщение Apr 27 2010, 09:21
Сообщение #2


Знающий
****

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



Приведу оптимизированную версию кода, которая "хавает" как floating-point, так и fixed-point IIR из С-Header-ов, сгенерированных FDATOOL из MATLABa

Код
#include "fdacoefs.h"

typedef double    real;

#define Fs        3600    // Частота сэмплирования

#define IIR_hist_size        5    // Кол-во ячеек памяти в реализации фильтра

real History[IIR_hist_size];

real IIR_filter (real X, real* Hist){
    for (int i=0; i<MWSPT_NSEC; i++){
        int jmax = ((NL[i]>DL[i])?(NL[i]):(DL[i]))-1;
        if (jmax>0){
            // Блок фильтра из каскада
            real W = 0;
            for (int j=0; j<jmax; j++){
                W += DEN[i][j+1] * Hist[j];
            };
            W = X - W;
            W *= (1/DEN[i][0]);
    
            X = W * NUM[i][0];
            for (int j=0; j<jmax; j++){
                X += NUM[i][j+1] * Hist[j];
            };
            
            for (int j=1; j<jmax; j++){
                Hist[j] = Hist[j-1];
            };
            Hist[0] = W;
            Hist += jmax;
        } else if (jmax==0){
            // Блок "Gain" между каскадами фильтра
            X *= NUM[i][0] * (1/DEN[i][0]);
        };
    };
    return X;
};

int main(){
    // Обнуляем ячейки памяти
    for (int i=0; i<IIR_hist_size; i++){
        History[i]=0;
    };
    
    real X,Y,F;

    F = 10.0; // 10 Гц

    F=2*CONST_PI*F/(real)Fs;

    for (int i=0; i<1000000; i++){
        X=cos(F*(real)i);
        Y=IIR_filter (X,History);
    };

    return 0;
}
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 16:45
Рейтинг@Mail.ru


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