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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Создание фильтра в MATLAB и его реальное применение
sidy
сообщение Feb 18 2013, 14:47
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333



Здравствуйте, уважаемые форумчане. В MATLAB в утилите FDATool я выбрал фильтр Баттерворта 2ого порядка, частоту среза 50 Гц, частоту дескритизации 5000 Гц и расчитал коэффициенты фильтра. После этого выполнил Convert To Single Section. Получил следующие коэффициенты:
numerator:
0.0009446918438402,
0.00188938368768,
0.0009446918438402

denominator:
1,
-1.911197067426,
0.9149758348014

Могу ли я использовать эти коэффициенты для построения фильтра в цифровом сигнальном процессоре для фильтрации входного сигнала с АЦП (входная шкала напряжения от 0 до 4096)? Или я должен сделать еше какието манипуляции с данными коэффциентами?
Т.к. используя эти коэффициенты, получаю нулевой сигнал. Посмотрев коэффициенты фильтров в различной литературе, заметил что они близки к 1 или 2. А у меня коэффициенты b получились очень маленькими.

Сообщение отредактировал sidy - Feb 18 2013, 15:09
Go to the top of the page
 
+Quote Post
V_G
сообщение Feb 18 2013, 23:25
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Это распространенная проблема БИХ-фильтров - существенно отличающиеся коэффициенты а и b, не вписывающиеся в точность целочисленных DSP. Борьба с этим - в грамотном разбиении на секции, матлаб на вашей задаче вполне с этим справляется, вы зря сделали Convert To Single Section. Либо повторите расчет, либо сделайте обратно Convert to Second-Order Sections. Там вполне нормальные коэффициенты. Просто отмасштабируйте их до диапазона работы вашего конкретного DSP (умножьте все на степень двойки)
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Feb 20 2013, 02:23
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



Если ДСП fixed-poin, то необходимо конвертировать коэффициенты в целочисленный вид
Go to the top of the page
 
+Quote Post
sidy
сообщение Feb 27 2013, 07:02
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333



Цитата(V_G @ Feb 19 2013, 03:25) *
Либо повторите расчет, либо сделайте обратно Convert to Second-Order Sections. Там вполне нормальные коэффициенты. Просто отмасштабируйте их до диапазона работы вашего конкретного DSP (умножьте все на степень двойки)

Да спасибо очень помогло. Получил следующие коэффициенты для Low-Pass фильтра:
ACoef[3]={1, -1.911197067426073, 0.914975834801434};
BCoef[3]={1, 2, 1};
Только в Matlab fdatool я получил фазовый сдвиг выходного сигнала относительно входного 90 гр, а в моем DSP фазовый сдвиг 270 гр. Непонятно с чем это связано.

Теперь мне нужен еще один фильтр - High-Pass для фильтрации постоянной составляющей, т.е. сигналы с частотой около 0 Гц. В Matlab fdatool я рассчитал коэффициенты High-Pass фильтра Баттерворта второго порядка:
ACoef_HP[3]={1, -1.998222847291842, 0.9982244250264};
BCoef_HP[3]={1, -2, 1};
и промоделировал прохождение сигнала через него в Simulink - фазового сдвига сигнала практически не наблюдал. При занесении коэффициентов в DSP выходной сигнал сдвинут относительно входного на 180 гр.

Т.е. мой фильтр вносит сдвиг в 180 гр по-мимо расчетного в Matlab FDATool. Не понятно с чем это связано.

Сообщение отредактировал sidy - Feb 27 2013, 13:39
Go to the top of the page
 
+Quote Post
STAR_IK
сообщение Feb 28 2013, 04:05
Сообщение #5


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

Группа: Свой
Сообщений: 136
Регистрация: 10-04-09
Из: Омск
Пользователь №: 47 461



А вы как смотрите сдвиг? Это похоже на простую инверсию, возникающую на определенном этапе обработки, а фильтр может быть и ни при чем.
Go to the top of the page
 
+Quote Post
sidy
сообщение Feb 28 2013, 04:38
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333



Цитата(STAR_IK @ Feb 28 2013, 08:05) *
А вы как смотрите сдвиг? Это похоже на простую инверсию, возникающую на определенном этапе обработки, а фильтр может быть и ни при чем.

Да, это была моя ошибка - фильтр тут не причем.
Go to the top of the page
 
+Quote Post
sidy
сообщение Apr 16 2013, 12:18
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333



У меня возник еще один вопрос. Теперь мне необходим фильтр Баттерворта 3ого порядка, с частотой среза 50 Гц и частотой дескритизации 5000 Гц. Я вновь рассчитал коэффициенты в Matlab Fdatool и получил не совсем понятный мне набор коэффициентов, т.е. их больше четырех для A и B (см. рис.) и не понятно как с ними работать.
Прикрепленное изображение

