gpt4 book ai didi

python - 在连续时间帧上应用 IIR 滤波器时的连续性问题

转载 作者:行者123 更新时间:2023-12-01 01:35:02 25 4
gpt4 key购买 nike

我想在每个 1024 个样本的连续 block /时间帧上应用 FIR 或 IIR 滤波器(例如:低通滤波器)。

可能的应用:

  • 实时音频处理,例如均衡器。在精确的时间,缓冲区中只有接下来的 1024 个样本。下一个要处理的样本尚不可用(实时)。

  • 通过将输入信号分成 block 来制作截止时变滤波器,如建议的 in this answer .

我在这里尝试过:

import numpy as np
from scipy.io import wavfile
from scipy.signal import butter, lfilter, filtfilt, firwin

sr, x = wavfile.read('input.wav')
x = np.float32(x)
y = np.zeros_like(x)

N = 1024 # buffer block size = 23ms for a 44.1 Khz audio file
f = 1000 # cutoff
pos = 0 # position

while True:
b, a = butter(2, 2.0 * f / sr, btype='low')
y[pos:pos+N] = filtfilt(b, a, x[pos:pos+N])
pos += N
f -= 1 # cutoff decreases of 1 hz every 23 ms, but the issue described here also present with constant cutoff!
print f
if pos+N > len(x):
break

y /= max(y) # normalize

wavfile.write('out_fir.wav', sr, y)

我尝试过:

  • 均采用巴特沃斯滤波器或 FIR(将前面的行替换为 b, a = firwin(1000, cutoff=f, fs=sr), 1.0)

  • 均带有 lfilterfiltfilt (后者的优点是向前和向后应用滤波器,这解决了相位问题),

但问题是:

在每个时间帧输出的边界处,存在连续性问题,导致音频信号严重失真。

如何解决这个不连续问题?我想过windowing+OverlapAdd方法,但肯定有更简单的方法。

enter image description here

最佳答案

正如 @sobek 在评论中提到的,当然需要指定初始条件以允许连续性。这是通过 lfilterzi 参数完成的。

通过更改主循环可以解决问题:

while True:
b, a = butter(2, 2.0 * f / sr, btype='low')
if pos == 0:
zi = lfilter_zi(b, a)
y[pos:pos+N], zi = lfilter(b, a, x[pos:pos+N], zi=zi)
pos += N
f -= 1
if pos+N > len(x):
break

即使过滤器的截止值(以及 ab)在每次迭代时都被修改,这似乎仍然有效。

关于python - 在连续时间帧上应用 IIR 滤波器时的连续性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52468563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com