Применение фильтра Сципи к многомерным данным - PullRequest
2 голосов
/ 08 марта 2020

У меня есть стереофонические аудиоданные, представленные массивом numpy с формой (2500, 2). Я хотел бы отфильтровать его, используя функцию signal.sosflt() от scipy, но я получаю:

ValueError: Invalid zi shape. With axis=0, an input with shape (2500, 2), and an sos array with 2 sections, zi must have shape (2, 2, 2), got (2, 2).

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

from scipy import signal

def setup():
    zi = None
    # define a narrow band filter centered around 440 Hz.
    sos = signal.butter(2, [438, 442], btype='bandpass', output='sos', fs=48000)

def process(src, dst):
    # src and dst shape = (2500, 0)
    if zi is None:
        zi = signal.sosfilt_zi(sos)  # initialize zi on first buffer
    dst, zi = signal.sosfilt(sos, src, axis=0, zi=zi)

(Примечание: я пробовал axis=-1 и axis=1, но ни один из них не является правильным.)

1 Ответ

0 голосов
/ 08 марта 2020

Решение, но, возможно, не самое чистое:

Поскольку исходные данные являются стереофоническими, sosfilt требуется две копии zi, по одной для каждого канала. Следующее будет работать, но только , если src имеет два столбца:

from scipy import signal

def setup():
    zi = None
    # define a narrow band filter centered around 440 Hz.
    sos = signal.butter(2, [438, 442], btype='bandpass', output='sos', fs=48000)

def process(src, dst):
    # src and dst shape = (2500, 0)
    if zi is None:
        tmp = signal.sosfilt_zi(sos)
        zi = [tmp, tmp]               # assumes source data has two columns
    dst, zi = signal.sosfilt(sos, src, axis=0, zi=zi)

Это работает, но более общее решение инициализирует zi на основе формы источника данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...