我记得当初是在模拟电子技术课上学习了各种类型的滤波器,之后又实际构建了这些滤波器。正如你能想到的,用软件实现一个滤波器比用硬件实现要容易得多。
我们将构建一个滤波器,并把它应用于我们下载的一个音频片段。在本章前面的攻略中,已经介绍了一些相关的基本步骤,此处不再重复介绍。
具体步骤
顾名思义,iirdesign
函数可以用来构建多种类型的模拟和数字滤波器。scipy.signal模块包含了各种和信号处理有关的函数,其中包括iirdesign
函数。
- 设计滤波器。
下面用scipy.signal模块中的iirdesign
函数设计滤波器。
IIR表示无限冲激响应(Infinite Impulse Response),更多相关的信息请见维基百科页面http://en.wikipedia.org/wiki/Infinite_impulse_response。有关iirdesign
函数的各种细节,这里不做介绍。如有必要,请查阅相关的文档页面http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.iirdesign.html。
简而言之,我们将设置如下参数。
- 取值范围在0到1之间的归一化频率
- 通带最大衰减
- 阻带最小衰减
- 滤波器类型
b,a = scipy.signal.iirdesign
(wp=0.2, ws=0.1, gstop=60,
gpass=1, ftype='butter')
上述的配置参数对应的是一个巴特沃思带通滤波器。更多有关巴特沃思带通滤波器的信息请见http://en.wikipedia.org/wiki/Butterworth_filter。
- 使用滤波器。
使用scipy.signal.lfilter
函数完成滤波器有关的计算工作。该函数的输入参数是上述步骤中iirdesign
函数的返回结果和一个待滤波的数组。
filtered = scipy.signal.lfilter(b, a, data)
- 保存新的音频文件。
把滤波后的音频数据写入文件时,需要确保其数据类型与原始的音频数据相同。
scipy.io.wavfile.write('filtered.wav',
sample_rate, filtered.astype(data.dtype))
绘制出原始的和滤波后的音频数据后,我们得到如下的图形。
攻略小结
我们创建和使用了一个巴特沃思带通滤波器。为了创建滤波器,我们使用了下列函数。
函数 | 功能描述 |
---|---|
scipy.signal.iirdesign |
创建一个IIR类型的数字或模拟滤波器。该函数支持丰富的参数选项,相关的文档请见http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.iirdesign.html |
scipy.signal.lfilter |
用给定的数字滤波器对数组滤波 |