Перейти к содержанию
    

расчет цифровых фильтров

Какие существуют программы для расчета коэф. цифровых фильтров?

конкретно интересует, в чем рассчитать целочисленные коэф. для примера цифрового фильтра BLACKFINа, который приведен в VisualDSP, в библиотеке <filter.h>?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какие существуют программы для расчета коэф. цифровых фильтров?

конкретно интересует, в чем рассчитать целочисленные коэф. для примера цифрового фильтра BLACKFINа, который приведен в VisualDSP, в библиотеке <filter.h>?

Матлаб например, использование FDATool там есть возможность задать целочисленную арифметику. А вообще, кажется подобную тему обсуждали неоднократно, можно поискать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте! Вопрос ламмерский, но по теме.Не получается воспользоваться рассчитанным в системе filter solution 10.0 полосовым(band pass) цифровым фильтром на 22Гц с полосой 4 Гц 6 порядка. Я пользуюсь микроконтроллером, программирую его на Си. Т.е. взял Си-код(файл DigFil1.c), сгенерированный вышеуказанной программой, присоединил его к своему проекту. Проинициализировал, т.е. написал в начале программы x=DigFil(0,1); Далее пытаюсь снимать с АЦП показания(частота дискретизации соответствует указанной в программке), передавать их на функцию фильтра: x=DigFil(data,0);

Но х оказывается неопределён. При отладке напротив переменной x пишется не значение, а 0.NaN.

Помогите, пожалуйста, заставить фильтр работать.

Изменено пользователем YDM86

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте! Вопрос ламмерский, но по теме.Не получается воспользоваться рассчитанным в системе filter solution 10.0 полосовым(band pass) цифровым фильтром на 22Гц с полосой 4 Гц 6 порядка. Я пользуюсь микроконтроллером, программирую его на Си. Т.е. взял Си-код(файл DigFil1.c), сгенерированный вышеуказанной программой, присоединил его к своему проекту. Проинициализировал, т.е. написал в начале программы x=DigFil(0,1); Далее пытаюсь снимать с АЦП показания(частота дискретизации соответствует указанной в программке), передавать их на функцию фильтра: x=DigFil(data,0);

Но х оказывается неопределён. При отладке напротив переменной x пишется не значение, а 0.NaN.

Помогите, пожалуйста, заставить фильтр работать.

мож вы код выложите?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте! Вопрос ламмерский, но по теме.Не получается воспользоваться рассчитанным в системе filter solution 10.0 полосовым(band pass) цифровым фильтром на 22Гц с полосой 4 Гц 6 порядка. Я пользуюсь микроконтроллером, программирую его на Си. Т.е. взял Си-код(файл DigFil1.c), сгенерированный вышеуказанной программой, присоединил его к своему проекту. Проинициализировал, т.е. написал в начале программы x=DigFil(0,1); Далее пытаюсь снимать с АЦП показания(частота дискретизации соответствует указанной в программке), передавать их на функцию фильтра: x=DigFil(data,0);

Но х оказывается неопределён. При отладке напротив переменной x пишется не значение, а 0.NaN.

Помогите, пожалуйста, заставить фильтр работать.

:wacko: ээээ... код в студию. Причем в каком смысле не определен? Что содержится в переменной? Окончания переходного процесса дождались? Кстати, не помню, что там генерит filter solution может там нерабочий код - в смысле только массивы без кольцевой адресации, по-позже - гляну...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Код (тот, что создал filter solution):

 

/******************************************************************************/

/* Filter Solutions Version 10.0 Nuhertz Technologies, L.L.C. */

/* www.nuhertz.com */

/* +1 602-206-7781 */

/* 6th Order Band Pass Butterworth */

/* Bilinear Transformation with Prewarping */

/* Sample Frequency = 2.000 KHz */

/* Standard Form */

/* Arithmetic Precision = 4 Digits */

/* */

/* Lower Corner Frequency = 20.00 Hz */

/* Upper Corner Frequency = 24.00 Hz */

/* */

/******************************************************************************/

/* */

/* Input Variable Definitions: */

/* Inputs: */

/* invar float The input to the filter */

/* setic int 1 to initialize the filter to zero */

/* */

/* There is no requirement to ever initialize the filter. */

/* The default initialization is zero when the filter is first called */

/* */

/******************************************************************************/

/* */

/* This software is automatically generated by Filter Solutions. There are */

/* no restrictions from Nuhertz Technologies, L.L.C. regarding the use and */

/* distributions of this software. */

/* */

/******************************************************************************/

double DigFil(invar, setic)

double invar; int setic;

{

float sumnum, sumden; int i;

static float delay[13] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};

static float znum[13] = {

6.006e-14,

0.0,

-3.603e-13,

0.0,

9.009e-13,

0.0,

-1.201e-12,

0.0,

9.009e-13,

0.0,

-3.603e-13,

0.0,

6.006e-14

};

