Имеет ли Python / Scipy замену firls () (т. Е. Взвешенный метод наименьших квадратов, FIR-фильтр)? - PullRequest
3 голосов
/ 02 апреля 2010

Я портирую код с Matlab на Python и не могу найти замену для функции firls (). Используется для линейного фазового фильтра с конечной импульсной характеристикой (FIR), методом наименьших квадратов.

Я посмотрел на scipy.signal, и ничто там не выглядело так, как будто это сработало бы. Конечно, я смог заменить свои алгоритмы Remember и Freqz, так что это хорошо.

В одном блоге я нашел алгоритм, который реализовал этот фильтр без весов, но мне нужен алгоритм с весами.

Спасибо, Дэвид

Ответы [ 6 ]

2 голосов
/ 08 февраля 2017

Эквивалент firls в python теперь, по-видимому, реализован как часть пакета сигналов: https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.firls.html#scipy.signal.firls

Также я согласен со всем, что было сказано выше в @pev hall, особенно о том, как firls оптимальна во многих ситуациях (например,например, когда общий сигнал-шум оптимизируется для заданного количества нажатий), и чтобы не использовать окно вагона, как он заявил, они вообще не эквивалентны!Как правило, firls превосходит все оконные и частотные методы выборки при проектировании фильтров при разработке традиционных FIR-фильтров.

1 голос
/ 01 апреля 2015

Я нашел реализацию firls (), прикрепленную здесь в билете SciPy 648

Незначительные изменения, чтобы заставить его работать:

  1. Поменяйте местами следующие две строки: bands, desired, weight = array(bands), array(desired), array(weight) if weight==None : weight = ones(len(bands)/2)

  2. импорт корней из numpy вместо scipy.signal

1 голос
/ 09 января 2014

Это сообщение действительно в ответ на

Вы можете попробовать функцию firwin с помощью window = 'boxcar' ...

Не используйте boxcar itозначает отсутствие окна вообще (оно идеально, но работает «идеально» только с бесконечным числом множителей - во времени).Весь смысл использования окна состоит в уменьшении количества множителей, необходимых для получения хорошего затухания в полосе останова.См. Оконная функция

При сравнении фильтров, пожалуйста, используйте шкалу дБ / лог.

Функция Scipy, не имеющая блоков (фильтр наименьших квадратов FIR), является большим ограничением (поскольку она генерируетоптимальный фильтр во многих ситуациях).

REMEZ имеет свое место, но упадок сил является настоящим убийством, когда вы пытаетесь добиться наилучших результатов (а не просто удовлетворяете требованиям некоторых менеджеров).( предупреждение Реализация Scipy Remember может дать усиление в полосе останова - см. График внизу )

Если вы используете python (или вам нужно использовать какое-то окно), я рекомендую использовать окно kasiar, которое получаеточень хорошие результаты и могут быть легко настроены для вашего затухания по сравнению с переходом к требованию умножителей ( затухание (в дБ) = 2,285 * (множители - 1) * pi * ширина + 7,95 ).Его производительность не так хороша, как у первых, но имеет преимущество в том, что он быстр и прост в расчете (отлично, если вы не сохраняете коэффициенты).

1 голос
/ 24 июля 2012

Очевидно, этот пост несколько устарел, но, возможно, для некоторых он все еще интересен:

Я думаю, что в Python есть два почти равных эквивалента:

  • Вы можете попробовать функцию firwin с помощью window = 'boxcar'. Это похоже на Matlab, где fir1 с окном вагона обеспечивает те же (или, по крайней мере, очень похожие результаты), что и firls.
  • Вы также можете попробовать метод firwin2 (метод частотной выборки, аналогичный fir2 в Matlab), снова используя window = 'boxcar'

Я попробовал один пример из справочника Matlab и добился почти идентичных результатов для:

Matlab:

F = [0 0.3  0.4 0.6  0.7 0.9];
A = [0  1   0  0  0.5 0.5];
b = firls(24,F,A,'hilbert');

Python:

F = [0, 0.3,  0.4, 0.6,  0.7, 0.9, 1]
A = [0,  1,   0,  0,  0.5, 0.5, 0]
bb = sig.firwin2( 25, F,A, window='boxcar', antisymmetric=True )

Мне пришлось увеличить порядок до N = 25, а также мне пришлось добавить еще одну точку данных (F = 1, A = 0), на которой настаивал Python; опция antisymmetric = True необходима только для этого особого случая (фильтр Гильберта)

1 голос
/ 03 апреля 2010

Это сообщение в блоге содержит код, подробно описывающий, как использовать scipy.signal для реализации FIR-фильтров.

0 голосов
/ 03 апреля 2010

Маловероятно, что вы найдете именно то, что ищете, уже написанное на Python, но, возможно, на странице справки функции Matlab дается или ссылается на описание алгоритма?

...