我正在学习实现Goertzel的算法,以从记录的波形文件中检测DTMF音调。我从here用python实现了一个。它支持以8 kHz和16 kHz采样的音频。我想扩展它以支持以24 kHz,32 kHz和48 kHz采样的音频文件。
从上面链接中获得的代码中,我看到作者已经设置了以下前提条件参数/常量:
self.MAX_BINS = 8
if pfreq == 16000:
self.GOERTZEL_N = 210
self.SAMPLING_RATE = 16000
else:
self.GOERTZEL_N = 92
self.SAMPLING_RATE = 8000
根据this的文章,在可以做实际的Goertzel之前,其中两个初步计算是:
因此,作者已明确将块大小设置为16k采样输入为210,8k采样输入为92。现在,我想了解:
答案 0 :(得分:1)
块大小决定了频率分辨率/选择性以及收集一个样本块所花费的时间。
检测器的带宽约为 Fs / N ,当然,收集一个块所需的时间为 N / Fs 。
要获得同等的性能,应保持 Fs 和 N 之间的比率大致相同,以使这两个度量保持不变。
但是,将块大小调整为尽可能接近要检测的波长倍数也很重要。基本上,Goertzel算法是计算几个选定DFT箱的快速方法,此调整会将您要查看的频率放在这些箱的中心附近。
根据最后一点对块大小进行优化可能是为什么 Fs / N 与您对8KHz和16Khz采样率的代码不完全相同的原因。
您可以针对您要支持的其他采样率重做此优化,但是实际上,性能将等同于您仅使用 N = 210 * Fs / 16000时已经具有的性能
您可以在此处找到有关块大小选择的详细说明:http://www.telfor.rs/telfor2006/Radovi/10_S_18.pdf