Высокочастотная фильтрация в MATLAB - PullRequest
25 голосов
/ 08 апреля 2011

Кто-нибудь знает, как использовать фильтры в MATLAB? Я не поклонник, поэтому меня не интересуют характеристики спада и т. Д. - у меня есть одномерный вектор сигнала x, сэмплированный с частотой 100 кГц, и я хочу выполнить фильтрацию верхних частот на нем (скажем, отклонить что-либо ниже 10 Гц ) для удаления дрейфа базовой линии.

В справке описаны фильтры Баттерворта, Эллиптика и Чебычева, но нет простого объяснения того, как их реализовать.

Ответы [ 3 ]

48 голосов
/ 08 апреля 2011

Есть несколько фильтров, которые можно использовать, и фактический выбор фильтра будет зависеть от того, чего вы пытаетесь достичь.Поскольку вы упомянули фильтры Баттерворта, Чебышева и Эллиптика, я предполагаю, что вы ищете фильтры БИХ в целом.

Википедия - хорошее место, чтобы начать читать о различных фильтрах и о том, что они делают.Например, Баттерворта является максимально плоским в полосе пропускания, а отклик падает в полосе останова.В Чебышеве вы получаете плавный отклик либо в полосе пропускания (тип 2), либо в полосе останова (тип 1), но и более сильные нерегулярные колебания в другом и, наконец, в фильтрах Elliptical В обеих группах есть рябь.Следующее изображение взято из википедии .

enter image description here

Итак, во всех трех случаях вы должны обменять что-то на что-то другое.В Баттерворте у вас нет пульсаций, но частотная характеристика снижается медленнее.На приведенном выше рисунке требуется от 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

, и это видно из того факта, что частотный отклик - это все haywire.Используйте freqz(b,a), чтобы получить следующее

enter image description here

Чтобы получить более стабильный фильтр с вашими точными требованиями к дизайну, вам нужно будет использовать фильтры второго порядка, используя метод 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

enter image description here

Подход аналогичен для 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

Конечно, дрейф около 10 Гц почти равен нулю. Однако операция полностью изменила природу частотных составляющих в исходном сигнале. Это расхождение возникает из-за того, что они полностью игнорировали спад операции сглаживания (см. Красную линию) и предполагали, что это будет плоский ноль. Если бы это было правдой, то вычитание сработало бы. Но, увы, это не тот случай, поэтому существует целое поле для разработки фильтров.

7 голосов
/ 08 апреля 2011

Создайте свой фильтр - например, используя [B,A] = butter(N,Wn,'high'), где N - порядок фильтра - если вы не уверены, что это, просто установите его на 10. Wn - частота среза, нормализованная между 0 и 1, с 1, соответствующимдо половины частоты дискретизации сигнала.Если ваша частота дискретизации равна fs, и вы хотите установить частоту среза 10 Гц, вам необходимо установить Wn = (10/(fs/2)).

. Затем вы можете применить фильтр, используя Y = filter(B,A,X), где X - ваш сигнал.Вы также можете посмотреть на функцию filtfilt.

0 голосов
/ 08 апреля 2011

Дешевый способ сделать этот вид фильтрации, который не требует напряжения мозговых клеток на дизайне, нулях и полюсах, пульсации и всего этого, это:

* Make a copy of the signal
* Smooth it.   For a 100KHz signal and wanting to eliminate about 10Hz on down, you'll need to smooth over about 10,000 points.   Use a Gaussian smoother, or a box smoother maybe 1/2 that width twice, or whatever is handy.  (A simple box smoother of total width 10,000 used once may produce unwanted edge effects)
* Subtract the smoothed version from the original.  Baseline drift will be gone.

Если исходный сигнал spikey,Вы можете использовать короткий медианный фильтр перед большим сглаживателем.

Это легко обобщает 2D-изображения, объемные данные 3D, что угодно.

...