0

我正在学习实现 Goertzel 的算法来从记录的波形文件中检测 DTMF 音调。我从这里用 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

根据这篇文章,在进行实际的 Goertzel 之前,有两个初步计算是:

  1. 确定采样率。
  2. 选择块大小,N

因此,作者明确将 16k 采样输入的块大小设置为 210,将 8k 采样输入设置为 92。现在,我想明白:

  1. 作者是如何得出这个块大小的?
  2. 24k、32k 和 48k 样本的块大小是多少?
4

1 回答 1

1

块大小决定了频率分辨率/选择性以及收集样本块所需的时间。

检测器的带宽约为Fs/N,当然收集块所需的时间为N/Fs

为了获得同等性能,您应该保持FsN之间的比率大致相同,以便这两个测量值保持不变。

但是,将块大小调整为尽可能接近要检测的波长的倍数也很重要。Goertzel 算法基本上是计算几个选定 DFT 箱的一种快速方法,这种调整将您希望看到的频率置于这些箱的中心附近。

根据最后一点优化块大小可能是为什么在 8KHz 和 16Khz 采样率的代码中Fs/N不完全相同的原因。

可以针对您想要支持的其他采样率重新进行此优化,但如果您只使用N = 210 * Fs / 16000,那么性能将等同于您已有的性能

您可以在此处找到块大小选择的详细说明:http ://www.telfor.rs/telfor2006/Radovi/10_S_18.pdf

于 2018-12-31T17:34:43.927 回答