DAT_File_Access.cpp
上传用户:avbj512
上传日期:2013-09-18
资源大小:6239k
文件大小:10k
源码类别:

DSP编程

开发平台:

Visual C++

  1. // DAT_File_Access.cpp:
  2. // Implementation of the DAT_File_Access Module.
  3. // That is Data Structure & Access Function of .dat File format.
  4. //
  5. // Created 2001/08, By DongMing, MDSR.
  6. //
  7. //////////////////////////////////////////////////////////////////////
  8. #include "stdafx.h"
  9. #include "DAT_File_Access.h"
  10. #include "kwspot.h"
  11. extern PRO_CONFIG u_Pro_Config;
  12. //////////////////////////////////////////////////////////////////////
  13. // API functions
  14. //////////////////////////////////////////////////////////////////////
  15. // 函数名称:dfa_Feature_Get_File_Info
  16. // 函数功能:从.DAT格式的Feature文件读入文件头信息
  17. // 函数性质:API
  18. // 输入参数:
  19. // sz_Feature_File_Name,Feature文件的文件名
  20. // 输出参数:
  21. // pu_Feature_File_Head,输出的文件头信息的存放缓冲区
  22. // 返回值:
  23. // 0 表示成功;
  24. // 备注:关于FEATURE_FILE_HEAD的定义,参见本模块.H文件
  25. int dfa_Feature_Get_File_Info(char * sz_Feature_File_Name, FEATURE_FILE_HEAD * pu_Feature_File_Head)
  26. {
  27. FILE * fp_Feature_File;
  28. fp_Feature_File = fopen(sz_Feature_File_Name, "rb");
  29. ASSERT(fp_Feature_File != NULL);
  30. ASSERT(sizeof(FEATURE_FILE_HEAD) == 200);
  31. fread(pu_Feature_File_Head, sizeof(FEATURE_FILE_HEAD), 1, fp_Feature_File);
  32. fclose(fp_Feature_File);
  33. return 0;
  34. }
  35. //////////////////////////////////////////////////////////////////////
  36. // 函数名称:dfa_Feature_Get_File_Total_Frame_Num
  37. // 函数功能:读出.DAT格式的Feature文件中的前若干句子的总帧数
  38. // 函数性质:API
  39. // 输入参数:
  40. // sz_Feature_File_Name,Feature文件的文件名
  41. // n_Sentence_Num,要统计的句子数
  42. // 输出参数:
  43. // 无
  44. // 返回值:
  45. // 统计出的总帧数
  46. // 备注:在类如VQ训练准备数据的场合,应该使用这个API,效率会比较高
  47. int dfa_Feature_Get_File_Total_Frame_Num(char * sz_Feature_File_Name, int n_Sentence_Num)
  48. {
  49. int nResult;
  50. FILE * fp_Feature_File;
  51. long l_Frame_Num;
  52. int n_Sentence_Index;
  53. fp_Feature_File = fopen(sz_Feature_File_Name, "rb");
  54. ASSERT(fp_Feature_File != NULL);
  55. fseek(fp_Feature_File, sizeof(FEATURE_FILE_HEAD), SEEK_SET);
  56. nResult = 0;
  57. for (n_Sentence_Index = 0; n_Sentence_Index < n_Sentence_Num; n_Sentence_Index++)
  58. {
  59. fread(&l_Frame_Num, sizeof(long), 1, fp_Feature_File);
  60. fread(&l_Frame_Num, sizeof(long), 1, fp_Feature_File);
  61. nResult += l_Frame_Num;
  62. }
  63. fclose(fp_Feature_File);
  64. return(nResult);
  65. }
  66. //////////////////////////////////////////////////////////////////////
  67. // 函数名称:dfa_Feature_Get_File_Total_Frame_Num
  68. // 函数功能:读出.DAT格式的Feature文件中的待训练句子的总帧数
  69. // 函数性质:API
  70. // 输入参数:
  71. // sz_Feature_File_Name,Feature文件的文件名
  72. // n_Sentence_Num,要统计的句子数
  73. //      n_Sentence_Start_Index, 开始的句子书。
  74. // 输出参数:
  75. // 无
  76. // 返回值:
  77. // 统计出的总帧数
  78. // 备注:在类如VQ训练准备数据的场合,应该使用这个API,效率会比较高
  79. int dfa_Feature_Get_File_Total_Frame_Num(char * sz_Feature_File_Name, int n_Sentence_Num, int n_Sentence_Start_Index)
  80. {
  81. int nResult;
  82. FILE * fp_Feature_File;
  83. long l_Frame_Num;
  84. int n_Sentence_Index;
  85. fp_Feature_File = fopen(sz_Feature_File_Name, "rb");
  86. ASSERT(fp_Feature_File != NULL);
  87. fseek(fp_Feature_File, sizeof(FEATURE_FILE_HEAD), SEEK_SET);
  88. fseek(fp_Feature_File, sizeof(long) * 2 * n_Sentence_Start_Index, SEEK_CUR);
  89. nResult = 0;
  90. for (n_Sentence_Index = 0; n_Sentence_Index < n_Sentence_Num; n_Sentence_Index++)
  91. {
  92. fread(&l_Frame_Num, sizeof(long), 1, fp_Feature_File);
  93. fread(&l_Frame_Num, sizeof(long), 1, fp_Feature_File);
  94. if (l_Frame_Num > 0)
  95. nResult += l_Frame_Num;
  96. }
  97. fclose(fp_Feature_File);
  98. return(nResult);
  99. }
  100. //////////////////////////////////////////////////////////////////////
  101. // 函数名称:dfa_Feature_Get_File_Total_Frame_Num
  102. // 函数功能:读出.DAT格式的Feature文件中的待训练句子的总帧数
  103. // 函数性质:API
  104. // 输入参数:
  105. // sz_Feature_File_Name,Feature文件的文件名
  106. // n_Sentence_Num,要统计的句子数
  107. //      n_Sentence_Start_Index, 开始的句子书。
  108. // 输出参数:
  109. // 无
  110. // 返回值:
  111. // 统计出的总帧数
  112. // 备注:在类如VQ训练准备数据的场合,应该使用这个API,效率会比较高
  113. int dfa_Feature_Get_Silence_Total_Frame_Num(char * sz_Feature_File_Name, int n_Sentence_Num, int n_Sentence_Start_Index)
  114. {
  115. int nResult;
  116. FILE * fp_Feature_File;
  117. long l_Frame_Num;
  118. int n_Sentence_Index;
  119. /**/fp_Feature_File = fopen(sz_Feature_File_Name, "rb");
  120. ASSERT(fp_Feature_File != NULL);
  121. fseek(fp_Feature_File, sizeof(FEATURE_FILE_HEAD), SEEK_SET);
  122. fseek(fp_Feature_File, sizeof(long) * 2 * n_Sentence_Start_Index, SEEK_CUR);
  123. nResult = 0;
  124. for (n_Sentence_Index = 0; n_Sentence_Index < n_Sentence_Num; n_Sentence_Index++)
  125. {
  126. fread(&l_Frame_Num, sizeof(long), 1, fp_Feature_File);
  127. fread(&l_Frame_Num, sizeof(long), 1, fp_Feature_File);
  128. if (l_Frame_Num > 0)
  129. nResult += l_Frame_Num;
  130. }
  131. fclose(fp_Feature_File);
  132. //nResult = n_Sentence_Num * RELAX_FRAME * 2;
  133. return(nResult);
  134. }
  135. //////////////////////////////////////////////////////////////////////
  136. // 函数名称:dfa_Feature_Get_Sentence_Frame_Num
  137. // 函数功能:读出.DAT格式的Feature文件中的某个句子的帧数
  138. // 函数性质:API
  139. // 输入参数:
  140. // sz_Feature_File_Name,Feature文件的文件名
  141. // n_Sentence_Index,要统计的句子索引号
  142. // 输出参数:
  143. // 无
  144. // 返回值:
  145. // 该句子的帧数
  146. // 备注:
  147. int dfa_Feature_Get_Sentence_Frame_Num(char * sz_Feature_File_Name, int n_Sentence_Index)
  148. {
  149. FILE * fp_Feature_File;
  150. long l_Frame_Num;
  151. fp_Feature_File = fopen(sz_Feature_File_Name, "rb");
  152. ASSERT(fp_Feature_File != NULL);
  153. fseek(fp_Feature_File, sizeof(FEATURE_FILE_HEAD) + sizeof(SENTENCE_INDEX_BLOCK) * n_Sentence_Index, SEEK_SET);
  154. fread(&l_Frame_Num, sizeof(long), 1, fp_Feature_File);
  155. fread(&l_Frame_Num, sizeof(long), 1, fp_Feature_File);
  156. fclose(fp_Feature_File);
  157. return(l_Frame_Num);
  158. }
  159. //////////////////////////////////////////////////////////////////////
  160. // 函数名称:dfa_Feature_Get_Sentence_Frame_Num
  161. // 函数功能:读出.DAT格式的Feature文件中的某个句子的帧数
  162. // 函数性质:API
  163. // 输入参数:
  164. // sz_Feature_File_Name,Feature文件的文件名
  165. // n_Sentence_Index,要统计的句子索引号
  166. // 输出参数:
  167. // 无
  168. // 返回值:
  169. // 该句子的帧数
  170. // 备注:
  171. int dfa_Feature_Get_Silence_Frame_Num(char * sz_Feature_File_Name, int n_Sentence_Index)
  172. {
  173. FILE * fp_Feature_File;
  174. long l_Frame_Num;
  175. fp_Feature_File = fopen(sz_Feature_File_Name, "rb");
  176. ASSERT(fp_Feature_File != NULL);
  177. /**/
  178. fseek(fp_Feature_File, sizeof(FEATURE_FILE_HEAD) + sizeof(SENTENCE_INDEX_BLOCK) * n_Sentence_Index, SEEK_SET);
  179. fread(&l_Frame_Num, sizeof(long), 1, fp_Feature_File);
  180. fread(&l_Frame_Num, sizeof(long), 1, fp_Feature_File);
  181. fclose(fp_Feature_File);
  182. //l_Frame_Num = 2 * RELAX_FRAME;
  183. return(l_Frame_Num);
  184. }
  185. //////////////////////////////////////////////////////////////////////
  186. // 函数名称:dfa_Feature_Read_A_Sentence
  187. // 函数功能:读出.DAT格式的Feature文件中的某个句子的特征
  188. // 函数性质:API
  189. // 输入参数:
  190. // sz_Feature_File_Name,Feature文件的文件名
  191. // n_Sentence_Index,要读取特征的句子索引号
  192. // n_Feature_Dim,特征的维数
  193. // 输出参数:
  194. // d2dda,存放特征的缓冲区
  195. // 返回值:
  196. // 读出的特征的帧数
  197. // 备注:关于DYNA_2DIM_DOUBLE_ARRAY,参见DXDXA模块
  198. // 按照调试需要,读出特征的同时,
  199. // 将对一阶MFCC差分倍乘系数u_Pro_Config.d_Feature_DT_MFCC_Coefficient
  200. int dfa_Feature_Read_A_Sentence(char * sz_Feature_File_Name, int n_Sentence_Index, int n_Feature_Dim, DYNA_2DIM_DOUBLE_ARRAY d2dda)
  201. {
  202. FILE * fp_Feature_File;
  203. long l_Offset, l_Frame_Num;
  204. int n_Frame_Index;
  205. float f_Tmp;
  206. FEATURE_FILE_HEAD filehead;
  207. fp_Feature_File = fopen(sz_Feature_File_Name, "rb");
  208. ASSERT(fp_Feature_File != NULL);
  209. fread(&filehead, sizeof(FEATURE_FILE_HEAD), 1, fp_Feature_File);
  210. ASSERT( filehead.sFeatureOrder == u_Pro_Config.n_Feature_Dim);
  211. fseek(fp_Feature_File, sizeof(SENTENCE_INDEX_BLOCK) * n_Sentence_Index, SEEK_CUR);
  212. fread(&l_Offset, sizeof(long), 1, fp_Feature_File);
  213. fread(&l_Frame_Num, sizeof(long), 1, fp_Feature_File);
  214. fseek(fp_Feature_File, l_Offset, SEEK_SET);
  215. for (n_Frame_Index = 0; n_Frame_Index < l_Frame_Num; n_Frame_Index++)
  216. {
  217. for (int i = 0; i < n_Feature_Dim; i++)
  218. {
  219. fread(&f_Tmp, sizeof(float), 1, fp_Feature_File);
  220. d2dda[n_Frame_Index][i] = f_Tmp;
  221. float temp = d2dda[n_Frame_Index][i] * 32768L/4;
  222. ASSERT((temp >= short(MIN_SHORT_VALUE)) && (temp <= MAX_SHORT_VALUE));
  223. }
  224. }
  225. fclose(fp_Feature_File);
  226. return(l_Frame_Num);
  227. }
  228. //////////////////////////////////////////////////////////////////////
  229. // 函数名称:dfa_Feature_Read_A_Silence
  230. // 函数功能:读出.DAT格式的Feature文件中的某个句子的静音部分特征
  231. // 函数性质:API
  232. // 输入参数:
  233. // sz_Feature_File_Name,Feature文件的文件名
  234. // n_Sentence_Index,要读取特征的句子索引号
  235. // n_Feature_Dim,特征的维数
  236. // 输出参数:
  237. // d2dda,存放特征的缓冲区
  238. // 返回值:
  239. // 读出的特征的帧数
  240. // 备注:关于DYNA_2DIM_DOUBLE_ARRAY,参见DXDXA模块
  241. // 按照调试需要,读出特征的同时,
  242. // 将对一阶MFCC差分倍乘系数u_Pro_Config.d_Feature_DT_MFCC_Coefficient
  243. int dfa_Feature_Read_A_Silence(char * sz_Feature_File_Name, int n_Sentence_Index, int n_Feature_Dim, DYNA_2DIM_DOUBLE_ARRAY d2dda)
  244. {
  245. FILE * fp_Feature_File;
  246. long l_Offset, l_Frame_Num;
  247. int n_Frame_Index;
  248. float ff_Tmp;
  249. fp_Feature_File = fopen(sz_Feature_File_Name, "rb");
  250. ASSERT(fp_Feature_File != NULL);
  251. fseek(fp_Feature_File, sizeof(FEATURE_FILE_HEAD) + sizeof(SENTENCE_INDEX_BLOCK) * n_Sentence_Index, SEEK_SET);
  252. fread(&l_Offset, sizeof(long), 1, fp_Feature_File);
  253. fread(&l_Frame_Num, sizeof(long), 1, fp_Feature_File);
  254. fseek(fp_Feature_File, l_Offset, SEEK_SET);
  255. for (n_Frame_Index = 0; n_Frame_Index < l_Frame_Num; n_Frame_Index++)
  256. {
  257. for (int i = 0; i < n_Feature_Dim; i++)
  258. {
  259. fread(&ff_Tmp, sizeof(float), 1, fp_Feature_File);
  260. d2dda[n_Frame_Index][i] = ff_Tmp;
  261. float temp = d2dda[n_Frame_Index][i] * 32768L/4;
  262. ASSERT((temp >= short(MIN_SHORT_VALUE)) && (temp <= MAX_SHORT_VALUE));
  263. }
  264. }
  265. fclose(fp_Feature_File);
  266. return(l_Frame_Num);
  267. }