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

📄 sound classify.cpp

📁 神经网络中的声速测定的源代码 学神经网络的必用程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	image=(double *)malloc(fftnum*sizeof(double));
	
	//输入原始数据,名称name必须含有统一通配符,加数字编号,从1开始
	readdata(samplenum,fftnum,name,para,totalelement);
	//对每个文件里的数据进行fft变换,求参数
	add=para;
	cache=(fftnum/2-1)/3;
	c=1;
	for(n=0;n<samplenum;n++)
	{
		//赋初值
		for(i=0;i<fftnum;i++)
		{
			real[i]=add->data[i];
			image[i]=0;
		//	printf("data[%d][%d]=%d  real[%d][%d]=%f  image[%d][%d]=%f\n",n,i,add->data[i],n,i,real[n][i],n,i,image[n][i]);
		}
		//fft变换
		fft(fftnum,real,image,1);
		//求参数
	//	printf("\n%d",n+1);
		cal_parameter(128,real,image,add);
				
		netpara->doori[0]+=(add->mean*c);
		netpara->doori[1]+=(add->delta*c);
		netpara->doori[2]+=(add->delta16*c);
		netpara->doori[3]+=(add->energy*c);
		netpara->doori[4]+=(add->energy16*c);
		netpara->doori[5]+=(double)((add->emax/cache)*c);
		netpara->doori[6]+=(add->mo0*c);
		add++;
	}
	free(real);
	free(image);

	for(i=0;i<N;i++) 
	{
		netpara->doori[i]/=samplenum;
	//	printf("\nbetpara->doori[%d]=%f",i,netpara->doori[i]);
	}

	add=para;
	for(i=0;i<samplenum;i++)
	{
		free(add->data);
		add++;
	}

	//求每类文件个数
	judge=samplenum/3;
	temp=L/3;
	
	//迭代开始,最多循环iteration次
	for(l=0;l<netpara->iteration;l++)
	{
		//输入samplenum个原始文件
		enew=0;
		add=para;
		for(i=0;i<(N+1);i++)
			for(j=0;j<M;j++)
				awji[j][i]=0;
		for(i=0;i<L;i++)
			for(j=0;j<(M+1);j++)
				awkj[i][j]=0;
		
		for(n=0;n<samplenum;n++)
		{
			for(i=0;i<L;i++) ydk[i]=0;
			//数组初始化
			for(i=0;i<M;i++)
			{
				deltaj[i]=0;
				netpj[n][i]=0;
			}
			for(i=0;i<L;i++) 
			{
				deltak[i]=0;
				netpk[n][i]=0;
			}
			//得到输入层神经元输出结果
			cache=(double)add->emax/(fftnum/2-1)*3;
			opi[n][0]=netpara->door;
			opi[n][1]=f(add->mean/netpara->doori[0]-netpara->c);
			opi[n][2]=f(add->delta/netpara->doori[1]-netpara->c);
			opi[n][3]=f(add->delta16/netpara->doori[2]-netpara->c);
			opi[n][4]=f(add->energy/netpara->doori[3]-netpara->c);
			opi[n][5]=f(add->energy16/netpara->doori[4]-netpara->c);
			opi[n][6]=f(cache/netpara->doori[5]-netpara->c);
			opi[n][7]=f(add->mo0/netpara->doori[6]-netpara->c);
			
//			for(i=0;i<N+1;i++) printf("\nopi[%d][%d]=%f",n,i,opi[n][i]);
			//隐层输入量
			for(j=0;j<M;j++)
				for(i=0;i<(N+1);i++)
					netpj[n][j]+=netpara->wji[j][i]*opi[n][i];
//			for(j=0;j<M;j++) printf("\nnetpj[%d][%d]=%f",n,j,netpj[n][j]);
			
			//隐层输出
			for(j=0;j<M;j++) opj[n][j]=f(netpj[n][j]);
			opj[n][M]=netpara->door;
	//		for(j=0;j<M;j++) printf("\nopj[%d][%d]=%f",n,j,opj[n][j]);
			//输出层输入
			for(k=0;k<L;k++)
				for(j=0;j<(M+1);j++)
					netpk[n][k]+=netpara->wkj[k][j]*opj[n][j];
	//		for(k=0;k<L;k++) printf("\nnetpk[%d][%d]=%f",n,k,netpk[n][k]);
			//输出层输出opk和此样本输出与期望输出的误差能量ep
			for(k=0;k<L;k++)
			{
			//	for(i=0;i<L;i++) ydk[i]=0;
				opk[n][k]=f(netpk[n][k]);
				if(n<judge)
				{
					ydk[temp-1]=1;
				}
				else if(judge<=n&&n<2*judge)
				{
					ydk[temp-1]=0;
					ydk[temp*2-1]=1;
				}
					else
					{
						ydk[temp*2-1]=0;
						ydk[temp*3-1]=1;
					}
		//		printf("\nopk[%d][%d]=%f	ydk[%d]=%f",n,k,opk[n][k],k,ydk[k]);
				enew+=.5*pow(opk[n][k]-ydk[k],2);
			}
		//	printf("\n");
			//输出对隐层的权值变化量
			for(k=0;k<L;k++)
			{
				deltak[k]=(ydk[k]-opk[n][k])*df(netpk[n][k]);
				for(j=0;j<(M+1);j++)
					awkj[k][j]+=(1/pow(l+1,0.25))*deltak[k]*opj[n][j];
				//	awkj[k][j]+=netpara->u1*deltak[k]*opj[n][j];
			}
			//隐层对输入层的权值变化量	
			for(j=0;j<M;j++)
			{
				for(k=0;k<L;k++)
					deltaj[j]+=deltak[k]*netpara->wkj[k][j]*df(netpj[n][j]);
				for(i=0;i<(N+1);i++)
					awji[j][i]+=(1/pow(l+1,0.25))*deltaj[j]*opi[n][i];
					//awji[j][i]+=netpara->u2*deltaj[j]*opi[n][i];
			}
			add++;
		}
/*		for(j=0;j<M;j++)
			for(i=0;i<N;i++)
				printf("\nawji[%d][%d]=%f",j,i,awji[j][i]);
		for(j=0;j<M;j++)
			for(i=0;i<L;i++)
				printf("\nawkj[%d][%d]=%f",i,j,awkj[i][j]);
*/		//判断总能量是否达到门限doore的要求,达到退出迭代,否则继续迭代
		if(l<bmpdata.biwidth*32)
		{
			bmpdata.blue[(int)(bmpdata.biheight-enew*5)][l/32]=0;
			bmpdata.green[(int)(bmpdata.biheight-enew*5)][l/32]=0;
		}
		if(l==0) 
		{
			elast=enew;
			printf("\n%d	E=%f",l,enew);
		}	
		else
		{
			printf("\n%d	E=%f   E1=%f",l,enew,enew/samplenum);
			if(fabs(elast-enew)<10e-7)
			{
				printf("\nThe BP_NN has convergenced,go to classify now!");
				writebmp(&bmpdata,"迭代能量.bmp");
				output_w(N,M,L,netpara,"w.dat");
				free_color_array(&bmpdata);
				return;
			}
			elast=enew;
		}
		//新的各层间权值
		for(k=0;k<L;k++)
			for(j=0;j<(M+1);j++)
				netpara->wkj[k][j]+=awkj[k][j];
		for(j=0;j<M;j++)
			for(i=0;i<(N+1);i++)
				netpara->wji[j][i]+=awji[j][i];
	}
	
	free(deltaj);
	free(deltak);
	free(totalelement);
	freearray(L,awkj);
	freearray(M,awji);
	freearray(samplenum,opi);
	freearray(samplenum,opj);
	freearray(samplenum,opk);
	freearray(samplenum,netpj);
	freearray(samplenum,netpk);

	writebmp(&bmpdata,"迭代能量.bmp");
	output_w(N,M,L,netpara,"w.dat");
	free_color_array(&bmpdata);
	