static float zden[12] = {

.9526,

-11.45,

63.11,

-210.9,

475.9,

-764.1,

894.8,

-770.3,

483.7,

-216.1,

65.19,

-11.92

};

if (setic==1){

for (i=0;i<=12;i++) delay = 9.045e+13*invar;

return 0.0;

}

else{

sumden=0.0;

sumnum=0.0;

for (i=0;i<=11;i++){

delay = delay[i+1];

sumden += delay*zden;

sumnum += delay*znum;

}

delay[12] = invar-sumden;

sumnum += delay[12]*znum[12];

return sumnum;

}

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По-идее фильтр правильный. На всякий случай перенесите его в проект для написания программ под ПК (code::blocks GCC, MSVS - что милее) и прогоните через него тестовую синусоиду - посмотрите что выйдет. Но вообще-то это классика и врядли там программный глюк. Вот только float меня пугает. 22 Hz - это 44 Hz сэмплирования как минимум. 32умножения*44 отсчета = 1048 операций с float в секунду как минимум. Для 8-и битного контроллера может оказаться не по силам.

Что за контроллер и какова тактовая?

 

Кстати, вот - бесплатный пакет по расчету цифровых фильтров для float и int с возможностью удобного сохранения результатов и генерации (пусть и не оптимизированных аппаратно) исходников на *.c и *.vhdl...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Контроллер 32-битный(AT91SAM7S) Частота сэмплирования(дискретизации) 2000 Гц. Тактовая частота контроллера 48МГц, у АЦП - 4 МГц. Вопрос такой: при инициализации цифрового фильтра - правильно ли то, что я делаю операцию x=DigFil(0,1); причём 1 раз. Это именно то, что называется "инициализация фильтра нулями", насколько я вижу, или всё-таки не совсем?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Контроллер 32-битный(AT91SAM7S) Частота сэмплирования(дискретизации) 2000 Гц. Тактовая частота контроллера 48МГц, у АЦП - 4 МГц. Вопрос такой: при инициализации цифрового фильтра - правильно ли то, что я делаю операцию x=DigFil(0,1); причём 1 раз. Это именно то, что называется "инициализация фильтра нулями", насколько я вижу, или всё-таки не совсем?

:biggrin: Я вообще не догнал, что создатели FS имели ввиду применяя эту инициализацию. В линию задержки чтоли фильтр превращается. А если Вы имели ввиду очистку виртуального кольцевого буфера - то в C стандарт что все переменные типа static инициализируются 0-ми сразу при создании.

 

Наверно это режим сброса(обнуления) буфера. Мож где-то кому то он и пригодится но не Вам в данной ситуации. Можно не сбрасывать вообще.

 

P.S.: какой необычный по-параметрам фильтр и необычный процессор для него. Медицина?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Контроллер 32-битный(AT91SAM7S) Частота сэмплирования(дискретизации) 2000 Гц. Тактовая частота контроллера 48МГц, у АЦП - 4 МГц.

:07: Стоп...хлещу себя ушами по щекам за то, что не посмотрел в первый раз.

 

2000 Hz * 20 перемножений * 100 (приблизительно для float) ~ 40 MIPS на фильтр. А он его успевает отрабатывать??? Как Вы это проверяете?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

:07: Стоп...хлещу себя ушами по щекам за то, что не посмотрел в первый раз.

 

2000 Hz * 20 перемножений * 100 (приблизительно для float) ~ 40 MIPS на фильтр. А он его успевает отрабатывать??? Как Вы это проверяете?

 

Область применения - просто регистрация сигнала определённой частоты(обнаружение передатчика, но надо ещё организовать и счёт импульсов, для этого и цифровой фильтр). Человек, который формально числится моим научным руководителем, сказал: "А давай ещё и цифровой фильтр попробуем". Он сам уже такую штуку делал, на таком же контроллере, говорит, что успевает контроллер по идее.(у него успевал). Консультировать меня подробно ему не хочется почему-то. :(

Но! Пытаюсь отлаживать с помощью Debugger, так в эту функцию(DigFil) он не может зайти и значение её посчитать - даже разово, а не с частотой сколько-то там Гц. Что подозрительно и неясно, почему.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Область применения - просто регистрация сигнала определённой частоты(обнаружение передатчика, но надо ещё организовать и счёт импульсов, для этого и цифровой фильтр). Человек, который формально числится моим научным руководителем, сказал: "А давай ещё и цифровой фильтр попробуем". Он сам уже такую штуку делал, на таком же контроллере, говорит, что успевает контроллер по идее.(у него успевал). Консультировать меня подробно ему не хочется почему-то. :(

Но! Пытаюсь отлаживать с помощью Debugger, так в эту функцию(DigFil) он не может зайти и значение её посчитать - даже разово, а не с частотой сколько-то там Гц. Что подозрительно и неясно, почему.

ОК, вечером, если освобожусь вставлю ее в свой тест. Со скоростью отработки у меня большие сомнения тоже... вобщем гляну, уточню.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...