我有一个脚本(Python),可以将 44.1 kHz 实时音频切割成 10 ms 的块,处理每个块,然后将这些块缝合在一起而不会添加任何伪影。我正在尝试创建一个对每个块进行操作的低通滤波器,但是我尝试过的每个滤波器都会引入不需要的伪像。
我尝试过创建各种类型的过滤器,包括 IIR(Butterworth)和 FIR(Hann、Hamming、矩形窗口等)和 Remez。尝试将滤波器应用于输入信号的方法包括直接传递函数、卷积和前向后向滤波器(即 scipy.signal.filtfilt)。我也尝试过移动平均方法,但我不知道在块的端点附近做什么。
有没有专为这种应用设计的过滤器?
INPUT WAVE (lots of harmonic content)
|<-- 1 CHUNK -->|
: : : :
: : : :
: ----- ---:- ----- : ----- -:
:| | | : | | | : | | | :
:| | | : | | | : | | | :
:| | | : | | | : | | | :
: ----- : ----- --:-- ----- :
: : : :
V V V
V V V
FILTER FILTER FILTER
V V V
V V V
: : : :
: --- -:- --- : --- :
: / \ / : \ / \ : / \ :
: / \ / : \ / \ : / \ /:
:/ \ / : \ / \: / \ / :
: --- : --- :-- --- :
: : : :
OUTPUT WAVE (less harmonic content)
编辑:根据@hotpaw2 的回答,我希望先尝试 IIR 方法(我是这方面的新手,但我的直觉告诉我先尝试 IIR)。出于讨论的目的,让我们定义这些数组:
B = transfer function numerator coefficients
A = transfer function denominator coefficients
I0 = previous input array (same size)
I1 = current input array (441 samples)
R0 = previous output, post-filtered (DO WE NEED?)
R1 = current output, desired post-filtered result array
我是仅从 I0 生成初始条件,还是需要将 R0 计算在内?换一种方式问,这是我正在尝试的 Python 代码:
initCon = scipy.signal.filtic(B, A, I0)
一旦我有了这组初始条件,它们是直接应用于过滤器,还是我需要对它们做更多的事情?同样,Python 代码:
R1, _ = scipy.signal.lfilter(B, A, I1, z = initCon)
就目前的代码而言,它可以执行,但有很多非频率嗡嗡声。
