共有回帖数 0 个
-


本文是一篇对Gammatone滤波器组(Gammatone Filter Bank)的介绍,总结了此主题下的几篇重要论文(Darling-1991, Slaney-1993, Ellis-2009, 见末尾的引用部分)。
0. 前言
0.1 Gammatone滤波器组是干什么的?
一种在语音识别、语音分析领域中常用的时频转换方法,作用类似短时傅立叶变换(STFT),但Gammatone滤波器组(以下简称GTF滤波器组)结合了人耳的听觉特性。它是一种听觉滤波器组(Auditory Filter Bank)。基于GTF的语音识别系统能获得较高的准确度。
0.2 这篇文章有什么用?
本文主要是因为网上鲜有此类总结性的文章而写。省略了繁杂的推导,着重于应用。如果你在做语音科学或音频处理方面的研究,但愿本文能帮你节省一些读论文的时间。
0.3 学习这篇文章需要哪些基础知识?
这篇文章并不是面向大众的科普,然而个人完全能够从网络上习得这些基础知识:
需要数字信号处理(DSP)基础,我个人推荐Coursera上EPFL的DSP课(https://www.coursera.org/course/dsp),或者CCRMA的Spectral Audio Signal Processing(https://ccrma.stanford.edu/~jos/sasp/)一书;
最好会使用Matlab或Octave;
最好掌握一些单变量微积分;
最好了解一些音频处理,会很有帮助(例如Coursera上UPF的ASPMA课(https://www.coursera.org/course/audio))。
0.4 声明
作者本人买不起Matlab,所以这篇文章中所有的Matlab代码都是在GNU Octave(http://www.gnu.org/software/octave/)上测试运行的,本人不保证代码不经修改即可在Matlab上执行。
1. 概念 - 什么是滤波器组?
顾名思义,一个滤波器组(Filter Bank)就是一组(n个)滤波器,对同一个信号进行滤波,输出n个同步的信号。我们可以给每个滤波器指定不同的响应函数、中心频率、增益、带宽。
假如一个滤波器组中各个滤波器的频率按升序排列,各集中在不同的频率,且滤波器数量足够多,我们可以计算出在不同时间的各个输出信号的短时能量,画成一串功率频谱(Power Spectrum),或连起来成为声谱图(Spectrogram)。



其中,
* c - 调节比例的常数;
* n - 滤波器级数(order),一般取4;
* b - 衰减速度,取值为正数,b越大衰减越快,脉冲响应长度越短;
* f0 - 中心频率,当f0 = 0,此时的GTF称为一个基带GTF(Base Band Gammatone Filter);
* ɸ - 相位,由于人耳对相位不敏感,可以省略;
* 这是连续时间下的定义,所以t单位为秒,f0单位为Hz,对于离散时间只需采样即可。
我们可以看到,时域上GTF就是一个Gamma分布乘上一个余弦信号,所以叫做“Gammatone”。也可以理解成一个余弦信号把这个Gamma分布调制到f0这个频率上。
下图是一个GTF脉冲响应的时域信号:




2.3 ERB带宽和3分贝带宽
2.3.1 GTF的等效矩形带宽
等效矩形带宽(Equivalent Rectangular Bandwidth)指一种矩形带通滤波器的带宽,这中矩形带通滤波器的高度和某个特定滤波器的功率谱最大值相同,且通带功率和这个特定滤波器的功率相同。
换句话说,给定一个任意的功率谱,可以计算出一个等效矩形滤波器,这个矩形带通滤波器的增益就是给定功率谱的最大值,而该矩形滤波器的功率谱的总和和给定功率谱的总和相同。在这个条件下,可以计算出矩形滤波器的带宽,这就是ERB。

这很棒,因为对于一个给定的阶数n,ERB仅依赖于b,且关系是线性的。当n为4时,ERB = 0.98175b。我们也可以从一个给定的ERB求出b:

我们稍后会看到,ERB和人耳的听觉特性有关联。上述转换关系的作用是,我们可以用它方便地针对人耳听觉特性设计出合适的GTF滤波器,这是十分有用的。
2.3.2 GTF滤波器的3分贝带宽
以信号幅度递减一半(相当于减弱3分贝)为标准,GTF滤波器的带宽近似于,

n=4时相当于

由于GTF频率响应的非对称性(见2.2),我们无法求出准确的3分贝带宽。
2.4 FIR实现
GTF滤波器的最简易实现方法是按照脉冲响应的定义,在时域生成离散的脉冲响应,作为FIR对输入信号滤波:
g = @(t, f0, erb) t .^ 3 .* exp(- 2 * pi * 1.019 * erb * t) .* cos(2 * pi * f0 * t);
h = g((0:1 / fs:signal_length / fs)', central_freq, band_width);
y = filter(h, 1, x); % y = filter(B, A, x);
y = conv(h, x); % 相当于和输入信号卷积
这里省略了比例常数c,我们将稍后讨论增益如何控制的问题。
由于脉冲响应的衰减很快,可以截取h,仅保留值较大的部分,可采用典型的窗函数法设计FIR滤波器。这样的好处是节省计算量,然而对于f0较低的情况,脉冲响应的衰减很慢,计算开销很难避免。对于GTF滤波器,FIR实现方式的计算开销平均比IIR实现慢了两个数量级,所以实际应用中FIR采用得较少。


ERB频率计算的matlab实现(这里cf取20):
function CF = make_erb_freqs(fs, n_channel)
SF = 1 / n_channel * 9.26 * (log(fs + 228.7) - log(20 + 228.7));
CF = - 228.7 + (fs + 228.7) ./ exp(0.108 * (1:n_channel)' * SF);
end
function ERB = erb_bandwidth(f0)
B = 24.7 * (0.00437 * f0 + 1);
end
测试运行:
octave:1 make_erb_freqs(8000, 10)'
ans =
Columns 1 through 7:
5570.511 3858.317 2651.639 1801.227 1201.895 779.512 481.836
Columns 8 through 10:
272.047 124.198 20.000
octave:2 erb_bandwidth(ans)
ans =
Columns 1 through 8:
626.267 441.365 311.054 219.217 154.494 108.881 76.734 54.079
Columns 9 and 10:
38.112 26.860
楼主 2015-10-10 13:06 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知