【问题标题】:Applying scipy filter to multidimensional data将 scipy 过滤器应用于多维数据
【发布时间】:2020-03-08 03:52:32
【问题描述】:

我有立体声音频数据,由形状为(2500, 2) 的 numpy 数组表示。我想使用 scipy 的 signal.sosflt() 函数对其进行过滤,但我得到了:

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=-1axis=1,但它们都不正确。)

【问题讨论】:

    标签: numpy scipy signal-processing


    【解决方案1】:

    一个解决方案,但可能不是最干净的:

    由于源数据是立体声,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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-05
      • 1970-01-01
      • 1970-01-01
      • 2015-04-30
      • 2018-05-29
      • 2020-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多