algorithm - 在 python 中将 Goertzel 算法扩展到 24 kHz、32 kHz 和 48 kHz

标签 algorithm python-2.7 audio signal-processing goertzel-algorithm

我正在学习实现 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 之前,有两个初步计算是:

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

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

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

最佳答案

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

你的检测器的带宽大约是Fs/N,当然收集一个 block 所需的时间是N/Fs

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

不过,将 block 大小调整为尽可能接近要检测的波长的倍数也很重要。 Goertzel 算法基本上是一种计算几个选定 DFT bin 的快速方法,这种调整将您想要查看的频率放在这些 bin 的中心附近。

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

可以为您想要支持的其他采样率重做此优化,但如果您只使用 N = 210 * Fs/16000,性能实际上将等同于您已有的性能

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

关于algorithm - 在 python 中将 Goertzel 算法扩展到 24 kHz、32 kHz 和 48 kHz,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53985857/

相关文章:

android - 使用 libusb 在 UCG102 上设置采样率

python - 使用python在Elasticsearch查询中进行用户身份验证

python - 如何从设定时间中减去当前时间

algorithm - 递归与非递归排序算法

algorithm - 计算具有更新的段中的反转

python - PyInstaller 新手 : hello world

ios - 从频域到时域

C 跨平台声音输入库

python - 是否有任何使用 TensorFlow 实现的异常检测算法的示例?

javascript - 代表许多数组的唯一索引的数字