xyzhang_yjs08 发表于 2010-7-30 15:50:42

有用过Goertzel算法进行DFT做DTMF解码的吗?

RT!!
    最近实验室里面要做DTMF解码,查阅了一些资料发现网上很多文章都说要用Gertzel算法进行DFT,然后根据其幅度谱来判断是否有某一频率的谱线。而且我认为这个算法本身应该是没有问题的,因为印象中好像PIC的库函数里面有这么一个解码的程序(不过我没有源代码)。
    但是实际上自己用这个变换做了分析之后发现,结果根本不是那么回事——计算出来的谱线根本就是乱的,根本无法区别。
    发个处理程序吧,希望有达人看到后可以指出问题的所在,程序是软件模拟的,数据是实际的采样值。
采样频率:8192Hz
DFT点数:206
采样点数:206
计算的频率应该是最前面的两个频率的合成,即:312.7和346.6那两个频率
程序比较简单就没加注释,呵呵


#include "stdio.h"
#include "math.h"
#define PI 3.1415926

short SourceData1[] =
{       
801,893,970,1012,1017,978,906,811,621,437,
289,65,-90,-180,-409,-512,-524,-513,-428,-187,
-113,-2,200,370,517,701,825,895,923,929,
885,812,660,493,347,173,-10,-114,-185,-398,
-447,-462,-436,-201,-170,-92,2,181,334,464,
589,687,743,804,800,698,623,503,389,293,
116,-18,-101,-155,-187,-196,-198,-185,-164,-114,
-42,68,169,301,369,441,493,515,515,507,
475,425,360,296,182,102,0,-36,-83,-102,
-105,-104,-91,-56,-26,7,86,142,195,284,
297,301,308,308,298,290,219,189,164,130,
108,98,77,80,73,80,90,92,101,110,
114,109,104,96,82,67,55,6,0,-4,
-4,2,51,75,109,152,184,223,291,305,
314,314,309,297,226,173,115,57,-25,-78,
-117,-145,-160,-166,-161,-148,-109,-63,-6,107,
206,311,378,437,480,493,484,460,396,321,
217,106,-28,-107,-179,-381,-434,-508,-509,-442,
-391,-182,-114,-25,132,296,400,495,603,664,
674,652,588,485,375,229,71,-76,-174,-412,
-540,-600,-629,-628,-580,-515,-374,
};

double frequence =
{
    312.6,346.7,384.6,426.6,473.2,524.8,582.1,645.7,
    716.1,794.3,881.0,977.2,1083.9,1202.3,1333.5,1479.1
};

int main(void)
{
        int i,j;
        double dftres;
        double dftpow;
        double temp;
//DFT结果的第0点
        for(i=0;i<32;i+=2)
          dftres = (double)SourceData1;
//DFT中间结果的第1点
        for(i=0;i<32;i+=2)
          dftres = 2.0*cos(2*PI*frequence/8192.0)*dftres+(double)SourceData1;
        for(i=2;i<206;i++)
        {
                for(j=0;j<32;j+=2)
                {
                        temp = dftres;
                        dftres = dftres;
                        dftres = 2.0*cos(2*PI*frequence/8192.0)*dftres-temp+(double)SourceData1;
                }
        }
        for(j=0;j<16;j++)
                dftpow = dftres*dftres+dftres*dftres
                                        -2.0*cos(2*PI*frequence/8192.0)*dftres*dftres;
        for(j=0;j<16;j++)
                printf("%16.2f\n",dftpow);
        printf("\n");
        return 0;
}

comway 发表于 2011-3-18 09:03:06

ldhavr 发表于 2012-9-14 11:44:16

等待结果
页: [1]
查看完整版本: 有用过Goertzel算法进行DFT做DTMF解码的吗?