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

 
 
> Реализация БИХ фильтра, что делать с С-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 26 2010, 12:46
Сообщение #2


Знающий
****

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



Разобрался сам.
Добавлю свои результаты в фонд будущих поколений:

Пусть нам FDATOOL выдала следующий C-header:
Код
/*
* Filter Coefficients (C Source) generated by the Filter Design and Analysis Tool
*
* Generated by MATLAB(R) 7.8 and the Signal Processing Toolbox 6.11.
*
* Generated on: 26-Apr-2010 15:26:51
*
*/

/*
* Discrete-Time IIR Filter (real)
* -------------------------------
* Filter Structure    : Direct-Form II, Second-Order Sections
* Number of Sections  : 3
* Stable              : Yes
* Linear Phase        : No
*/

/* General type conversion for MATLAB generated C-code  */
#include "tmwtypes.h"
/*
* Expected path to tmwtypes.h
* C:\Program Files\MATLAB\R2009a\extern\include\tmwtypes.h
*/
#define MWSPT_NSEC 7
const int NL[MWSPT_NSEC] = { 1,3,1,3,1,2,1 };
const real64_T NUM[MWSPT_NSEC][3] = {
  {
   0.001582012905215,                 0,                 0
  },
  {
                   1,   -1.997425031815,                 1
  },
  {
    0.06078064837324,                 0,                 0
  },
  {
                   1,   -1.998996713475,                 1
  },
  {
   0.007688806860118,                 0,                 0
  },
  {
                   1,                 1,                 0
  },
  {
                   1,                 0,                 0
  }
};
const int DL[MWSPT_NSEC] = { 1,3,1,3,1,2,1 };
const real64_T DEN[MWSPT_NSEC][3] = {
  {
                   1,                 0,                 0
  },
  {
                   1,   -1.996305874613,   0.9963329403565
  },
  {
                   1,                 0,                 0
  },
  {
                   1,   -1.998581806418,   0.9986427868237
  },
  {
                   1,                 0,                 0
  },
  {
                   1,  -0.9976855336623,                 0
  },
  {
                   1,                 0,                 0
  }
};


Прячем #include "tmwtypes.h" :
// #include "tmwtypes.h"
И заменяем "real64_T" на "double".

Для получения одного отфильтрованного отсчета сигнала надо вызвать функцию IIR_filt (X), где X - входной отсчет.
Функция возвращает отсчет отфильтрованного сигнала.
Предварительно надо задать начальные значения для массива "ячеек памяти" WHistory. Ну или просто обнулить их.

Код
#include "fdacoefs.h"

double WHistory[MWSPT_NSEC][2];

double IIR_filt (double X){
    for (int i=0; i<MWSPT_NSEC; i++){
        double W;
        W = X;
        for (int j=1; j<DL[i]; j++){
            W-= DEN[i][j]*WHistory[i][j-1];
        };
        W*=1/DEN[i][0];

        X = W * NUM[i][0];
        for (int j=1; j<NL[i]; j++){
            X+=NUM[i][j]*WHistory[i][j-1];
        };
        WHistory[i][1] = WHistory[i][0];
        WHistory[i][0] = W;
    };
    return X;
};


Код не оптимизирован, зато даёт хорошее представление о том, чиго надо делать с хедером из FDATOOL.

Вот схематичное описание того, что далает этот код:
http://ftp.math.hkbu.edu.hk/help/toolbox/s...ilt.df2sos.html
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 24th July 2025 - 00:38
Рейтинг@Mail.ru


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