|
|
  |
расчет цифровых фильтров, расчет цифровых фильтров |
|
|
|
Jun 2 2008, 08:51
|
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jun 2 2008, 09:00
|

Местный
  
Группа: Свой
Сообщений: 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. Помогите, пожалуйста, заставить фильтр работать. мож вы код выложите?
|
|
|
|
|
Jun 2 2008, 09:15
|

山伏
    
Группа: Свой
Сообщений: 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. Помогите, пожалуйста, заставить фильтр работать.  ээээ... код в студию. Причем в каком смысле не определен? Что содержится в переменной? Окончания переходного процесса дождались? Кстати, не помню, что там генерит filter solution может там нерабочий код - в смысле только массивы без кольцевой адресации, по-позже - гляну...
--------------------
Нас помнят пока мы мешаем другим... //-------------------------------------------------------- Хороший блатной - мертвый... //-------------------------------------------------------- Нет старик, это те дроиды которых я ищу...
|
|
|
|
|
Jun 2 2008, 09:39
|
Группа: Участник
Сообщений: 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; } }
|
|
|
|
|
Jun 2 2008, 11:08
|
Группа: Участник
Сообщений: 12
Регистрация: 30-10-07
Пользователь №: 31 878

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

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

|
Цитата(YDM86 @ Jun 2 2008, 14:08)  Контроллер 32-битный(AT91SAM7S) Частота сэмплирования(дискретизации) 2000 Гц. Тактовая частота контроллера 48МГц, у АЦП - 4 МГц. Вопрос такой: при инициализации цифрового фильтра - правильно ли то, что я делаю операцию x=DigFil(0,1); причём 1 раз. Это именно то, что называется "инициализация фильтра нулями", насколько я вижу, или всё-таки не совсем?  Я вообще не догнал, что создатели FS имели ввиду применяя эту инициализацию. В линию задержки чтоли фильтр превращается. А если Вы имели ввиду очистку виртуального кольцевого буфера - то в C стандарт что все переменные типа static инициализируются 0-ми сразу при создании. Наверно это режим сброса(обнуления) буфера. Мож где-то кому то он и пригодится но не Вам в данной ситуации. Можно не сбрасывать вообще. P.S.: какой необычный по-параметрам фильтр и необычный процессор для него. Медицина?
--------------------
Нас помнят пока мы мешаем другим... //-------------------------------------------------------- Хороший блатной - мертвый... //-------------------------------------------------------- Нет старик, это те дроиды которых я ищу...
|
|
|
|
|
Jun 3 2008, 03:57
|
Группа: Участник
Сообщений: 12
Регистрация: 30-10-07
Пользователь №: 31 878

|
Цитата(DRUID3 @ Jun 2 2008, 20:53)   Стоп...хлещу себя ушами по щекам за то, что не посмотрел в первый раз. 2000 Hz * 20 перемножений * 100 (приблизительно для float) ~ 40 MIPS на фильтр. А он его успевает отрабатывать??? Как Вы это проверяете? Область применения - просто регистрация сигнала определённой частоты(обнаружение передатчика, но надо ещё организовать и счёт импульсов, для этого и цифровой фильтр). Человек, который формально числится моим научным руководителем, сказал: "А давай ещё и цифровой фильтр попробуем". Он сам уже такую штуку делал, на таком же контроллере, говорит, что успевает контроллер по идее.(у него успевал). Консультировать меня подробно ему не хочется почему-то.  Но! Пытаюсь отлаживать с помощью Debugger, так в эту функцию(DigFil) он не может зайти и значение её посчитать - даже разово, а не с частотой сколько-то там Гц. Что подозрительно и неясно, почему.
|
|
|
|
|
Jun 3 2008, 12:36
|

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

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