FE_lsf.cpp
上传用户:italyroyal
上传日期:2013-05-06
资源大小:473k
文件大小:4k
源码类别:

语音合成与识别

开发平台:

Visual C++

  1. ///////////////////////////////////////////////////////////////////////////////
  2. // This is a part of the Feature program.
  3. // Version: 1.0
  4. // Date: February 22, 2003
  5. // Programmer: Oh-Wook Kwon
  6. // Copyright(c) 2003 Oh-Wook Kwon. All rights reserved. owkwon@ucsd.edu
  7. ///////////////////////////////////////////////////////////////////////////////
  8. #include "StdAfx.h"
  9. #include "FE_feature.h"
  10. //#define _TEST_LPC_TO_LSF_
  11. #ifdef _TEST_LPC_TO_LSF_
  12. main()
  13. {
  14. int i;
  15. int p=10;
  16. int N = p/2;
  17. float a[5] = {(float)0.9, (float)0.8, (float)0.7, (float)0.6, (float)0.5};
  18. float w[5] = {(float)0.2, (float)0.4, (float)0.6, (float)0.8, (float)1.0};
  19. Polynomial A = 1.0;
  20. for(i=0; i < N; i++){
  21. A *= Polynomial(2,(float)1.0,(float)(-2.0*a[i]*cos(w[i])),(float)(a[i]*a[i]));
  22. }
  23. //printf("A=");
  24. //A.Print();
  25. vector<float> acf(p+1);
  26. vector<float> lsf(p+1);
  27. acf[0] = 1;
  28. for(i=1; i <= p; i++){
  29. acf[i] = -A.v[i];
  30. }
  31. int nf;
  32. Fe feat;
  33. vector<CComplex> oldRootsP;
  34. vector<CComplex> oldRootsQ;
  35. nf = feat.lpc_to_lsf(&acf[0], p, &lsf[0], oldRootsP, oldRootsQ);
  36. printf("lsf=");
  37. for(i=0;i<nf;i++){
  38. printf("%f ",lsf[i]);
  39. }
  40. printf("n");
  41. vector<float> formant(p+1);
  42. vector<CComplex> rootsA;
  43. nf = feat.lpc_to_formant(&acf[0], p, &formant[0], rootsA);
  44. printf("formant=");
  45. for(i=0;i<nf;i++){
  46. printf("%f ",formant[i]);
  47. }
  48. printf("n");
  49. return 1;
  50. }
  51. #endif
  52. int Fe::lsf_basic(short *sample, int frameSize, float *lsf, int norder)
  53. {
  54. float G;
  55. vector<float> acf(norder+1);
  56. vector<CComplex> oldRootsP;
  57. vector<CComplex> oldRootsQ;
  58. /* A(z) = 1 - sum_{i=1}^p acf_i z^{-i} */
  59. lpc_basic(sample, frameSize, &acf[0], norder, &G);
  60. lpc_to_lsf(&acf[0], norder, lsf, oldRootsP, oldRootsQ);
  61. return 1;
  62. }
  63. /* lpc_to_lsp */
  64. /* Converts LPC coefficients to line spectrum pairs */
  65. /* acf[]: LPC coefficients */
  66. /* A(z) = 1 - sum_{i=1}^p acf_i z^{-i} */
  67. /* norder: LPC order */
  68. /* lsf[]: LSF values */
  69. /* Example:
  70. When norder is 10 and 
  71. acf[11] = {1.000000, 5.769638, -15.389400, 25.054144, -27.662497, 21.731449,
  72. -12.362663, 5.059858, -1.437461, 0.258843, -0.022861};
  73. which means 10 poles at a[i]*e(j*w[i]) and a[i]*e(-j*w[i]), i=1,...,10, 
  74. a[5] = {0.9, 0.8, 0.7, 0.6, 0.5};
  75. w[5] = {0.2, 0.4, 0.6, 0.8, 1.0};
  76. lpc_to_lsp() yields the following output:
  77. lsp[10] = {0.020972, 0.035827, 0.051702, 0.070526, 0.091851,
  78. 0.117022, 0.147932, 0.188925, 0.250307, 0.352016};
  79. */
  80. int Fe::lpc_to_lsf(float* acf, int norder, float* lsf, vector<CComplex>& oldRootsP, vector<CComplex>& oldRootsQ)
  81. {
  82. int i;
  83. int N=norder/2;
  84. if(norder%2) norder -= 1;
  85. vector<float> a(norder+1);
  86. /* a[i] = -acf[i], i=1,...,norder */
  87. a[0] = 1;
  88. for(i=1;i<=norder;i++)
  89. a[i] = -acf[i];
  90. vector<float> A(N+1);
  91. vector<float> B(N+1);
  92. A[0] = B[0] = 1;
  93. for(i=1;i<=N;i++){
  94. A[i] = (a[i]-a[norder+1-i])+A[i-1];
  95. B[i] = (a[i]+a[norder+1-i])-B[i-1];
  96. }
  97. vector<Polynomial> sinn(N+1);
  98. vector<Polynomial> cosn(N+1);
  99. Polynomial x = Polynomial((float)1);
  100. Polynomial cos1 = x;
  101. Polynomial sin2 = 1 - x*x;
  102. sinn[0] = 0;
  103. cosn[0] = 1;
  104. for(i=1; i<=N;i++){
  105. sinn[i] = sinn[i-1]*cos1 + cosn[i-1];
  106. //printf("sinn[%d]=",i); sinn[i].Print();
  107. cosn[i] = cosn[i-1]*cos1 - sinn[i-1]*sin2;
  108. //printf("cosn[%d]=",i); cosn[i].Print();
  109. }
  110. /* P = sum_{i=0}^N  A[i]*cosn[N-i] */
  111. /* where cosn[i] = (z^i+z^(-i))/2 */
  112. /* and cosn[0] = 0.5 */
  113. Polynomial P = Polynomial((float)0);
  114. Polynomial Q = Polynomial((float)0);
  115. cosn[0] = Polynomial((float)0.5);
  116. for(i=0;i<=N;i++){
  117. P += A[i]*cosn[N-i];
  118. Q += B[i]*cosn[N-i];
  119. }
  120. if(oldRootsP.size() != N+1) oldRootsP.resize(N+1);
  121. if(oldRootsQ.size() != N+1) oldRootsQ.resize(N+1);
  122. P.Roots(&oldRootsP[0]);
  123. Q.Roots(&oldRootsQ[0]);
  124. int n = 0;
  125. lsf[n++] = (float)0;
  126. for(i=1;i<=N;i++){
  127. lsf[n++] = (float)(acos(real(oldRootsQ[N-i+1]))/(2*M_PI));
  128. lsf[n++] = (float)(acos(real(oldRootsP[N-i+1]))/(2*M_PI));
  129. }
  130. qsort(lsf, n, sizeof(float), FE_CompareFloat);
  131. return n;
  132. }