📄 sound classify.c
字号:
#include "stdlib.h"
#include "stdio.h"
#include "math.h"
//#include "windows.h"
#define datanum1 1
#define elementnum1 20
//#define PI 3.1415926535897932384626433832795
#define PI (4*atan(1))
//门限函数f(x)
double f(double x)
{
return(1/(1+exp(-x)));
}
//门限函数求导f'(x)
double df(double x)
{
return(f(x)*(1-f(x)));
}
//读取原始数据
//datanum原始数据文件个数
//elementnum每个文件中提取数据个数
//name原始文件通配名称
//data原始数据存放的数组指针
//totalelement每个原始文件中实际提取数据个数
void readdata(int datanum,int elementnum,char name[20],int **data,int *totalelement)
{
FILE *ep;
char inputfile[30];
int i,j,k;
for(i=0;i<datanum;i++)
{
sprintf(inputfile,"%s%d.dat",name,i);
ep=fopen(inputfile,"rb+");
if(ep==NULL)
{
printf("\nSorry,the file name that you input: %s dose not exist!\n",inputfile);
exit(0);
}
for(j=0;j<elementnum;j++)
if(fscanf(ep,"%d",&data[i][j])==EOF) break;
//将不够elementnum要求的数据补零
if(j<elementnum)
for(k=j;k<elementnum;k++) data[i][k]=0;
totalelement[i]=j;
printf("totalelement[%d]=%d\n",i,totalelement[i] );
for(j=0;j<elementnum;j++)
printf("data[%d][%d]=%d\n",i,j,data[i][j]);
fclose(ep);
}
}
/*
fft(int N,double *real,double *image,int if_fft)
{
int i,j,k,m,cache,no1,no2;
double a,b,temp1r,temp1i,temp2r,temp2i;
//码位倒读
frexp(N,&m);
// printf("m=%d\n",m);
m-=1;
for(i=0;i<N/2;i++)
{
k=i;
cache=0;
for(j=0;j<m;j++)
{
cache+=k%2*pow(2,m-1-j);
k/=2;
}
if(cache>i)
{
a=real[cache];b=image[cache];
real[cache]=real[i];image[cache]=image[i];
real[i]=a;image[cache]=b;
}
printf("\ni=%d\ncache=%d\n",i,cache);
}
//碟形运算
//第几级
for(i=0;i<m;i++)
{
//第几群
for(j=0;j<pow(2,m-i-1);j++)
{
//第几行
for(k=0;k<=pow(2,i);k++)
{
no1=pow(2,i+1)*j-1+k;
no2=pow(2,i+1)*j+pow(2,i)+k;
temp1r=real[no1];
temp1i=image[no1];
temp2r=real[no2];
temp2i=image[no2];
a=cos(2*PI/N*pow(2,m-i-1)*k);
b=sin(2*PI/N*pow(2,m-i-1)*k);
real[no1]=temp1r+temp2r*a+temp2i*b;
image[no1]=temp1i-temp2r*b+temp2i*a;
real[no2]=temp1r-temp2r*a-temp2i*b;
image[no2]=temp1i+temp2r*b-temp2i*a;
}
}
}
for(i=0;i<N;i++) printf("real[%d]=%f image[%d]=%f\n",i,real[i],i,image[i]);
printf("\nm=%d\n",m);
}
*/
void fft(double *rx,double *ix,int n,int ctrl)
{
int i,j,k,m,num,t;
double temp1,temp2,temp3,re,im;
if (ctrl!=0)
ctrl=1;
//码位倒置
temp1=n; m=0;
while(temp1!=1)
{
temp1/=2;
m++;
}
for (i=0;i<n;i++)
{
num=0;
t=i;
for (j=0;j<m;j++)
{
num+=(t%2)*int(pow(2,(m-1-j)));
t=(t-t%2)/2;
}
if(num>i)
{
temp1=*(rx+i);
temp2=*(ix+i);
*(rx+i)=*(rx+num);
*(ix+i)=*(ix+num);
*(rx+num)=temp1;
*(ix+num)=temp2;
}
}
//蝶形运算
for (i=0;i<m;i++)
{
for (j=0;j<(n/int(pow(2,(i+1))));j++)
{
for (k=0;k<int(pow(2,i));k++)
{
t=k+j*int(pow(2,(i+1)));
re=rx[t+int(pow(2,i))]*cos(2*PI*k/pow(2,(i+1)))+pow(-1,ctrl)*ix[t+int(pow(2,i))]*sin(2*PI*k/pow(2,(i+1)));
im=ix[t+int(pow(2,i))]*cos(2*PI*k/pow(2,(i+1)))-pow(-1,ctrl)*rx[t+int(pow(2,i))]*sin(2*PI*k/pow(2,(i+1)));
temp1=rx[t]+re;
temp2=rx[t]-re;
temp3=ix[t]+im;
ix[t+int(pow(2,i))]=ix[t]-im;
rx[t]=temp1;
rx[t+int(pow(2,i))]=temp2;
ix[t]=temp3;
}
}
}
if (ctrl==1)
{
for (i=0;i<n;i++)
{
*(rx+i)/=n;
*(ix+i)/=n;
}
}
return;
}
main()
{
double f();
double df();
void readdata();
void fft();
int i,j,*totalelement,**data,dpk[3],N=8;
double *opi,*opj,opk[3],*netpj,*netpk,*real,*image;
data=(int **)malloc(datanum1*sizeof(int*));
for(i=0;i<datanum1;i++)
data[i]=(int *)malloc(elementnum1*sizeof(int));
totalelement=(int *)malloc(datanum1*sizeof(int));
real=(double *)malloc(N*sizeof(double));
image=(double *)malloc(N*sizeof(double));
/* for(i=0;i<N;i++)
{
real[i]=0;
image[i]=0;
printf("real[%d]=%f image[%d]=%f\n",i,real[i],i,image[i]);
}
*/
readdata(datanum1,elementnum1,"B",data,totalelement);
/* for(i=0;i<datanum1;i++)
{
opi=(double*)malloc(j*sizeof(double));
opj=(double*)malloc(j*sizeof(double));
opk=(double*)malloc(j*sizeof(double));
netpj=(double*)malloc(j*sizeof(double));
netpk=(double*)malloc(j*sizeof(double));
}*/
for(i=0;i<N;i++)
{
real[i]=data[0][i];
image[i]=0;
// printf("data[i][%d]=%d real[%d]=%f image[%d]=%f\n",i,data[0][i],i,real[i],i,image[i]);
}
fft(real,image,N,0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -