搜索
bottom↓
回复: 2

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

[复制链接]

出0入0汤圆

发表于 2010-7-30 15:50:42 | 显示全部楼层 |阅读模式
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[16] =
{
    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[32];
        double dftpow[16];
        double temp;
//DFT结果的第0点
        for(i=0;i<32;i+=2)
            dftres = (double)SourceData1[0];
//DFT中间结果的第1点
        for(i=0;i<32;i+=2)
            dftres[i+1] = 2.0*cos(2*PI*frequence[i/2]/8192.0)*dftres+(double)SourceData1[1];
        for(i=2;i<206;i++)
        {
                for(j=0;j<32;j+=2)
                {
                        temp = dftres[j];
                        dftres[j] = dftres[j+1];
                        dftres[j+1] = 2.0*cos(2*PI*frequence[j/2]/8192.0)*dftres[j]-temp+(double)SourceData1;
                }
        }
        for(j=0;j<16;j++)
                dftpow[j] = dftres[j]*dftres[j]+dftres[2*j+1]*dftres[2*j+1]
                                        -2.0*cos(2*PI*frequence[j]/8192.0)*dftres[j]*dftres[2*j+1];
        for(j=0;j<16;j++)
                printf("%16.2f\n",dftpow[j]);
        printf("\n");
        return 0;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2011-3-18 09:03:06 | 显示全部楼层

出0入0汤圆

发表于 2012-9-14 11:44:16 | 显示全部楼层
等待结果
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-17 16:37

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表