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

📄 dsp_main.cpp

📁 本程序用于检测音频文件中是否具有DTMF信号
💻 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 + -