最近在做语音识别的东西,现在需要写个mfcc。每天写一部分。希望大家多多指教。其中肯定会有不少错误。请大家多多指出:注释:wave.txt 存放一系列整数数据 时间:7月20号第一次#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define pi 3.14159265
//i,n,t.为一般的参数,可重复使用
void main()
{
//********************************
// 将wave文件数据读到x数组中
//********************************
FILE *fp;
int i,n=0;
int x[9201];
int *j = (int*)malloc(sizeof(int));
fp=fopen("wave.txt","r");
if(fp==NULL)
printf("File open error\n"); while (!feof(fp))
{
fscanf(fp, "%d", j);
x[n++]=*j;
}
free(j);
i=fclose(fp);
if(i!=0)
printf("File close error\n");
//********************************
//函数名称:enframe
// 函数功能:语音分帧
// 输入参数:xx---分帧后的数据
// x---需要分帧的数据
// len---每一帧数据的长度
// inc---下一帧移动长度
//********************************
int inc=80;
int t=0;
n=80;
int xx[51][256];
for(i=0;i<51;i++) //初始化xx数组
for(t=0;t<256;t++)
xx[i][t]=0;
for(i=0;i<51;i++)
{n=n-inc; //下一帧往回倒数inc个点
for(t=0;t<256;t++)
{
if(n<9201)
{
xx[i][t]=x[n++];
printf("%d\n",xx[i][t]);
}
else break ;
}
}
FILE *ft;
ft=fopen("out.txt","w");
for(i=0;i<51;i++)
{fputs("\n",ft);
for(t=0;t<256;t++)
fprintf(ft,"%d ",xx[i][t]); }
/*//这部分应该有点问题 出来的数据太大。不知道怎么处理??????????????????????
//********************************
//函数名称:haming
// 函数功能:给每帧数据加上汉明窗
// 输入参数:xx---需要加窗的数组
// win---窗函数
// addw---加窗后的数组
//********************************
double win[255],addw[111][255];
for(i=0;i<255;i++)
win[i]=0.54-0.46*cos((double)((2*pi*i)/255));
// for(i=0;i<255;i++)
// printf("%f\n",win[i]);
for(i=0;i<111;i++)
for(t=0;t<255;t++)
addw[i][t]=xx[i][t]*win[i];// for(i=0;i<111;i++)
// for(t=0;t<255;t++)
// printf("%d\n",addw[i][t]);*/}
#include <stdlib.h>
#include <math.h>
#define pi 3.14159265
//i,n,t.为一般的参数,可重复使用
void main()
{
//********************************
// 将wave文件数据读到x数组中
//********************************
FILE *fp;
int i,n=0;
int x[9201];
int *j = (int*)malloc(sizeof(int));
fp=fopen("wave.txt","r");
if(fp==NULL)
printf("File open error\n"); while (!feof(fp))
{
fscanf(fp, "%d", j);
x[n++]=*j;
}
free(j);
i=fclose(fp);
if(i!=0)
printf("File close error\n");
//********************************
//函数名称:enframe
// 函数功能:语音分帧
// 输入参数:xx---分帧后的数据
// x---需要分帧的数据
// len---每一帧数据的长度
// inc---下一帧移动长度
//********************************
int inc=80;
int t=0;
n=80;
int xx[51][256];
for(i=0;i<51;i++) //初始化xx数组
for(t=0;t<256;t++)
xx[i][t]=0;
for(i=0;i<51;i++)
{n=n-inc; //下一帧往回倒数inc个点
for(t=0;t<256;t++)
{
if(n<9201)
{
xx[i][t]=x[n++];
printf("%d\n",xx[i][t]);
}
else break ;
}
}
FILE *ft;
ft=fopen("out.txt","w");
for(i=0;i<51;i++)
{fputs("\n",ft);
for(t=0;t<256;t++)
fprintf(ft,"%d ",xx[i][t]); }
/*//这部分应该有点问题 出来的数据太大。不知道怎么处理??????????????????????
//********************************
//函数名称:haming
// 函数功能:给每帧数据加上汉明窗
// 输入参数:xx---需要加窗的数组
// win---窗函数
// addw---加窗后的数组
//********************************
double win[255],addw[111][255];
for(i=0;i<255;i++)
win[i]=0.54-0.46*cos((double)((2*pi*i)/255));
// for(i=0;i<255;i++)
// printf("%f\n",win[i]);
for(i=0;i<111;i++)
for(t=0;t<255;t++)
addw[i][t]=xx[i][t]*win[i];// for(i=0;i<111;i++)
// for(t=0;t<255;t++)
// printf("%d\n",addw[i][t]);*/}
int t=0;
n=80;
int xx[51][256];
...
double win[255],addw[111][255]; 像80,51,111,255这些东西最好能在开始的地方
#define XXXX 80
#define YYYY 51
...
或者
const int XXXX = 80;
const int YYYY = 51;
...程序中用XXXX,YYYY.比较好维护,一旦这些数字有变动,只需要变一个地方