在连续时间段应用IIR过滤器时的连续性问题

2024-06-16 08:39:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

可能的应用:

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

  • 如建议的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

  • 同时使用^{}和{a3}(后者的优点是可以向前和向后应用过滤器,这解决了阶段问题),

但问题是:

**在每个时间帧的输出边界,存在连续性问题,这使得音频信号严重失真。在

如何解决这种不连续性问题?我考虑过windowing+overladd方法,但肯定有更简单的方法。在

enter image description here


Tags: fromposimport信号np时间scipy音频
1条回答
网友
1楼 · 发布于 2024-06-16 08:39:06

正如@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

因此,如果cd3}的工作被修改,那么{cd3>

相关问题 更多 >