//	printf("\nThe BP_NN reach the max iteration times,abort for not convergence!\n");
}
//BP神经网络识别函数
//samplenum是所有三类样本点个数
//fftnum是从每个样本文件中提取的数值个数,也是fft变换的点数
//name是测试样本的文件名通配符
//N,M,L分别是输入层,隐层,输出层神经元个数
//para是存放所有样本fft变换之后所得数据的结构体数组指针
//netpara存放输入层门限值和权值矩阵
//result存放保存测试样本输出层结果的文件名
void bpnet_classify(int samplenum,int fftnum,char name[20],int N,int M,int L,struct parameter *para,struct netpara *netpara,char result[20])
{
	//judge是每类样本个数
	//totalelement是每个样本文件所得有用数据个数
	int i,j,k,m,n,temp,judge,*totalelement,class1=0,class2=0,class3=0;
	int right1=0,right2=0,right3=0,wrong12=0,wrong13=0,wrong21=0,wrong23=0,wrong31=0,wrong32=0;
	//netpj,netpk是隐层,输出层净输入
	//opi,opj,opk是输入层,隐层,输出层神经元的输出
	double **real,**image,**opi,**opj,**opk,**netpj,**netpk;
	//ydk是期望输出量
	double *ydk;
	//求deltaj时的数据缓存
	double cache;
	struct parameter *add;
	FILE *ep;
	 
	//分配空间
	opi=(double**)malloc(samplenum*sizeof(double*));
	for(i=0;i<samplenum;i++)
		opi[i]=(double*)malloc((N+1)*sizeof(double));
	opj=(double**)malloc(samplenum*sizeof(double*));
	for(i=0;i<samplenum;i++)
		opj[i]=(double*)malloc((M+1)*sizeof(double));
	opk=(double**)malloc(samplenum*sizeof(double*));
	for(i=0;i<samplenum;i++)
		opk[i]=(double*)malloc(L*sizeof(double));

	ydk=(double*)malloc(L*sizeof(double));

	netpj=(double**)malloc(samplenum*sizeof(double*));
	for(i=0;i<samplenum;i++)
		netpj[i]=(double*)malloc(M*sizeof(double));
	netpk=(double**)malloc(samplenum*sizeof(double*));
	for(i=0;i<samplenum;i++)
		netpk[i]=(double*)malloc(L*sizeof(double));
	
	//分配空间
	if(para->data==NULL)
	{
		add=para;
		for(i=0;i<samplenum;i++)
		{
			add->data=(int *)malloc(fftnum*sizeof(int));
			add++;
		}
	}
	//读取训练好的网络门限和权值矩阵
	load_w(N,M,L,netpara,"w.txt");
	
/*	for(j=0;j<M;j++)
		for(i=0;i<N;i++)
			printf("\nnetpara->wji[%d][%d]=%f",j,i,netpara->wji[j][i]);
	for(j=0;j<M;j++)
		for(i=0;i<L;i++)
			printf("\nnetpara->wkj[%d][%d]=%f",i,j,netpara->wkj[i][j]);
*/
	totalelement=(int *)malloc(samplenum*sizeof(int));

	real=(double **)malloc(samplenum*sizeof(double*));
	for(i=0;i<samplenum;i++)
		real[i]=(double *)malloc(fftnum*sizeof(double));
	
	image=(double **)malloc(samplenum*sizeof(double*));
	for(i=0;i<samplenum;i++)
		image[i]=(double *)malloc(fftnum*sizeof(double));

	//输入原始数据,名称必须含有统一通配符,加数字编号,从1开始
	readdata(samplenum,fftnum,name,para,totalelement);
	//对每个文件里的数据进行fft变换,求参数
	add=para;
	for(n=0;n<samplenum;n++)
	{
		//赋初值
		for(i=0;i<fftnum;i++)
		{
			real[n][i]=add->data[i];
			image[n][i]=0;
		//	printf("data[%d][%d]=%d  real[%d][%d]=%f  image[%d][%d]=%f\n",n,i,add->data[i],n,i,real[n][i],n,i,image[n][i]);
		}
		//fft变换
		fft(fftnum,real[n],image[n],1);
		//求参数
		cal_parameter(128,real[n],image[n],add);
		add++;
	}
	freearray(samplenum,real);
	freearray(samplenum,image);

	//新建保存结果的文件
	if((ep=fopen(result,"wt+"))==NULL)
	{
		printf("\nSorry can not write the file %s!\n",result);
		exit(0);
	}
	fprintf(ep,"\nThe result of output level is:\n");
	//求每类文件个数
	judge=samplenum/3;
	temp=L/3;

	for(i=0;i<L;i++) ydk[i]=0;
	//识别开始
	//输入samplenum个原始文件
	add=para;
	for(n=0;n<samplenum;n++)
	{
		//数组初始化
		for(i=0;i<M;i++) netpj[n][i]=0;
		for(i=0;i<L;i++) netpk[n][i]=0;
		//得到输入层神经元输出结果
		cache=(double)add->emax/(fftnum/2-1)*3;
	//	netpara->doori=(add->mean+add->delta+add->delta16+add->energy+add->energy16+cache)/6;
		opi[n][0]=netpara->door;
		opi[n][1]=f(add->mean/netpara->doori[0]-netpara->c);
		opi[n][2]=f(add->delta/netpara->doori[1]-netpara->c);
		opi[n][3]=f(add->delta16/netpara->doori[2]-netpara->c);
		opi[n][4]=f(add->energy/netpara->doori[3]-netpara->c);
		opi[n][5]=f(add->energy16/netpara->doori[4]-netpara->c);
		opi[n][6]=f(cache/netpara->doori[5]-netpara->c);
		opi[n][7]=f(add->mo0/netpara->doori[6]-netpara->c);
	//	for(i=0;i<(N+1);i++) printf("\nopi[%d][%d]=%f",n,i,opi[n][i]);

		//隐层输入量
		for(j=0;j<M;j++)
			for(i=0;i<(N+1);i++)
				netpj[n][j]+=netpara->wji[j][i]*opi[n][i];
	//	for(j=0;j<M;j++) printf("\nnetpj[%d][%d]=%f",n,j,netpj[n][j]);
		
		//隐层输出
		for(j=0;j<M;j++) opj[n][j]=f(netpj[n][j]);
		opj[n][M]=netpara->door;
	//	for(j=0;j<M;j++) printf("\nopj[%d][%d]=%f",n,j,opj[n][j]);
		//输出层输入
		for(k=0;k<L;k++)
			for(j=0;j<(M+1);j++)
				netpk[n][k]+=netpara->wkj[k][j]*opj[n][j];
	 //	for(k=0;k<L;k++) printf("\nnetpk[%d][%d]=%f",n,k,netpk[n][k]);
		//输出层输出opk和此样本输出
		for(k=0;k<L;k++)
		{
			opk[n][k]=f(netpk[n][k]);
			if(n<judge)
			{
				ydk[temp-1]=1;
			}
			else if(judge<=n&&n<2*judge)
			{
				ydk[temp-1]=0;
				ydk[temp*2-1]=1;
			}
				else
				{
					ydk[temp*2-1]=0;
					ydk[temp*3-1]=1;
				}
			fprintf(ep,"\nopk[%d][%d]=%f	ydk[%d]=%f",n,k,opk[n][k],k,ydk[k]);
		}
		
		cache=opk[n][0];
		m=0;
		for(i=0;i<L;i++)
			if(cache<opk[n][i])
			{
				cache=opk[n][i];
				m=i;
			}
		if(m<temp)
		{
			fprintf(ep,"\nThe test sample: %d is belong to the 1st class--Bicycle",n+1);
			class1++;
			if(n<judge) right1++;
			else if(judge<=n&&n<2*judge) wrong21++;
			else wrong31++;
		}
		else if(temp<=m&&m<2*temp)
		{
			fprintf(ep,"\nThe test sample: %d is belong to the 2ed class--Truck",n+1);
			class2++;
			if(n<judge) wrong12++;
			else if(judge<=n&&n<2*judge) right2++;
			else wrong32++;
		}
		else
		{
			fprintf(ep,"\nThe test sample: %d is belong to the 3rd class--Walker",n+1);
			class3++;
			if(n<judge) wrong13++;
			else if(judge<=n&&n<2*judge) wrong23++;
			else right3++;
		}
	//	printf("\nopkmax=%d",m);
		add++;
	}
		
	fprintf(ep,"\nThe total number of Bicycle is %d",class1);
	fprintf(ep,"\nThe total number of Truck is %d",class2);
	fprintf(ep,"\nThe total number of Walker is %d\n",class3);
	fprintf(ep,"\nThe right classified rate of Bicycle is %f  (%d)",(double)right1/judge,right1);
	fprintf(ep,"\nThe right classified rate of Truck is %f  (%d)",(double)right2/judge,right2);
	fprintf(ep,"\nThe right classified rate of Walker is %f  (%d)\n",(double)right3/judge,right3);
	fprintf(ep,"\nThe error rate of Bicycle classified to Truck is %f  (%d)",(double)wrong12/judge,wrong12);
	fprintf(ep,"\nThe error rate of Bicycle classified to WAlker is %f  (%d)\n",(double)wrong13/judge,wrong13);
	fprintf(ep,"\nThe error rate of Truck classified to Bicycle is %f  (%d)",(double)wrong21/judge,wrong21);
	fprintf(ep,"\nThe error rate of Truck classified to WAlker is %f  (%d)\n",(double)wrong23/judge,wrong23);
	fprintf(ep,"\nThe error rate of WAlker classified to Bicycle is %f  (%d)",(double)wrong31/judge,wrong31);
	fprintf(ep,"\nThe error rate of WAlker classified to Truck is %f  (%d)\n",(double)wrong32/judge,wrong32);
	fclose(ep);

	printf("\nThe total number of Bicycle is %d",class1);
	printf("\nThe total number of Truck is %d",class2);
	printf("\nThe total number of Walker is %d\n",class3);
	printf("\nThe right classified rate of Bicycle is %f  (%d)",(double)right1/judge,right1);
	printf("\nThe right classified rate of Truck is %f  (%d)",(double)right2/judge,right2);
	printf("\nThe right classified rate of Walker is %f  (%d)\n",(double)right3/judge,right3);
	printf("\nThe error rate of Bicycle classified to Truck is %f  (%d)",(double)wrong12/judge,wrong12);
	printf("\nThe error rate of Bicycle classified to WAlker is %f  (%d)\n",(double)wrong13/judge,wrong13);
	printf("\nThe error rate of Truck classified to Bicycle is %f  (%d)",(double)wrong21/judge,wrong21);
	printf("\nThe error rate of Truck classified to WAlker is %f  (%d)\n",(double)wrong23/judge,wrong23);
	printf("\nThe error rate of WAlker classified to Bicycle is %f  (%d)",(double)wrong31/judge,wrong31);
	printf("\nThe error rate of WAlker classified to Truck is %f  (%d)\n",(double)wrong32/judge,wrong32);

	

	free(totalelement);
	add=para;
	for(i=0;i<samplenum;i++)
	{
		free(add->data);
		add++;
	}
	freearray(samplenum,opi);
	freearray(samplenum,opj);
	freearray(samplenum,opk);
	freearray(samplenum,netpj);
	freearray(samplenum,netpk);
	
}	


