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

📄 dtmf.cpp

📁 C++写的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 + -