DTMF拨号程序流程图如图4所示。 
DTMF解码 
采用软件方式进行DTMF解码,首先要将模拟信号转换成数字信号,然后再送入CPU处理。利用MSP430F133内置的12位ADC加上简单的接口就可以实现模数转换,ADC接口电路如图5所示。其中 应选1%精度的金属膜电阻。ADC参考电压选内部2.5V:  
  
DTMF解码可以通过计算所接收到的信号在8个既定频率点的频谱值来确定是否为有效的DTMF信号及接收到的是哪个号码。另外,需要通过一系列的有效性检验以防止误判。 
FFT可用来计算N点频率处的频谱值,但不适合于此处应用。因为它计算了许多不需要的值,计算量太大;而且为保证频率分辨率,FFT的点数较大。另外,它不能按逐个样点的方式处理,不利于实时实现。 
由于只需要知道8个特定点的频谱值,采用一种称为Goertzel算法的DFT算法可以有效地提高计算效率。它相当于一个含两个极点的IIR滤波器,8个频点对应各自相匹配的滤波器,其传递函数为 
  
然而Goertzel算法还是有一个缺点,那就是它计算的是频率 处的频谱值,而精确的频率值 通常只能对应某个近似的整数k,为了达到要求的分辨率,就需要较大的样点数N。改进的方法是:修改传递函数,不计算角频率  处的频谱值,而计算精确角频率  处的频谱值。这样分辨率能达到数据自然加窗(矩形窗)的分辨率。它的传递函数为 
  
改进的Goertzel算法运算步骤如下: 
1. 对每个采样点递归计算(n=0,1,…,N) 
  
其初始条件是   
2. 当N个样点采集并计算完成后,计算8个频谱值:   
在选定采样频率为6Khz基础上,选取N=86个样点即可达到所需的频率分辨率。这对应约15ms信号,可以保证一位号码能接收到两个完整的DTMF信号周期
 |