python – 在连续时间帧上应用IIR过滤器时的连续性问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 在连续时间帧上应用IIR过滤器时的连续性问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1553字,纯文字阅读大概需要3分钟。
内容图文
我想在每个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)
我试过了:
>都使用Butterworth滤波器或FIR(将b替换为b,a = firwin(1000,cutoff = f,fs = sr),1.0)
> lfilter和filtfilt(后者具有向前和向后应用滤波器的优势,这解决了相位问题),
但这是问题所在:
**在每个时间帧输出的边界处,存在连续性问题,这使得音频信号严重失真.
如何解决这种不连续性问题?我想过窗口化OverlapAdd方法,但肯定必须有一个更简单的方法.
解决方法:
正如@sobek在评论中所提到的,当然需要指定允许连续性的初始条件.这是通过lfilter的zi参数完成的.
通过更改主循环来解决问题:
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
即使在每次迭代时修改过滤器的截止(以及因此a和b),这似乎也有效.
内容总结
以上是互联网集市为您收集整理的python – 在连续时间帧上应用IIR过滤器时的连续性问题全部内容,希望文章能够帮你解决python – 在连续时间帧上应用IIR过滤器时的连续性问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。