?? dtmf32.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 + -