(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Практика использования цифровых фильтров

Источник: habrahabr
cyber_genius

Делаю тут проект и возникла вот какая проблема. Получаю данные с АЦП (дельта-сигма) микросхемы в которую встроен контроллер и фильтр, но этот фильтр имеет довольно убогую АЧХ, в итоге идёт завал по ВЧ от 60Гц и далее. Выглядит это примерно так:
image

Т.е. такая неравномерность АЧХ нас явно не устраивает (не проходит по техническим требованиям), правда есть возможность повысить частоту дискретизации с 250Гц до 500Гц, чтобы выровнять АЧХ, однако тогда увеличивается объём данных который ещё нужно будет усреднять, что скажется на производительности (проект на STM32F103VE) системы в целом и на общем потреблении энергии (батарейное питание). Но есть и другой путь.

Можно выровнять АЧХ с помощью параметрического цифрового фильтра, в данном случае ВЧ. То есть это тоже самое что эквалайзер, мы поднимаем одни частоты, а другие не трогаем (или заваливаем). Такой метод конечно хорош, но т.к. мы пытаемся восстановить информацию, часть которой была уничтожена другим фильтром на входе (тот что в микросхеме), неизбежно увеличится уровень помех на высоких частотах, т.к. вместе с сигналом мы усилим также и их, но вот насколько?

Итак, идея решения проблемы есть, осталась реализация. Что мы помним о цифровых фильтрах (к тем кто не имел с ними практики) из университетского курса? Разве что такие слова как свёртка, Z-преобразование, импульсная характеристика и т.д. В общем не понятно с какого конца подходить даже, вроде надо какие-то коэффициенты рассчитывать, но что и зачем непонятно, поднимать курс и сидеть с книгами по ЦОС (есть одна на 800 страниц) нет времени, проект стоит и надо что-то делать, и быстро.

Поэтому немного погуглив находим вот такой ресурс в интернете. Это сайт по расчёту цифровых фильтров (и не только!) он-лайн, а сделал его некий Dr Anthony J. Fisher.

Итак задаёмся требованиями которые нам нужны и вводим на сайте. Во-первых, нам нужна плавная характеристика, поэтому однозначно Баттерворт первого порядка ВЧ (highpass). Во-вторых, sample rate, т.е. количество преобразований АЦП в секунду, или частота дискретизации, у нас это 250Гц. Вводим. И наконец, в-третьих, частота среза (-3дБ) - 50Гц, т.к. фильтр на входе режет примерно здесь. Нажимаем отправить и получаем вот такую характеристику нашего будущего фильтра:
image
Красным представлен график амплитуды от частоты Найквиста, синим изменение фазы. 0,5 соответствует половине частоты дискретизации.

Также получаем С код с рассчитанными коэффициентами:

#define NZEROS 1
#define NPOLES 1
#define GAIN   1.726542528e+00

static float xv[NZEROS+1], yv[NPOLES+1];

static void filterloop()
  { for (;;)
      { xv[0] = xv[1]; 
        xv[1] = next input value / GAIN;
        yv[0] = yv[1]; 
        yv[1] =   (xv[1] - xv[0])
                     + (  0.1583844403 * yv[0]);
        next output value = yv[1];
      }
  }

Но это только фильтр, помним, что нам нужно усилить частоты от 50Гц и выше, чтобы выпрямить АЧХ, и эта функция в таком виде нам не поможет, поэтому путём нехитрых манипуляций приводим функцию к такому виду:
#define NZEROS 1
#define NPOLES 1
#define GAIN   1.726542528e+00F
#define OUR_GAIN 2.1F		// наш коэф. усиления фильтра

float xv[NZEROS+1], yv[NPOLES+1];

int void filterloop( int data )
{ 
    xv[0] = xv[1]; 
    xv[1] = (float)data / GAIN;
    yv[0] = yv[1]; 
    yv[1] = ( xv[1] - xv[0] ) + ( 0.1583844403F * yv[0] );
    return (int)(( yv0[1] * OUR_GAIN ) + (float)data );
}


Всё. Чтобы использовать фильтр кидаем данные в параметры функции, а возвращает она отфильтрованные данные. Коэффициент усиления OUR_GAIN подбираем опытным путём, снимая показания с АЦП и замеряя АЧХ. 

Таким образом мне удалось поднять АЧХ практически без дополнительной нагрузки на контроллер и мой проект прошёл по техническим требованиям (в медицинской области они весьма не хилые). Я боялся, что сильно возрастёт уровень помех, но он увеличился с 4-5мкВ примерно до 6-8мкВ, что нас устраивает. В заключении могу порекомендовать ещё одну бесплатную программу по расчёту цифровых фильтров - WinFilter, скачать её можно здесь. Насколько она работоспособна не знаю, не проверял, но она может выдавать код в VHDL (и в С естественно), что наверняка пригодится для ПЛИС. Также есть программа от Texas Instuments, по расчёту коэффициентов цифровых фильтров, называется она TIBQ. Всё. Удачи в проектировании цифровых фильтров.

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 31.07.2012 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Stimulsoft Reports Server Team 10 users
Quest Software. Toad for DBA Suite for Oracle
VMware Workstation Pro 12 for Linux and Windows, ESD
Allround Automation Direct Oracle Access Standard license
Microsoft Office 365 для Дома 32-bit/x64. 5 ПК/Mac + 5 Планшетов + 5 Телефонов. Подписка на 1 год.
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
СУБД Oracle "с нуля"
Программирование на Visual Basic/Visual Studio и ASP/ASP.NET
Windows и Office: новости и советы
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100