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

📄 dtmf32.c

📁 在DSP上运行的DTMF(双音多频)解调程序
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include "codec.h"

#define	SIGN_BIT	(0x80)		/* Sign bit for a A-law byte. */
#define	QUANT_MASK	(0xf)		/* Quantization field mask. */
#define	SEG_SHIFT	(4)		    /* Left shift for segment number. */
#define	SEG_MASK	(0x70)		/* Segment field mask. */
#define       CHNUM        32

//#define coef[0] 30743
//#define coef[1] 27980
//#define coef[2] 26956
//#define coef[3] 25701
//#define coef[4] 24218
//#define coef[5] 19072
//#define coef[6] 16324
//#define coef[7] 13085

//#pragma DATA_SECTION(dtmfcode,".dtmfcode")

   short dtmfcode[1];
//	const short coef[8] ={30743,27980,26956,25701,24218,19072,16324,13085};

void CallId(short * data)
{
     
 
	short coef[8] ;
	//{30743,27980,26956,25701,24218,19072,16324,13085,9315};
	//{30852,28106,27245,25330,24279,19519,16846,12539};
	int u0[8], u1[8];
	long int  thresh;
	long  temp;
	int a;
	short xzero;      
	int t;
	long power[8];
	long powmax1, powmax2;
	short max1, max2;
	short i=0;
//	short seg[1]={0};   
//	short channel=0;

//    for(channel = 0; channel <CHNUM; channel++)
//	{
		thresh =0;
		xzero= 0; 
//	    j=channel<<7;
		for(i = 0;i<128;i++)
		{	
			thresh += abs(data[i]);	
			if((data[i] ^ data[i+1]) & 0x8000)
				xzero++;
		}
		
		if(xzero>20 && thresh>200000)//改动thresh[0]>250000 
		{
			powmax1=30000;
			powmax2=30000;
			
			u0[0] = 0;u1[0] = 0;u0[1] = 0;u1[1] = 0;
			u0[2] = 0;u1[2] = 0;u0[3] = 0;u1[3] = 0;
			u0[4] = 0;u1[4] = 0;u0[5] = 0;u1[5] = 0;
			u0[6] = 0;u1[6] = 0;u0[7] = 0;u1[7] = 0;
			coef[0]=27980; coef[1]=26956; coef[2]=25701; coef[3]=24218; coef[4]=19072; coef[5]=16324; coef[6]=13085;coef[7]=9315;

			for(i = 0;i < 128;i++)
			{
	//			if(data[i] > 0)
	//			{	
					t = u0[0];
					temp =coef[0] * u0[0];
					temp >>=14; 
					u0[0] = temp - u1[0]+(data[i]>>8);
					u1[0] = t;                
					
					t = u0[1];
					temp =coef[1] * u0[1];
					temp >>=14; 
					u0[1] = temp  - u1[1] + (data[i]>>8);
					u1[1] = t;            	                       
					
					t = u0[2];
					temp =coef[2] * u0[2];
					temp >>=14; 
					u0[2] = temp- u1[2] + (data[i]>>8);
					u1[2] = t;            	                       
					
					t = u0[3];
					temp =coef[3] * u0[3];
					temp >>=14; 
					u0[3] = temp - u1[3]+(data[i]>>8);
					u1[3] = t;            	                       
					
					
					t = u0[4];
					temp =coef[4] * u0[4];
					temp >>=14; 
					u0[4] = temp  - u1[4] + (data[i]>>8);
					u1[4] = t;            	                       
					
					t = u0[5];
					temp =coef[5] * u0[5];
					temp >>=14; 
					u0[5] = temp - u1[5] + (data[i]>>8);
					u1[5] = t;            	                       
					
					t = u0[6];
					temp =coef[6] * u0[6];
					temp >>=14; 
					u0[6] = temp  - u1[6] + (data[i]>>8);
					u1[6] = t;
									
					t = u0[7];
					temp =coef[7] * u0[7];
					temp >>=14; 
					u0[7] = temp - u1[7] + (data[i]>>8);
					u1[7] = t;
	/*			}
				else 
				{
					t = u0[0];
					temp = coef[0] * u0[0]; 
					u0[0] = ((temp>>14)-64) - u1[0];
					u1[0] = t;                
					
					t = u0[1];
					temp = coef[1] * u0[1]; 
					u0[1] = ((temp>>14)-64) - u1[1];
					u1[1] = t;            	                       
					
					t = u0[2];
					temp = coef[2] * u0[2]; 
					u0[2] = ((temp>>14)-64) - u1[2];
					u1[2] = t;            	                       
					
					t = u0[3];
					temp = coef[3] * u0[3]; 
					u0[3] = ((temp>>14)-64) - u1[3];
					u1[3] = t; 
					
					t = u0[4];
					temp = coef[4] * u0[4]; 
					u0[4] = ((temp>>14)-64) - u1[4];
					u1[4] = t;            	                       
					
					t = u0[5];
					temp = coef[5] * u0[5]; 
					u0[5] = ((temp>>14)-64) - u1[5];
					u1[5] = t;            	                       
					
					t = u0[6];
					temp = coef[6] * u0[6]; 
					u0[6] = ((temp>>14)-64) - u1[6];
					u1[6] = t;
					
					t = u0[7];
					temp = coef[7] * u0[7]; 
					u0[7] = ((temp>>14)-64) - u1[7];
					u1[7] = t;
					         
				}*/
			}
// sqrt
			power[0] = u0[0] * u0[0];
			power[0] += u1[0] * u1[0];
			temp = coef[0] *u0[0];
			a=temp >>14;
			power[0] -= a* u1[0]; 
			
			power[1] = u0[1] * u0[1];
			power[1] += u1[1] * u1[1];
			temp=coef[1]*u0[1];
			a=temp>>14;
			power[1] -= a * u1[1]; 
			
			power[2] = u0[2] * u0[2];
			power[2] += u1[2] * u1[2];
			temp = coef[2]*u0[2];
			a = temp>>14;
			power[2] -= a * u1[2];
			
			
			power[3] = u0[3] * u0[3];
			power[3] += u1[3] * u1[3];
			temp = coef[3]*u0[3];
			a=temp>>14;
		    power[3] -= a * u1[3];
		    
			
			power[4] = u0[4] * u0[4];
			power[4] += u1[4] * u1[4];
			temp = coef[4]*u0[4];
			a = temp>>14;
			power[4] -= a * u1[4];
			
			power[5] = u0[5] * u0[5];
			power[5] += u1[5] * u1[5];
			temp=coef[5]*u0[5];
			a=temp>>14;
		    power[5] -= a * u1[5];
		    
			
			power[6] = u0[6] * u0[6];
			power[6] += u1[6] * u1[6];
			temp=coef[6]*u0[6];
			a=temp>>14;
			power[6] -= a * u1[6];
			
			
		   	power[7] = u0[7] * u0[7];
		   	power[7] += u1[7] * u1[7];
		   	temp=coef[7]*u0[7];
		   	a=temp>>14;
		   	power[7] -= a * u1[7];

				
	
			max1=8;
			for( i=0; i < 4 ; i++)
			{
				if(powmax1<power[i])    
				{
					powmax1=power[i];
					max1=i;
				}					    
			}
			
			max2=8;		
			for( i=4; i < 8 ; i++)
			{
				if(powmax2<power[i]) 
				{
					powmax2=power[i];
					max2=i;
				}
			}
			
			    max1=(max2<<4)+max1;
			    switch (max1){

			    case 0x40:dtmfcode[0] = 0x1;
			              break;
			    case 0x41:dtmfcode[0] = 0x4;
			              break;
			    case 0x42:dtmfcode[0] = 0x7;
			              break;
			    case 0x43:dtmfcode[0] = 0x0e;
			              break; 


			    case 0x50:dtmfcode[0] = 0x2;
			              break;			    
			    case 0x51:dtmfcode[0] = 0x5;
			              break;
			    case 0x52:dtmfcode[0] = 0x8;
			              break;
			    case 0x53:dtmfcode[0] = 0x0;
			              break; 
			              
					  
			    case 0x60:dtmfcode[0] = 0x3;
			              break;
			    case 0x61:dtmfcode[0] = 0x6;
			              break;
			    case 0x62:dtmfcode[0] = 0x9;
			              break;
			    case 0x63:dtmfcode[0] = 0x0f;
			              break; 


			     
			    case 0x70:dtmfcode[0] = 0x0a;
			              break; 
			    case 0x71:dtmfcode[0] = 0x0b;
			              break; 
			    case 0x72:dtmfcode[0] = 0x0c;
			              break; 
			    case 0x73:dtmfcode[0] = 0x0d;
			              break; 
			              
			              
			    default:
			            
			 	     dtmfcode[0]=0x0ff;
			 	 }

		}
//		else 
//			dtmfcode[0]=0x0ff;		  	
//	}
	


}       

⌨️ 快捷键说明

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