📄 dsp_main.cpp
字号:
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "dsp.h"
int check1(double a[],int x,int y);
int check2(double a[],int x,int y);
void output(int x,int y);
int compare(int a,int b,int x,int y);
void main()
{ int i,k;
double a[8]={18,20,22,24,31,34,38,42};//8个可能的Xk取最大值时的K值
double Q[8][N+2]={0};//二维数组存贮8个Xk的N+2个Qn值
double a_cos[8];
int xlable,ylable;
double max;
double Xk[8];
int check_mark;
signed short x[N];
signed short abandon[1360-N];
int out_lable=0; //输出使能0有效
int identity_x=0;
int identity_y=0;
int com;
/********计算8个K值对应的2*cos(2*pi*K/N)*********/
for(i=0;i<8;i++)
{
a_cos[i]=2*cos(2*pi*a[i]/N);
}
FILE *fp;
fp=fopen("dtmf.txt","rb");
if(fp==NULL)
{
printf("Sorry,cannot open this file.\n");
exit(0);
}
printf("检测到的信号是:\n");
for(k=0;;k++)
{
/****************计算8个Xk的N+2个Qn值**************/
for(i=0;i<N;i++)
{
if(readend==fscanf(fp,"%d",&x[i]))
{ printf("检测完毕!\n");
exit(0);
}
Q[0][i+2]=(double)a_cos[0]*Q[0][i+1]-Q[0][i]+x[i];
Q[1][i+2]=(double)a_cos[1]*Q[1][i+1]-Q[1][i]+x[i];
Q[2][i+2]=(double)a_cos[2]*Q[2][i+1]-Q[2][i]+x[i];
Q[3][i+2]=(double)a_cos[3]*Q[3][i+1]-Q[3][i]+x[i];
Q[4][i+2]=(double)a_cos[4]*Q[4][i+1]-Q[4][i]+x[i];
Q[5][i+2]=(double)a_cos[5]*Q[5][i+1]-Q[5][i]+x[i];
Q[6][i+2]=(double)a_cos[6]*Q[6][i+1]-Q[6][i]+x[i];
Q[7][i+2]=(double)a_cos[7]*Q[7][i+1]-Q[7][i]+x[i];
}
/****************计算8个Xk***********************/
for(i=0;i<8;i++)
{
Xk[i]=Q[i][N+1]*Q[i][N+1]+Q[i][N]*Q[i][N]-a_cos[i]*Q[i][N+1]*Q[i][N];
}
/**************比较得出4个行频中Xk的最大值**************/
max=0;
for(i=0;i<4;i++)
{
if(Xk[i]>max)
{
max=Xk[i];
xlable=i;
}
}
/**************比较得出4个列频中Xk的最大值**************/
max=0;
for(;i<8;i++)
{
if(Xk[i]>max)
{
max=Xk[i];
ylable=i;
}
}
/* for(i=0;i<1360-N;i++)
{
if(!fscanf(fp,"%d",&abandon[i]))
printf("read error");
}*/
/*---------------------------------------------------------------------------*
* 门限判决
门限1:DTMF信号强度门限
* 要求:行、列频率能量最大值之和占据8个频点总能量的百分比是否大于ENERGY_THRESHOLD
*(默认0.9)。不是则认为不是DTMF信号 *
*---------------------------------------------------------------------------*/
check_mark=check1(Xk,xlable,ylable);
if(check_mark)
{ out_lable=0;
continue;
}
/*---------------------------------------------------------------------------*
* 门限判决函数 check2
门限2:行、列峰值门限
* 要求:行、列能量最大值/行列能量次大值> PEAK_VALUE_THRESHOLD(默认14.2)。
* 不是则认为不是DTMF信号,本函数为了简便,判断了所有其他三个值而没有寻找次大值* *
*---------------------------------------------------------------------------*/
check_mark=check2(Xk,xlable,ylable);
if(check_mark)
{ out_lable=0;
continue;
}
/************通过匹配最终判定发送的号码********************/
/*if(!out_lable)
{
output(xlable,ylable);
out_lable=1;
}*/
if(!out_lable)
{
com=compare(identity_x,identity_y,xlable,ylable); //与上次比较
if (com) {identity_x=xlable; identity_y=ylable; continue;} // 不一致则进行下次循环
else //如果两次号码一致则输出
{
identity_x=xlable; identity_y=ylable;
output(xlable,ylable);
out_lable=1;
}
}
} //k循环结束
fclose(fp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -