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