最近在做语音识别的东西,现在需要写个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]);*/}

解决方案 »

  1.   

    int inc=80; 
    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.比较好维护,一旦这些数字有变动,只需要变一个地方
      

  2.   

    谢谢楼上的建议。我修改一下。回复yansh:出来的数据太大是:每个数据都类似:5648963215;像这么大的数据要在嵌入式里面跑是不行的,所以不知道应该怎么去处理。让它可以在16位的嵌入式系统也能用