void main()
{
	double f();
	double df();
	
	int i,j,N=7,M=15,L=3,NN=1024;
	struct parameter para1[train],para2[test],*add;
	struct netpara netpara;

	add=para1;
	for(i=0;i<train;i++)	
	{
		initial_para(add);
		add++;
	}
	
	netpara.doori=(double*)malloc(N*sizeof(double));
//	netpara.doori=(int*)malloc(N*sizeof(int));
	initial_net(N,&netpara);

	//wji,wkj是隐层和输出层对前级的权值系数
	if(netpara.wji==NULL)
	{
		netpara.wji=(double**)malloc(M*sizeof(double*));
		for(j=0;j<M;j++)
			netpara.wji[j]=(double*)malloc((N+1)*sizeof(double));
	
		netpara.wkj=(double**)malloc(L*sizeof(double*));
		for(j=0;j<L;j++)
			netpara.wkj[j]=(double*)malloc((M+1)*sizeof(double));
	}

//	bpnet(train,NN,"sample",N,M,L,para1,&netpara);

/*	
	for(i=0;i<N;i++)
		for(j=0;j<M;j++)
			printf("\nnetpara.wji[%d][%d]=%f",j,i,netpara.wji[j][i]);

	printf("\n");

	for(j=0;j<M;j++)
		for(i=0;i<L;i++)
			printf("\nnetpara.wkj[%d][%d]=%f",i,j,netpara.wkj[i][j]);
	
	*/
	add=para2;
	for(i=0;i<test;i++)
	{
		initial_para(add);
		add++;
	}

	bpnet_classify(test,NN,"test",N,M,L,para2,&netpara,"result.dat");
	
	for(i=0;i<N;i++)
		for(j=0;j<M;j++)
			printf("\nnetpara.wji[%d][%d]=%f",j,i,netpara.wji[j][i]);

	printf("\n");

	for(j=0;j<M;j++)
		for(i=0;i<L;i++)
			printf("\nnetpara.wkj[%d][%d]=%f",i,j,netpara.wkj[i][j]);

/*	add=para;
	for(i=0;i<train;i++)
	{
		printf("\n%d emax=%d emax1=%f energy=%f mean=%f delta=%f",i,add->emax,(double)add->emax/(NN/2-1)*3,add->energy,add->mean,add->delta);
		add++;
	}

*/

}


/*
FILE *stream;

void main( void )
{
   long l;
   double fp;
   char s[81];
   char c;

   stream = fopen( "fscanf.out", "w+" );
   if( stream == NULL )
      printf( "The file fscanf.out was not opened\n" );
   else
   {
      fprintf( stream, " %f%c", 3.14159, 'x' );

     fseek( stream, 0L, SEEK_SET );

      
      fscanf( stream, "%f", &fp );
      fscanf( stream, "%c", &c );

      printf( "%f\n", fp );
      printf( "%c\n", c );

      fclose( stream );
   }
}
*/

⌨️ 快捷键说明

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