📄 sound classify.cpp
字号:
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 + -