vConnectUtility.h 4.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #ifndef __vConnectUtility_h__
  2. #define __vConnectUtility_h__
  3. #include <fftw3.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6. /// <summary>
  7. /// vConnect-STAND で使われる数学関数群です.
  8. /// </summary>
  9. class vConnectUtility
  10. {
  11. public: // public static method
  12. /// <summary>メル尺度から周波数を計算します.</summary>
  13. /// <param name="melScale">メル尺度</param>
  14. /// <returns>対応する周波数を返します.</returns>
  15. static double getFrequency(double melScale);
  16. /// <summary>周波数からメル尺度を計算します.</summary>
  17. /// <param name="freq">周波数</param>
  18. /// <returns>対応するメル尺度を返します.</returns>
  19. static double getMelScale(double freq);
  20. /// <summary>メルケプストラムをスペクトルへ展開します.</summary>
  21. /// <param name="dst">展開先のスペクトル格納配列です.</param>
  22. static void extractMelCepstrum( double *dst,
  23. int fftl,
  24. float *src,
  25. int cepl,
  26. fftw_complex *in,
  27. double *out,
  28. fftw_plan plan,
  29. int fs );
  30. /// <summary>スペクトルをメルスケールへ変換します.</summary>
  31. /// <param name="melSpectrum">結果を書き込むバッファ.</param>
  32. /// <param name="spectrum">元となるスペクトル.</param>
  33. /// <param name="spectumLength">配列長.</param>
  34. /// <param name="maxFrequency">最大周波数.</param>
  35. static void stretchToMelScale(double *melSpectrum, const double *spectrum, int spectrumLength, int maxFrequency);
  36. /// <summary>メルスケールのスペクトルを線形スペクトルへ変換します.</summary>
  37. /// <param name="spectrum">結果を書き込むバッファ.</param>
  38. /// <param name="melSpectrum">元となるメルスケール上のスペクトル.</param>
  39. /// <param name="spectumLength">配列長.</param>
  40. /// <param name="maxFrequency">最大周波数.</param>
  41. static void stretchFromMelScale(double *spectrum, const double *melSpectrum, int spectrumLength, int maxFrequency);
  42. /// <summary> スペクトルを線形伸縮します.</summary>
  43. /// <param name="dst">結果を書き込むバッファ.</param>
  44. /// <param name="src">元となるスペクトル.</param>
  45. /// <param name="ratio">伸縮率</param>
  46. /// <param name="length">配列長.</param>
  47. static void linearStretch(double *dst, const double *src, double ratio, int length);
  48. /// <summary>配列の中間値を線形補間します.</summary>
  49. /// <param name="x">配列のインデックス.</param>
  50. /// <param name="p">配列</param>
  51. /// <returns>配列の中間値を返します.</returns>
  52. static double interpolateArray( double x, const double *p );
  53. /// <summary>WORLDの非周期性指標をFFTWで使用する形へ展開します.</summary>
  54. /// <param name="dst">FFTWの複素数配列.</param>
  55. /// <param name="src">WORLD非周期性指標.</param>
  56. /// <param name="fftLength">FFT長.</param>
  57. static void extractResidual(fftw_complex *dst, const double *src, int fftLength);
  58. /// <summary>波形を OggVorbis 形式へエンコードします.バッファはnewで確保されます.</summary>
  59. /// <param name="dst">OggVorbisバッファが返ります.</param>
  60. /// <param name="size">バッファサイズが返ります.</param>
  61. /// <param name="wave">エンコードする波形.</param>
  62. /// <param name="length">波形長.</param>
  63. /// <param name="fs">標本化周波数.</param>
  64. static void newOggVorbis(char **dst, int *size, const double *wave, int length, int fs);
  65. /// <summary>二つのデータを伸縮マッチングします.</summary>
  66. /// <param name = "T">ストレッチング関数.</param>
  67. /// <param name = "H">ストレッチング関数.</param>
  68. /// <param name = "src_s">元となるデータ列.</param>
  69. /// <param name = "dst_s">対象となるデータ列.</param>
  70. /// <param name = "length">データ長.</param>
  71. static void calculateMatching( double* dst_to_src, double* src_to_dst, double* src_s, double* dst_s, int length );
  72. static void applyStretching( double *T, double* target, int length );
  73. private:
  74. static void _get_graduation( double* src, double* dst, int length,
  75. double *d1s, double *d2s, double *d1d, double *d2d);
  76. static void _log_normalize_infinite( double* dst, int length );
  77. static double _get_cost( double* src, double* dst, int i, int j, int n, int m,
  78. double *d1d, double *d2d, double *d1s, double *d2s);
  79. };
  80. #endif