📄 dtmf.cpp
字号:
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#define pi 3.1415926
#define FS 8000
#define M 130
double squ[8];
static char key=0;
char panduan()
{double r3,r4;
int i,r1,r2;
r3=r4=0;
for(i=0;i<4;i++)
{
if(squ[i]>r3)
{ r3=squ[i];
r1=i;
}
}
for(i=4;i<8;i++)
{
if(squ[i]>r4)
{ r4=squ[i];
r2=i;
}
}
if(r1==0&&r2==4)
key='1';
else if(r1==1&&r2==4)
key='2';
else if(r1==2&&r2==4)
key='3';
else if(r1==3&&r2==4)
key='A';
else if(r1==0&&r2==5)
key='4';
else if(r1==1&&r2==5)
key='5';
else if(r1==2&&r2==5)
key='6';
else if(r1==3&&r2==5)
key='B';
else if(r1==0&&r2==6)
key='7';
else if(r1==1&&r2==6)
key='8';
else if(r1==2&&r2==6)
key='9';
else if(r1==3&&r2==6)
key='C';
else if(r1==0&&r2==7)
key='*';
else if(r1==1&&r2==7)
key='0';
else if(r1==2&&r2==7)
key='#';
else if(r1==3&&r2==7)
key='D';
return key;
}
void main()
{
short s[38000];
for(int z=0;z<38000;z++)
{s[z]=0;
}
FILE * fp;
short * a;
a=s;
if(!(fp=fopen("DTMF.pcm","rb")))
printf("file open error");
fread(s,sizeof(short)*38000,1,fp);
fclose(fp);
int m=0,n,i,j=0,r=0,key,r1,r2,n1,n2,value=0,flag=1,flag1=1,flag2=0,R;
double q,p=0,k=0;
double f[8]={1209.0,1236.0,1477.0,1633.0,697.0,770.0,852.0,941.0};
short * addr,*up,*down;
short x;
while(flag1)
{
if(flag==2)
{
while(1)
{x=*(a);
if(abs(x)>10)
value++;
else
value=0;
if(value>4)
break;
else
flag=1;
a++;
if(a>(s+38000))
{
cout<<endl;
flag1=0;
break;
}
}
if(flag==1)
{
a+=76;
up=a; //记录上升沿
}
} //确实有健按下
while(flag)
{
if(abs(*a)<10)
value++;
else
value=0;
if(value>3)
{
down=a-84;
break;
}
a++;
}
a=down-120;
if(flag1)
{
for(i=0;i<8;i++)
{double par=2*cos(2*pi*f[i]/8000);
if(a>s)
while(a<=down)
{ q=par*p-k+*(a);
k=p;
p=q;
a++;
}
else
{
a=s;
while(a<=down)
{ q=par*p-k+*(a);
k=p;
p=q;
a++;
}
}
squ[i]=(q*q)+(k*k)-par*q*k;
q=p=k=0;
a=down-120;
}
a=down+80;
key=panduan();
printf("%c,",key);
flag=2;
}
value=0;
up=down=0;
} //while循环结束
cout<<" "<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -