【问题标题】:Implementing Blockwise Low-Pass IIR Filter in Python在 Python 中实现分块低通 IIR 滤波器
【发布时间】:2019-09-19 15:12:30
【问题描述】:

这个问题类似于https://dsp.stackexchange.com/questions/60694,但我将其重新定义为 Python 实现问题,以便更符合我正在寻求的解决方案。

我想实现一个低通 IIR 滤波器,它对几乎实时的音频块(每块 441 个数据点 X 100 Hz = 44.1 kHz)进行操作。有很多嗡嗡作响的文物。我希望这与我如何使用 scipy.signal 方法和设置初始条件有关。

首先,我试图根据 DSP 论坛上的对话了解我所做工作背后的理论,但我早就忘记了我的 DSP 大学课程,所以这对我来说没有多大意义。接下来,我尝试了很多很多的代码组合,唯一有效的(没有工件)是函数和参数的非常具体的组合。

Bparam, Aparam = signal.iirfilter(2, 0.020, btype = 'lowpass', analog =
       False, ftype = 'butter')       # 2nd order Butterworth coefficients

Z = signal.lfilter_zi(Bparam, Aparam) # Part of the init conditions calc

IC = Z * (prevSignal[::-1])[0:2]      # Reverse prevSignal and then grab
                                      #   only the last two elements

filteredSignal, _ = signal.lfilter(Bparam, Aparam, inputSignal, zi = IC)
                                      # Result is continuous and clear

prevSignal = filteredSignal           # Save for the next pass

我以两种方式测试我的过滤器。第一个是 inputSignal 是一个 np.sin 波,预期的输出是一个不失真的正弦波。第二种是添加一些奇次谐波(构造一个带限方波),并验证结果是否包含这些谐波的更小幅度,就像低通滤波器一样。

上面的代码在二阶时符合预期,但在高阶时会出现失真。例如,我尝试将 IC 范围设置为 [0:4],但它的工作方式似乎不同。

【问题讨论】:

  • 看看我使用linear filters in SciPy的笔记第6页开始的“批量过滤长信号”部分。
  • @Wareen Weckesser 你能帮我解决在 python 中实现 2 个低通滤波器的问题吗?

标签: python scipy signal-processing


【解决方案1】:

在@Warren 的论文(恕我直言)中,批量过滤长信号部分帮助回答了我的问题。连同该部分中提供的示例代码,我通过以下方式形成了 sos 数组:

Bparam, Aparam = signal.iirfilter(2, 0.02,
                   btype = 'lowpass', analog = False, ftype = 'butter')
Z, P, K = signal.tf2zpk(Bparam, Aparam)
sos = signal.zpk2sos(Z, P, K)

我也在高通滤波器上试过这个,最高到 8 阶,没问题!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-11
    • 2014-10-27
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多