繁体   English   中英

在python中将Goertzel算法扩展到24 kHz,32 kHz和48 kHz

[英]Extending Goertzel algorithm to 24 kHz, 32 kHz and 48 kHz in python

我正在学习实现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

根据文章,一个前可以做实际策尔,两个初步计算的是:

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

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

  1. 作者如何得出此区块大小?
  2. 24k,32k和48k样本的块大小是多少?

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

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

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

但是,同样重要的是将块大小调整为尽可能接近要检测的波长的倍数。 基本上,Goertzel算法是计算几个选定DFT仓的快速方法,此调整会将您要查看的频率放在这些仓的中心附近。

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

可以对要支持的其他采样率重做此优化,但是实际上,性能将等同于您仅使用N = 210 * Fs / 16000时已经拥有的性能。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM