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

 
 
 
Reply to this topicStart new topic
> расчет цифровых фильтров, расчет цифровых фильтров
Andrew32768
сообщение May 19 2008, 11:57
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 90
Регистрация: 18-06-07
Из: Екатеринбург
Пользователь №: 28 521



Какие существуют программы для расчета коэф. цифровых фильтров?
конкретно интересует, в чем рассчитать целочисленные коэф. для примера цифрового фильтра BLACKFINа, который приведен в VisualDSP, в библиотеке <filter.h>?
Go to the top of the page
 
+Quote Post
stoker
сообщение May 19 2008, 12:01
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 340
Регистрация: 28-11-05
Из: Москва
Пользователь №: 11 469



Цитата(Andrew32768 @ May 19 2008, 15:57) *
Какие существуют программы для расчета коэф. цифровых фильтров?
конкретно интересует, в чем рассчитать целочисленные коэф. для примера цифрового фильтра BLACKFINа, который приведен в VisualDSP, в библиотеке <filter.h>?

Матлаб например, использование FDATool там есть возможность задать целочисленную арифметику. А вообще, кажется подобную тему обсуждали неоднократно, можно поискать.
Go to the top of the page
 
+Quote Post
YDM86
сообщение Jun 2 2008, 08:51
Сообщение #3





Группа: Участник
Сообщений: 12
Регистрация: 30-10-07
Пользователь №: 31 878



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

Сообщение отредактировал YDM86 - Jun 2 2008, 08:52
Go to the top of the page
 
+Quote Post
stoker
сообщение Jun 2 2008, 09:00
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 340
Регистрация: 28-11-05
Из: Москва
Пользователь №: 11 469



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

мож вы код выложите?
Go to the top of the page
 
+Quote Post
DRUID3
сообщение Jun 2 2008, 09:15
Сообщение #5


山伏
*****

Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294



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

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


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post
YDM86
сообщение Jun 2 2008, 09:39
Сообщение #6





Группа: Участник
Сообщений: 12
Регистрация: 30-10-07
Пользователь №: 31 878



Код (тот, что создал 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[i] = 9.045e+13*invar;
return 0.0;
}
else{
sumden=0.0;
sumnum=0.0;
for (i=0;i<=11;i++){
delay[i] = delay[i+1];
sumden += delay[i]*zden[i];
sumnum += delay[i]*znum[i];
}
delay[12] = invar-sumden;
sumnum += delay[12]*znum[12];
return sumnum;
}
}
Go to the top of the page
 
+Quote Post
DRUID3
сообщение Jun 2 2008, 10:53
Сообщение #7


山伏
*****

Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294



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

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


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post
YDM86
сообщение Jun 2 2008, 11:08
Сообщение #8





Группа: Участник
Сообщений: 12
Регистрация: 30-10-07
Пользователь №: 31 878



Контроллер 32-битный(AT91SAM7S) Частота сэмплирования(дискретизации) 2000 Гц. Тактовая частота контроллера 48МГц, у АЦП - 4 МГц. Вопрос такой: при инициализации цифрового фильтра - правильно ли то, что я делаю операцию x=DigFil(0,1); причём 1 раз. Это именно то, что называется "инициализация фильтра нулями", насколько я вижу, или всё-таки не совсем?
Go to the top of the page
 
+Quote Post
DRUID3
сообщение Jun 2 2008, 11:19
Сообщение #9


山伏
*****

Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294



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

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

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

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


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post
DRUID3
сообщение Jun 2 2008, 17:53
Сообщение #10


山伏
*****

Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294



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

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

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


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post
YDM86
сообщение Jun 3 2008, 03:57
Сообщение #11





Группа: Участник
Сообщений: 12
Регистрация: 30-10-07
Пользователь №: 31 878



Цитата(DRUID3 @ Jun 2 2008, 20:53) *
07.gif Стоп...хлещу себя ушами по щекам за то, что не посмотрел в первый раз.

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


Область применения - просто регистрация сигнала определённой частоты(обнаружение передатчика, но надо ещё организовать и счёт импульсов, для этого и цифровой фильтр). Человек, который формально числится моим научным руководителем, сказал: "А давай ещё и цифровой фильтр попробуем". Он сам уже такую штуку делал, на таком же контроллере, говорит, что успевает контроллер по идее.(у него успевал). Консультировать меня подробно ему не хочется почему-то. sad.gif
Но! Пытаюсь отлаживать с помощью Debugger, так в эту функцию(DigFil) он не может зайти и значение её посчитать - даже разово, а не с частотой сколько-то там Гц. Что подозрительно и неясно, почему.
Go to the top of the page
 
+Quote Post
DRUID3
сообщение Jun 3 2008, 12:36
Сообщение #12


山伏
*****

Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294



Цитата(YDM86 @ Jun 3 2008, 06:57) *
Область применения - просто регистрация сигнала определённой частоты(обнаружение передатчика, но надо ещё организовать и счёт импульсов, для этого и цифровой фильтр). Человек, который формально числится моим научным руководителем, сказал: "А давай ещё и цифровой фильтр попробуем". Он сам уже такую штуку делал, на таком же контроллере, говорит, что успевает контроллер по идее.(у него успевал). Консультировать меня подробно ему не хочется почему-то. sad.gif
Но! Пытаюсь отлаживать с помощью Debugger, так в эту функцию(DigFil) он не может зайти и значение её посчитать - даже разово, а не с частотой сколько-то там Гц. Что подозрительно и неясно, почему.

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


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 16th August 2025 - 22:39
Рейтинг@Mail.ru


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