【问题标题】:DTMF detection from a wav file来自 wav 文件的 DTMF 检测
【发布时间】:2023-04-07 19:29:01
【问题描述】:

我是一名工科学生,我必须解决一个关于信号处理的学术问题。

基本上,给定 wav 格式的 DTMF 信号,我必须识别它编码的数字序列。 我必须在 Matlab 环境中使用离散傅立叶变换分析来构建一个读取 wav 文件并通过该过程识别拨号音中的数字的脚本。

我遇到了麻烦,因为我对 Matlab 环境不太适应,整个离散傅里叶分析对我来说也很新,所以我有点迷茫。

有没有人可以分享一些好的提示或建议?

【问题讨论】:

  • 经过一番谷歌搜索后,我发现提到了一种可以针对此问题实施的算法,即 Goertzel 算法。我发现有点难以接受,因为我找不到与我的问题数据的关系。我已经知道我必须在计算过程中使用 256 点 DFT 来发现文件中编码的电话号码是什么,但我不知道如何到达那里。

标签: matlab signal-processing fft dtmf


【解决方案1】:

DFT(或 FFT)对于 DTMF 检测来说太过分了。您只需要 2 x 4 Goertzel 滤波器来检测低音和高音。每个 Goertzel 滤波器的输出都需要进行低通滤波以防止检测到噪声,但除此之外它非常简单。

如果强制使用 DFT/FFT,那么一般方法是:

  • 对于每个输入样本块
    • 应用合适的窗口(例如汉宁)
    • 执行 DFT
    • 计算每个 DFT bin 的大小 (re*re+im*im)
    • 测量对应于 2 x 4 DTMF 音调的 8 个 bin 中的每一个的幅度
    • 如果您有一个高组音和一个低组音,其幅度显着大于组中的其他音调,则检测到 DTMF 音调对

【讨论】:

  • 感谢您的回复,但使用 DFT 是必要条件,而不是选项。
  • 非常感谢您的快速回复!在咨询了一些同学之后,我们几乎就同样的方法达成了一致。现在的主要障碍是这个问题的编程方面,但我们已经在努力解决这个问题。我将尝试在此处发布代码以供稍后参考。谢谢大家!
【解决方案2】:

真实数据的量级 DFT 几乎相当于长度为 N 的 N/2 个正交 Goertzel 滤波器。FFT 只是一种快速 DFT 算法。

如果您必须使用 FFT,因为这是规范的一部分,只需注意与捕获所需 DTMF 音调所需的 Goertzel 滤波器频率对应的 FFT 箱,并将复数结果转换为幅度。

fft_bin_frequency = fft_bin_number * sample_rate / fft_length ;

根据总 FFT 幅度能量检查任何可疑的音调。如果比率“小”,则可能只是 fft bin 中的噪声而不是 DTMF 音。

【讨论】:

    猜你喜欢
    • 2018-05-18
    • 1970-01-01
    • 2012-03-22
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多