【发布时间】: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