Как применить биномиальный фильтр нижних частот к данным в массиве NumPy? - PullRequest
0 голосов
/ 22 мая 2019

Я должен применить «биномиальный фильтр нижних частот» к данным, указанным в NumPy numpy.ndarray.

Однако я не смог найти ничего подобного в https://docs.scipy.org/doc/scipy/reference/signal.html Что мне здесь не хватает?Это должна быть простая базовая операция, верно?

1 Ответ

1 голос
/ 22 мая 2019

Биномиальный фильтр - это КИХ-фильтр , коэффициенты которого можно сгенерировать, взяв строку из Треугольника Паскаля .Быстрый способ («быстрый», как в одной строке кода - не обязательно самый эффективный) - с помощью numpy.poly1d:

In [15]: np.poly1d([1, 1])**2                                                   
Out[15]: poly1d([1, 2, 1])

In [16]: np.poly1d([1, 1])**3                                                   
Out[16]: poly1d([1, 3, 3, 1])

In [17]: np.poly1d([1, 1])**4                                                   
Out[17]: poly1d([1, 4, 6, 4, 1])

Чтобы использовать набор этих коэффициентов в качестве фильтра нижних частот,значения должны быть нормированными, поэтому сумма равна единице.Сумма коэффициентов np.poly1d([1, 1])**n равна 2**n, поэтому мы можем разделить полученный результат на 2**n.В качестве альтернативы, мы можем сгенерировать коэффициенты, которые уже нормализованы, задав numpy.poly1d [1/2, 1/2] вместо [1, 1] (т.е. начать с нормализованного набора из двух коэффициентов).Эта функция генерирует коэффициенты фильтра для заданного n:

def binomcoeffs(n): 
    return (np.poly1d([0.5, 0.5])**n).coeffs

Например,

In [35]: binomcoeffs(3)                                                         
Out[35]: array([0.125, 0.375, 0.375, 0.125])

In [36]: binomcoeffs(5)                                                         
Out[36]: array([0.03125, 0.15625, 0.3125 , 0.3125 , 0.15625, 0.03125])

In [37]: binomcoeffs(15)                                                        
Out[37]: 
array([3.05175781e-05, 4.57763672e-04, 3.20434570e-03, 1.38854980e-02,
       4.16564941e-02, 9.16442871e-02, 1.52740479e-01, 1.96380615e-01,
       1.96380615e-01, 1.52740479e-01, 9.16442871e-02, 4.16564941e-02,
       1.38854980e-02, 3.20434570e-03, 4.57763672e-04, 3.05175781e-05])

К применить фильтр к сигналу, использовать свертка .Доступно несколько дискретных функций свертки, включая numpy.convolve, scipy.signal.convolve, scipy.ndimage.convolve1d.Вы также можете использовать scipy.signal.lfilter (дать коэффициенты в качестве аргумента b и установить a=1).

Для конкретных примеров посмотрите "Применение FIRfilter ", небольшая статья, которую я написал несколько лет назад (и с тех пор редактировал другие).Обратите внимание, что сроки, показанные в этой статье, могут быть не актуальными.Код в NumPy и SciPy постоянно развивается.Если вы запустите эти сценарии сейчас, вы можете получить совершенно другие результаты.

...