|
Создание фильтра в MATLAB и его реальное применение |
|
|
|
Feb 18 2013, 14:47
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Feb 27 2013, 07:02
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Feb 28 2013, 04:38
|
Местный
  
Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333

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

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

|
Два фильтра 2-го порядка
|
|
|
|
|
May 13 2013, 07:50
|
Местный
  
Группа: Участник
Сообщений: 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 на выходе ЦАП получаю сигнал с просечками, которые мешают мне для дальнейшей обработки.
С чем все это может быть связано?
|
|
|
|
|
Jun 3 2013, 12:48
|
Частый гость
 
Группа: Участник
Сообщений: 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 и совсем запутался. Какие формулы надо использовать для этих коэффициентов ??? Поскажите, плиз.
|
|
|
|
|
Jul 3 2013, 12:52
|

Эксперт
    
Группа: Свой
Сообщений: 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 ) коэфф., и покажет частотные и фазовые характеристики с эффектами разрядности
|
|
|
|
|
Jul 4 2013, 09:34
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Aug 3 2013, 21:39
|

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

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