Если я делаю Convert to Single section, то получаю нужное количество коэффициентов A и B - по четыре на каждый, но коэффициенты B получаются очень маленькими, о чем уже обсуждалось выше. Теперь вопрос можно ли каким-то образом преобразовать коэффициенты A и B что использовать их в DSP&
Go to the top of the page
 
+Quote Post
Alexey K
сообщение Apr 16 2013, 13:13
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 14-07-11
Пользователь №: 66 220



Два фильтра 2-го порядка
Go to the top of the page
 
+Quote Post
sidy
сообщение May 13 2013, 07:50
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333



Задам еще один вопрос. Столкнулся с непонятной мне вещью: есть два фильтра реализованных на C цифровых фильтра Баттерворта фторого порядка: один НЧ, другой ВЧ. Вот код реализации
Код
//*Фильтр Баттерворта 2ого порядка Low-Pass-------------------------------------------------    
    //Сдвигаем старые значения
    for(n=2; n>0; n--){
        x[n]=x[n-1];
        y[n]=y[n-1];
    }
    //Вычисляем новое выходное значение
    x[0]=NewSample;
    y[0]=BCoef[0]*x[0];
    for(n=1; n<=2; n++)
        {y[0]+=(BCoef[n]*x[n])-(ACoef[n]*y[n]);}    
//*Фильтр Баттерворта 2ого порядка High-Pass-------------------------------------------------
    //Сдвигаем старые значения
    for(n=2; n>0; n--){
        x_HP[n]=x_HP[n-1];
        y_HP[n]=y_HP[n-1];
    }
    //Вычисляем новое выходное значение
    x_HP[0]=y[0];
    y_HP[0]=BCoef_HP[0]*x_HP[0];
    for(n=1; n<=2; n++)
        {y_HP[0]+=(BCoef_HP[n]*x_HP[n])-(ACoef_HP[n]*y_HP[n]);}
    in_new=y_HP[0];

И есть две среды разработки для STM32: Keil MDK-ARM 4.53.0 и CooCox COIDE 1.7.0. В обоих средах для фильтра используется код приведенный выше.
При использовании для прошивки кода скомпилированного в Keil на выходе ЦАП после фильтрации получаю нормальную синусоиду:
Прикрепленное изображение

А при использовании для прошивки кода скомпилированного в CooCox COIDE на выходе ЦАП получаю сигнал с просечками, которые мешают мне для дальнейшей обработки.
Прикрепленное изображение

С чем все это может быть связано?
Go to the top of the page
 
+Quote Post
sidy
сообщение May 13 2013, 15:21
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333



Прошу прощение, что потревожил техническую общественность. Это была моя ошибка - не имеющая отношения к алгоритму фильтрации.
Go to the top of the page
 
+Quote Post
MSP430F
сообщение Jun 3 2013, 12:48
Сообщение #11


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

Группа: Участник
Сообщений: 85
Регистрация: 20-05-13
Пользователь №: 76 911



Всем доброго времени суток!
Коллеги, помогите!
Рассчитываю в MATLAB цифровой полосовой фильтр Чебышева II рода. Сделал разбиение на секции 2-го порядка, получил в хедере коэффициенты в виде двумерных массивов NUM и DEN. Формулы секций простые, все работает. Озадачился получением стабильной версии в виде одной секции. Порядок фильтра задал 8. Применил Convert Structure... к Lattice Arma, получил стабильный фильтр. Создал сишный хедер и получил два массива.
const int KL = 16;
const real32_T K[16] = {
-0.9990231991, 0.9992837906, -0.9991765022, 0.9989774227, -0.9984907508,
0.9831924438, 0.1230626926, 0.3759146333, -0.7456214428, -0.4113018215,
-0.2647816539, 0.1375903487, 0.199342683, 0.1202145815, 0.0357035771,
0.00457067322
};
const int VL = 17;
const real32_T V[17] = {
3.237323187e-010,8.469006829e-009,-4.508386837e-007,-1.037612128e-005,0.0004177154624,
0.009835269302, 0.04770011082, -0.07836318016, -0.08220990002, 0.04402532056,
0.002590565477, -0.3493199348, -0.3774584234, 0.05220580474, 0.3641556203,
0.2648055255, 0.06757183373
};

Смутило сразу названия массивов. Вместо NUM и DEN какие-то K и V. А потом посмотрел еще структуру этого Lattice Arma и совсем запутался.
Какие формулы надо использовать для этих коэффициентов ???
Поскажите, плиз.
Go to the top of the page
 
+Quote Post
sidy
сообщение Jul 3 2013, 12:37
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333



