📄 de_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 + -