⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 de_dtmf.c

📁 dtmf的编解码代码
💻 C
字号:
/* ============================================================================*/ 
/*          Copyright (C) 2004 YINXING TECHNOLOGY CO., LTD                     */ 
/*                          All Rights Reserved.                               */ 
/* ----------------------------------------------------------------------------*/ 
/* ============================================================================*/ 




#include "board.h"

extern int IsNew;
extern int In_Buffer[];       /* use to save get of DTMF data */
extern char DTMF_NUMBER[];
extern int NumIndex;

char DTMF_Code[4][4]={{'1','2','3','A'},{'4','5','6','B'},
                    {'7','8','9','C'},{'*','0','#','D'}};

float  v697,v697_1,v697_2,v770,v770_1,v770_2,v852,v852_1,v852_2;
float  v941,v941_1,v941_2,v1209,v1209_1,v1209_2,v1336,v1336_1,v1336_2;
float  v1477,v1477_1,v1477_2,v1633,v1633_1,v1633_2,x;
float  X697,X770,X852,X941,X1209,X1336,X1633,X1477;

int dtmf_data;
int IsNew_DTMF_Key=1;
int IsNew_N=0;
int IsNew=0;

extern int NowCol;
extern int NowLine;
extern char Lastbuf[];

void choose_code();

void interrupt receive()
{   int *ptr;
    static int *in_dtmf=&In_Buffer[0];
    
    if((in_dtmf-In_Buffer) > N)
    {    in_dtmf=In_Buffer;
         IsNew_N=1;
    }     
        
    ptr=(int *)DRR10_ADDR;
    *in_dtmf++=*ptr;
    dtmf_data=*ptr;
    
    IsNew=1;
    
    return;    
}


void de_dtmf()
{   
    IsNew=0;
    x=(float)dtmf_data/32768.;
    
/*------------------------------------------------------*/
/*  each x[n], calculate vk[n]                          */
/*    vk[n] = x[n] + 2*cos(2*PI*k/N)*vk[n-1]-vk[n-2]    */
/*------------------------------------------------------*/  

    v697=x+COS697*v697_1-v697_2;    // DFT of 697 Hz    
	v697_2=v697_1;v697_1=v697;

    v770=x+COS770*v770_1-v770_2;    // DFT of 770 Hz
	v770_2=v770_1;v770_1=v770;

    v852=x+COS852*v852_1-v852_2;    // DFT of 852 Hz
    v852_2=v852_1;v852_1=v852;

    v941=x+COS941*v941_1-v941_2;    // DFT of 941 Hz
	v941_2=v941_1;v941_1=v941;

    v1209=x+COS1209*v1209_1-v1209_2;     // DFT of 1209 Hz
	v1209_2=v1209_1;v1209_1=v1209;
  
    v1336=x+COS1336*v1336_1-v1336_2;    // DFT of 1336 Hz
	v1336_2=v1336_1;v1336_1=v1336;

    v1477=x+COS1477*v1477_1-v1477_2;    // DFT of 1477 Hz 
	v1477_2=v1477_1;v1477_1=v1477;

    v1633=x+COS1633*v1633_1-v1633_2;    // DFT of 1633 Hz
	v1633_2=v1633_1;v1633_1=v1633;

/*-----------------------------------------------------*/
/* for each N, calcucate                               */
/*   X[k]=vk[N]-WNkvk[N-1]                             */
/*  |X[k]|*|X[k]|=vk[N]*vk[N]+vk[N-1]*vk[N-1]-2*cos(2*PI*k/N)*vk[N]vk[N-1]  */ 
/*------------------------------------------------------*/
 
	if(IsNew_N)
	{
	    X697=v697*v697+v697_2*v697_2-COS697*v697*v697_2;
	    v697_1=v697_2=0;

        X770=v770*v770+v770_2*v770_2-COS770*v770*v770_2;
	    v770_1=v770_2=0;	    
	 
	    X852=v852*v852+v852_2*v852_2-COS852*v852*v852_2;
	    v852_1=v852_2=0;
	    
	    X941=v941*v941+v941_2*v941_2-COS941*v941*v941_2;
	    v941_1=v941_2=0;
	    
	    X1209=v1209*v1209+v1209_2*v1209_2-COS1209*v1209*v1209_2;
	    v1209_1=v1209_2=0;
	    
	    X1336=v1336*v1336+v1336_2*v1336_2-COS1336*v1336*v1336_2;
	    v1336_1=v1336_2=0;
	    
	    X1477=v1477*v1477+v1477_2*v1477_2-COS1477*v1477*v1477_2;
	    v1477_1=v1477_2=0;
	    
	    X1633=v1633*v1633+v1633_2*v1633_2-COS1633*v1633*v1633_2;
	    v1633_1=v1633_2=0;
	                                                                                                    
	    IsNew_N=0;
	    choose_code();
	}
}	    

void choose_code()
{  int flow=0,fhigh=0;
   char keycode;
      
   if(X697 > GATE)
       flow=0;
   else 
      if(X770 > GATE)
         flow=1;
      else 
         if(X852 > GATE)
            flow=2;
         else
            if(X941 > GATE)
               flow=3;
          else 
               flow=-1;
   if(X1209 > GATE)
       fhigh=0;
   else
      if(X1336 > GATE)
           fhigh=1;
      else       
         if(X1477 > GATE)
            fhigh=2;
         else   
            if(X1633 > GATE)
               fhigh=3;    
            else
               fhigh=-1;
   if((flow == -1) || (fhigh == -1))
   {   if((flow == -1) && (fhigh == -1))
          IsNew_DTMF_Key=1; 
   } 
   else                
       if(IsNew_DTMF_Key == 1)
       {   keycode=DTMF_Code[flow][fhigh];

          /* if(NowCol%2 == 0)
              Lastbuf[0]=keycode;
           if(NowCol%2 == 1)
              Lastbuf[1]=keycode;
           lcd_printf(NowLine,NowCol/2,Lastbuf,0);
    
           if(NowCol%2 == 1)
              Lastbuf[0]=Lastbuf[1]=' ';
       
           NowCol++;
           if((NowCol%16) == 0)
              NowCol=0;   */
           IsNew_DTMF_Key=0;
           DTMF_NUMBER[NumIndex>>1]=keycode;    
        }    
        
}

void init_mem()
{
    v697_1=v697_2=0;
    v770_1=v770_2=0;
    v852_1=v852_2=0;
    v941_1=v941_2=0;
    v1209_1=v1209_2=0;
    v1336_1=v1336_2=0;
    v1477_1=v1477_2=0;
    v1633_1=v1633_2=0;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -