📄 creatfeature.cpp
字号:
/*******************************************************************
**** 文件: CreatFeature.cpp ****
**** 功能: 生成特征矩阵 ****
**** ****
**** 修改记录: 2001.7.23 摘自G.732.1 ****
*******************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>
#include "Head.h"
//#include "Read_Dat.h"
#include "mfcc_xhg.h"
int ExtractFeature(char *filename_in, char *filename_VadOut);
//特征提取程序
void main(int argc,char **argv)
{
if(argc!= 3) {
printf("Usage: endpointD <sourcefilename.dat> <endpoint.txt>\n");
exit(0);
}
char sourcefilename[100], endpointfilename[100];
strcpy(sourcefilename,argv[1]);
strcpy(endpointfilename, argv[2]);
int returnflag;
returnflag=ExtractFeature(sourcefilename, endpointfilename);
printf("Finished !\n");
}
//函数名:ExtractFeature
//传入参数:输入语音文件名 filename_in,输出文件名filename_Cepout
// 添加到文件头中的额外信息
//返回是否成功的标志,0为失败,1为成功
//说明:提取LPCC特征数据函数
int ExtractFeature(char *filename_in, char *filename_Vadout)
{
FILE *fp_in, *fp_Vadout;
//与语音数据相关的变量
long testflag;
short StartFrame,EndFrame;
long SentenceLength_Byte=0;
long lStartPnt, lEndPnt;
long lSampleRate;
//与特征提取相关的变量
short *VoiceData_Short = NULL;//16bit
wav_pcm_header62 WavHead;
fp_in = fopen(filename_in,"rb");
fp_Vadout = fopen(filename_Vadout, "w+");
if((fp_in==NULL)||(fp_Vadout == NULL))
return 0;
memset(&WavHead,0,sizeof(wav_pcm_header62));
fread(&WavHead,sizeof(wav_pcm_header62),1,fp_in);
printf("\n Now the voice data come from file: %s",filename_in);
printf("\t output: %s\n",filename_Vadout);
printf("Format:%s Channel:%d SampleRate: %d Bits: %d \n",WavHead.ChunkID,WavHead.NumChannels,WavHead.SampleRate,WavHead.BitsPerSample);
/*
int SentenceLength_L,SentenceLength_H;
SentenceLength_L=WavHead.SubChun2Size;
SentenceLength_H=(WavHead.SubChun2Size1 <<16);
SentenceLength_Byte=SentenceLength_L+SentenceLength_H;
printf("FactId: FactDytes:%d FactData:%d SubChunk2ID: %s SubChun2Size: %d \n",
WavHead.FactDytes,WavHead.FactData, WavHead.SubChunk2ID, WavHead.SubChun2Size);
*/
SentenceLength_Byte=WavHead.SubChun2Size;
printf(" Audio data size:%d \n",SentenceLength_Byte);
fprintf(fp_Vadout, "The file information:\n");
fprintf(fp_Vadout, "Format:%s Channel:%d SampleRate: %d Bits: %d \n",WavHead.Format,WavHead.NumChannels,WavHead.SampleRate,WavHead.BitsPerSample);
fprintf(fp_Vadout, "Audio data size:%d\n", SentenceLength_Byte);
lSampleRate=WavHead.SampleRate;
printf("%d\n",sizeof(WavHead));
printf("%s %d \n",WavHead.SubChunk2ID,WavHead.SubChun2Size);
// if(fseek(fp_in,sizeof(WavHead),SEEK_SET)!=0)
// printf("fseek error!\n");
/*
VoiceData_Short=(short *)malloc(SentenceLength_Byte);//返回内存指针,注意为什么要转换为short
printf("VoiceData_Short 0x%x\n",VoiceData_Short);
testflag=0L;
testflag=fread(VoiceData_Short,sizeof(short),SentenceLength_Byte/2,fp_in);//返回元素个数:SentenceLength_Byte/2
printf("SentenceLength_Byte :%ld\n",SentenceLength_Byte);
printf("Read byte %ld\n",testflag*sizeof(short));
对没有头文件的wav处理
VoiceData_Short=VoiceData_Short+2000;
StartEnd(VoiceData_Short, (SentenceLength_Byte/2-2000), &lStartPnt, &lEndPnt,&StartFrame,&EndFrame,lSampleRate);
//printf("====================");
//输出端点结果
fprintf(fp_Vadout, "The frame :\t%ld to %ld\n", StartFrame,EndFrame);
fprintf(fp_Vadout, "The samples point:\t%ld to %ld\n", lStartPnt, lEndPnt);
//删除内存的分配
if(VoiceData_Short!=NULL)
{
free(VoiceData_Short);
VoiceData_Short=NULL;
}
*/
//关闭文件
printf("\n");
fclose(fp_in);
fclose(fp_Vadout);
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -