Есть несколько фильтров, которые можно использовать, и фактический выбор фильтра будет зависеть от того, чего вы пытаетесь достичь.Поскольку вы упомянули фильтры Баттерворта, Чебышева и Эллиптика, я предполагаю, что вы ищете фильтры БИХ в целом.
Википедия - хорошее место, чтобы начать читать о различных фильтрах и о том, что они делают.Например, Баттерворта является максимально плоским в полосе пропускания, а отклик падает в полосе останова.В Чебышеве вы получаете плавный отклик либо в полосе пропускания (тип 2), либо в полосе останова (тип 1), но и более сильные нерегулярные колебания в другом и, наконец, в фильтрах Elliptical В обеих группах есть рябь.Следующее изображение взято из википедии .
![enter image description here](https://i.stack.imgur.com/dgnbd.png)
Итак, во всех трех случаях вы должны обменять что-то на что-то другое.В Баттерворте у вас нет пульсаций, но частотная характеристика снижается медленнее.На приведенном выше рисунке требуется от 0.4
до 0.55
, чтобы получить половину мощности.В Чебышеве вы получаете более крутой спад, но вы должны допускать неравномерную и более сильную рябь в одной из полос, а в Эллиптической вы получаете почти мгновенную отсечку, но у вас есть колебания в обеих полосах.
Выбор фильтра будет полностью зависеть от вашего приложения.Вы пытаетесь получить чистый сигнал практически без потерь?Тогда вам нужно что-то, что дает вам плавный отклик в полосе пропускания (Butterworth / Cheby2).Вы пытаетесь убить частоты в полосе задержания, и вы не будете возражать против незначительной потери в отклике в полосе пропускания?Тогда вам понадобится что-то гладкое в стоп-полосе (Cheby1).Нужны ли вам очень острые углы среза, т. Е. Что-либо, выходящее за пределы полосы пропускания, пагубно для вашего анализа?Если это так, вы должны использовать эллиптические фильтры.
Что нужно помнить о фильтрах БИХ, так это то, что у них есть полюса.В отличие от КИХ-фильтров, где вы можете увеличить порядок фильтра с единственным последствием, являющимся задержкой фильтра, увеличение порядка БИХ-фильтров сделает фильтр нестабильным.Под нестабильным я имею в виду, что у вас будут столбы, которые лежат вне круга юнитовЧтобы понять, почему это так, вы можете прочитать вики-статьи о БИХ-фильтрах , особенно о стабильности.
Чтобы проиллюстрировать мою точку зрения, рассмотрим следующий полосовой фильтр.
fpass=[0.05 0.2];%# passband
fstop=[0.045 0.205]; %# frequency where it rolls off to half power
Rpass=1;%# max permissible ripples in stopband (dB)
Astop=40;%# min 40dB attenuation
n=cheb2ord(fpass,fstop,Rpass,Astop);%# calculate minimum filter order to achieve these design requirements
[b,a]=cheby2(n,Astop,fstop);
Теперь, если вы посмотрите на диаграмму нулевого полюса, используя zplane(b,a)
, вы увидите, что есть несколько полюсов (x
), лежащих вне круга, что делает этот подход неустойчивым.
![enter image description here](https://i.stack.imgur.com/ZxzZS.jpg)
, и это видно из того факта, что частотный отклик - это все haywire.Используйте freqz(b,a)
, чтобы получить следующее
![enter image description here](https://i.stack.imgur.com/MGqZ7.jpg)
Чтобы получить более стабильный фильтр с вашими точными требованиями к дизайну, вам нужно будет использовать фильтры второго порядка, используя метод z-p-k
вместо b-a
в MATLAB.Вот как для того же фильтра, что и выше:
[z,p,k]=cheby2(n,Astop,fstop);
[s,g]=zp2sos(z,p,k);%# create second order sections
Hd=dfilt.df2sos(s,g);%# create a dfilt object.
Теперь, если вы посмотрите на характеристики этого фильтра, вы увидите, что все полюса лежат внутри единичного круга (следовательно, стабильны) и соответствуют дизайнутребования
![enter image description here](https://i.stack.imgur.com/MCnYD.jpg)
![enter image description here](https://i.stack.imgur.com/Ve8MI.jpg)
Подход аналогичен для butter
и ellip
, с эквивалентными buttord
и ellipord
.В документации MATLAB также есть хорошие примеры проектирования фильтров.Вы можете использовать эти и мои примеры для разработки фильтра в соответствии с вашими потребностями.
Чтобы использовать фильтр для ваших данных, вы можете выполнить filter(b,a,data)
или filter(Hd,data)
в зависимости от того, какой фильтр вы в конечном итоге используете,Если вы хотите нулевого фазового искажения, используйте filtfilt
.Однако, это не принимает dfilt
объекты.Для фильтрации нулевой фазы с Hd
используйте файл filtfilthd
, доступный на сайте обмена файлами Mathworks
EDIT
Это ответ на комментарий @ DarenW. Сглаживание и фильтрация - это две разные операции, и хотя в некоторых отношениях они похожи (скользящее среднее - это фильтр нижних частот), вы не можете просто заменить одно на другое, если только вы не уверены, что оно не будет озабоченность в конкретном приложении.
Например, реализация предложения Дарена о линейном ЛЧМ-сигнале от 0-25 кГц, дискретизированном при 100 кГц, это частотный спектр после сглаживания с помощью гауссовского фильтра
![enter image description here](https://i.stack.imgur.com/8GPaw.jpg)
Конечно, дрейф около 10 Гц почти равен нулю. Однако операция полностью изменила природу частотных составляющих в исходном сигнале. Это расхождение возникает из-за того, что они полностью игнорировали спад операции сглаживания (см. Красную линию) и предполагали, что это будет плоский ноль. Если бы это было правдой, то вычитание сработало бы. Но, увы, это не тот случай, поэтому существует целое поле для разработки фильтров.