Numpy 设计音频滤波器

我记得当初是在模拟电子技术课上学习了各种类型的滤波器,之后又实际构建了这些滤波器。正如你能想到的,用软件实现一个滤波器比用硬件实现要容易得多。
我们将构建一个滤波器,并把它应用于我们下载的一个音频片段。在本章前面的攻略中,已经介绍了一些相关的基本步骤,此处不再重复介绍。

具体步骤

顾名思义,iirdesign函数可以用来构建多种类型的模拟和数字滤波器。scipy.signal模块包含了各种和信号处理有关的函数,其中包括iirdesign函数。

  1. 设计滤波器。

下面用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。

  1. 使用滤波器。

使用scipy.signal.lfilter函数完成滤波器有关的计算工作。该函数的输入参数是上述步骤中iirdesign函数的返回结果和一个待滤波的数组。

filtered = scipy.signal.lfilter(b, a, data)

  1. 保存新的音频文件。

把滤波后的音频数据写入文件时,需要确保其数据类型与原始的音频数据相同。

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 用给定的数字滤波器对数组滤波

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程