MATLAB - Входные частоты для дизайна фильтра Баттерворта

У меня трудности с вычислением коэффициентов Баттерворта с помощью функций "buttord" и "butter". Моя цель - отфильтровать шум из временного ряда, который я построил. Временной ряд имеет компонент красного шума и синусоидальный сигнал с частотой 0,3 Гц. Частота дискретизации временного ряда составляет 10 Гц.

Следуя документации по "buttord" http://www.mathworks.com/help/signal/ref/buttord.html я рассчитал [n, Wn] для спецификаций (следуя примеру 1 документации):

Wp = 0.33/(sfreq/2); Ws = 0.37/(sfreq/2);
passripp = 0.1; stopatten = 40;
[n,Wn] = buttord(Wp,Ws,passripp,stopatten);
[b,a] = butter(n,Wn);
y_butter = filter(b,a,timeseries(:,2));

График y_butter со временем просто дает мне ноль везде!

Я попытался использовать 'freqz', чтобы проверить частотную характеристику фильтра (используя 512 выборок):

freqz(b,a,512,sfreq)

чей график показывает, что полоса перехода составляет от 1 до 4 Гц!

Мое понимание за фильтром:

  • сигнал с частотой 0,3 Гц
  • шум при >> 0,3 Гц
  • передать все от 0 до 0,33 Гц
  • ослабить все от 0,36 Гц за

Ваша помощь будет высоко ценится!

Данные можно скачать здесь: http://dl.dropbox.com/u/1918592/detrendedTS.mat Столбец 1 из 'ts' является переменной времени, столбец 2 является переменной данных

Я убрал линейное приближение (Matlab 'detrend'), чтобы убрать часть поведения с красным шумом.

1 ответ

Размещенный вами код генерирует 57-й (!!!!) фильтр порядка для выполнения операции, которую вы хотите сделать. freqz Команда действительно показывает, что этот фильтр действителен, но пытается реализовать такой фильтр высокого порядка напрямую, без предварительного преобразования его в разделы 2-го порядка, используя tf2sosнесомненно, приведет к серьезным численным ошибкам. Вероятно, поэтому вы просто видите нули. Если вы преобразуете коэффициенты фильтра в секции 2-го порядка, а затем каскадируете фильтры, вы должны фактически получить выходные данные фильтра, используя freqz команда.

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

[b,a] = butter(n,cut/(sfreq/2));

... просто выбери n чтобы дать вам необходимый спад (6,12,18 дБ и т. д.). Вы столкнетесь с проблемами только один раз n становится равным примерно 10 при использовании представления данных с двойной точностью, но вы, вероятно, обнаружите, что относительно небольшой порядок фильтров будет выполнять ту работу, которую вы хотите.

Другие вопросы по тегам