Назрела необходимость перейти к вычислениям с фиксированной точкой. В связи с этим возник еще один вопрос: как преобразовать мои коэффициенты
ACoef[3]={1, -1.911197067426073, 0.914975834801434};
BCoef[3]={1, 2, 1};
к целочисленным.
Как я понял я должен умножить их на 2^k, где k целые числа; я попробовал промаштабировать исходные коэффициенты умножив на 32767, получил новые коэффициенты, но работа фильтра с новыми коэффициентами существенно изменилась - исчез фазовый сдвиг (90 гр.) и фильтр потерял свои "фильтрующие" свойства. Вопрос: что я сделал неправильно? (Разрядность АЦП 12 бит, разрядность MCU 32 бита).
Go to the top of the page
 
+Quote Post
fontp
сообщение Jul 3 2013, 12:52
Сообщение #13


Эксперт
*****

Группа: Свой
Сообщений: 1 467
Регистрация: 25-06-04
Пользователь №: 183



QUOTE (sidy @ Jul 3 2013, 15:37) *
Назрела необходимость перейти к вычислениям с фиксированной точкой. В связи с этим возник еще один вопрос: как преобразовать мои коэффициенты
ACoef[3]={1, -1.911197067426073, 0.914975834801434};
BCoef[3]={1, 2, 1};
к целочисленным.
Как я понял я должен умножить их на 2^k, где k целые числа; я попробовал промаштабировать исходные коэффициенты умножив на 32767, получил новые коэффициенты, но работа фильтра с новыми коэффициентами существенно изменилась - исчез фазовый сдвиг (90 гр.) и фильтр потерял свои "фильтрующие" свойства. Вопрос: что я сделал неправильно? (Разрядность АЦП 12 бит, разрядность MCU 32 бита).


А как Вы представите 2 с фиксированой запятой 1.15 fixed-point
В 1.15 fixed-point представимы только числа от -1 до 1
Разделите на 2 и числитель и знаменатель и тогда уже... то есть умножайте на 16384

На самом деле в Matlab Filter Design можно включить режим конечной разрядности и он сам посчитает целочисленные ( 1.N fixed-point ) коэфф.,
и покажет частотные и фазовые характеристики с эффектами разрядности
Go to the top of the page
 
+Quote Post
sidy
сообщение Jul 4 2013, 09:34
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333



Вот что у меня получилось:
Код
//float ACoef[3]={1, -1.913780606355776, 0.917346934620046};
//float BCoef[3]={1, 2, 1};
int16_t ACoef[3]={16384, -31355, 15029};
int16_t BCoef[3]={16384, 32767, 16384};
int y[3], x[3];
int16_t NewSample;
  //*Фильтр Баттерворта 2ого порядка Low-Pass-------------------------------------------------
  for(n=2; n>0; n--) {x[n]=x[n-1]; y[n]=y[n-1];} //Сдвигаем старые значения
  //Вычисляем новое выходное значение
  x[0]=NewSample<<4; y[0]=BCoef[0]*x[0];
  y[0]=y[0]>>15;
  for(n=1; n<=2; n++) {y[0]+=(BCoef[n]*x[n])-(ACoef[n]*y[n]);  
  y[0]=y[0]>>15;}

Рассчитал коэффициенты фильтра, умножив, исходные полученные в Matlab на 16384. Также я сдвигаю полученные в 12 битном АЦП отсчеты на 4 влево (x[0]=NewSample<<4;) для приведения к формату Q1.15 и еще сдвигаю рассчитанный выходной сигнал на 15 вправо. После этого вывожу отсчеты на ЦАП. Фильтр не работает т.е. искаженная синусоида проходит без фильтрации и фазовый сдвиг вместо 90гр получился около 5гр (см. рис., входная синусоида желтая).
Прикрепленное изображение

С float арифметикой все работало, один в один как в Matlabe:
Правильная фильтрация:
Прикрепленное изображение

Что я делаю не так?

Сообщение отредактировал sidy - Jul 4 2013, 09:35
Go to the top of the page
 
+Quote Post
bullit
сообщение Aug 3 2013, 21:39
Сообщение #15


пуля
****

Группа: Свой
Сообщений: 674
Регистрация: 10-05-06
Из: Уфа
Пользователь №: 16 959



Простите что вмешиваюсь!
А чем вам float не угодил? СТМки с fpu прекрасно переваривают флоаты. Посмотрите статью http://www.compeljournal.ru/enews/2012/6/3/ особенно раздел с плавающей запятой. Но не вылезайте за границы флоата
Например расчет квадратного корня 14 тактов, проверял, правда вышло 15 тактов))))

Да и ФНЧ + ФВЧ ~ ПФ, не?


Go to the top of the page
 
+Quote Post

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

 


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


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