从wav文件中检测DTMF

时间:2011-05-21 14:25:38

标签: matlab signal-processing fft dtmf

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

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

我遇到麻烦,因为我对Matlab环境不太满意,整个离散傅里叶分析对我来说也很新,所以我觉得有点失落。

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

实际数据的幅度DFT几乎等于长度为N的N / 2个正交Goertzel滤波器。而FFT只是一种快速DFT算法。

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

fft_bin_frequency = fft_bin_number * sample_rate / fft_length ;

对整个FFT幅度能量进行完整性检查。如果比率“很小”,则可能只是fft箱中的噪音而不是DTMF音。