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

语音合成与识别

开发平台:

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. #ifndef _FE_COMPLEX_H_
  9. #define _FE_COMPLEX_H_
  10. #include <cstdio>
  11. #include <cmath>
  12. #ifndef M_PI
  13. #define M_PI 3.14159265358979323846
  14. #endif
  15. template <typename T> class Complex;
  16. // friend template functions
  17. template <typename T> Complex<T> complex_plus(const Complex<T>& A, const Complex<T>& B);
  18. template <typename T> Complex<T> complex_plus(const Complex<T>& A, const double b);
  19. template <typename T> Complex<T> complex_plus(const double b, const Complex<T>& A);
  20. template <typename T> Complex<T> complex_minus(const Complex<T>& A, const Complex<T>& B);
  21. template <typename T> Complex<T> complex_minus(const Complex<T>& A, const double b);
  22. template <typename T> Complex<T> complex_minus(const double b, const Complex<T>& A);
  23. template <typename T> Complex<T> complex_times(const Complex<T>& A, const Complex<T>& B);
  24. template <typename T> Complex<T> complex_times(const Complex<T>& A, const double b);
  25. template <typename T> Complex<T> complex_times(const double b, const Complex<T>& A);
  26. template <typename T> Complex<T> complex_divide(const Complex<T>& A, const Complex<T>& B);
  27. template <typename T> Complex<T> complex_divide(const Complex<T>& A, const double b);
  28. template <typename T> Complex<T> complex_divide(const double b, const Complex<T>& A);
  29. template <typename T>
  30. class Complex
  31. {
  32. public:
  33. Complex(const T a=(T)0, const T b=(T)0) : r(a), i(b) {}
  34. Complex(const Complex<T>& z) : r(z.r), i(z.i) {}
  35. ~Complex();
  36. public:
  37. T r;
  38. T i;
  39. Complex<T>   operator+();
  40.         Complex<T>   operator-();
  41. Complex<T>& operator=(const Complex<T>& a);
  42. Complex<T>& operator+=(const Complex<T>& a);
  43. Complex<T>& operator-=(const Complex<T>& a);
  44. Complex<T>& operator*=(const Complex<T>& a);
  45. Complex<T>& operator/=(const Complex<T>& a);
  46. friend Complex<T> operator+(const Complex<T>& a, const Complex<T>& b) {
  47. return complex_plus(a,b);
  48. }
  49. friend Complex<T> operator+(const Complex<T>& a, const T& b) {
  50. return complex_plus(a,b);
  51. }
  52. friend Complex<T> operator+(const T& a, const Complex<T>& b) {
  53. return complex_plus(a,b);
  54. }
  55. friend Complex<T> operator-(const Complex<T>& a, const Complex<T>& b) {
  56. return complex_minus(a,b);
  57. }
  58. friend Complex<T> operator-(const Complex<T>& a, const T& b) {
  59. return complex_minus(a,b);
  60. }
  61. friend Complex<T> operator-(const T& a, const Complex<T>& b) {
  62. return complex_minus(a,b);
  63. }
  64. friend Complex<T> operator*(const Complex<T>& a, const Complex<T>& b) {
  65. return complex_times(a,b);
  66. }
  67. friend Complex<T> operator*(const Complex<T>& a, const T& b) {
  68. return complex_times(a,b);
  69. }
  70. friend Complex<T> operator*(const T& a, const Complex<T>& b) {
  71. return complex_times(a,b);
  72. }
  73. friend Complex<T> operator/(const Complex<T>& a, const Complex<T>& b) {
  74. return complex_divide(a,b);
  75. }
  76. friend Complex<T> operator/(const Complex<T>& a, const T& b) {
  77. return complex_divide(a,b);
  78. }
  79. friend Complex<T> operator/(const T& a, const Complex<T>& b) {
  80. return complex_divide(a,b);
  81. }
  82. #ifdef __GNUC__
  83.         friend Complex<T> complex_plus<T>(const Complex<T>& A, const Complex<T>& B);
  84.         friend Complex<T> complex_plus<T>(const Complex<T>& A, const double b);
  85.         friend Complex<T> complex_plus<T>(const double b, const Complex<T>& A);
  86.         friend Complex<T> complex_minus<T>(const Complex<T>& A, const Complex<T>& B);
  87.         friend Complex<T> complex_minus<T>(const Complex<T>& A, const double b);
  88.         friend Complex<T> complex_minus<T>(const double b, const Complex<T>& A);
  89.         friend Complex<T> complex_times<T>(const Complex<T>& A, const Complex<T>& B);
  90.         friend Complex<T> complex_times<T>(const Complex<T>& A, const double b);
  91.         friend Complex<T> complex_times<T>(const double b, const Complex<T>& A);
  92.         friend Complex<T> complex_divide<T>(const Complex<T>& A, const Complex<T>& B);
  93.         friend Complex<T> complex_divide<T>(const Complex<T>& A, const double b);
  94.         friend Complex<T> complex_divide<T>(const double b, const Complex<T>& A);
  95. #endif
  96. };
  97. template <typename T> 
  98. inline Complex<T> Complex<T>::operator+() {
  99.         return (*this);
  100. }
  101. template <typename T> 
  102. inline Complex<T> Complex<T>::operator-() {
  103.         Complex<T> C=(*this);
  104.         C*=(-1);
  105.         return C;
  106. }
  107. template <typename T>
  108. inline Complex<T> complex_plus(const Complex<T>& a, const Complex<T>& b)
  109. {
  110. Complex<T> c = a;
  111. c += b;
  112. return c;
  113. }
  114. template <typename T>
  115. inline Complex<T> complex_plus(const Complex<T>& a, const T& b)
  116. {
  117. Complex<T> c = a;
  118. c += Complex<T>((T)b,(T)0);
  119. return c;
  120. }
  121. template <typename T>
  122. inline Complex<T> complex_plus(const T& a, const Complex<T>& b)
  123. {
  124. Complex<T> c((T)a, (T)0);
  125. c += b;
  126. return c;
  127. }
  128. template <typename T>
  129. inline Complex<T> complex_plus(const Complex<T>& a)
  130. {
  131. Complex<T> c = a;
  132. return c;
  133. }
  134. template <typename T>
  135. inline Complex<T> complex_minus(const Complex<T>& a, const Complex<T>& b)
  136. {
  137. Complex<T> c = a;
  138. c -= b;
  139. return c;
  140. }
  141. template <typename T>
  142. inline Complex<T> complex_minus(const Complex<T>& a, const T& b)
  143. {
  144. Complex<T> c = a;
  145. c -= Complex<T>((T)b,(T)0);
  146. return c;
  147. }
  148. template <typename T>
  149. inline Complex<T> complex_minus(const T& a, const Complex<T>& b)
  150. {
  151. Complex<T> c((T)a, (T)0);
  152. c -= b;
  153. return c;
  154. }
  155. template <typename T>
  156. inline Complex<T> complex_minus(const Complex<T>& a)
  157. {
  158. Complex<T> c((T)0, (T)0);
  159. c -= a;
  160. return c;
  161. }
  162. template <typename T>
  163. inline Complex<T> complex_times(const Complex<T>& a, const Complex<T>& b)
  164. {
  165. Complex<T> c = a;
  166. c *= b;
  167. return c;
  168. }
  169. template <typename T>
  170. inline Complex<T> complex_times(const Complex<T>& a, const T& b)
  171. {
  172. Complex<T> c = a;
  173. c *= Complex<T>((T)b,(T)0);
  174. return c;
  175. }
  176. template <typename T>
  177. inline Complex<T> complex_times(const T& a, const Complex<T>& b)
  178. {
  179. Complex<T> c((T)a, (T)0);
  180. c *= b;
  181. return c;
  182. }
  183. template <typename T>
  184. inline Complex<T> complex_divide(const Complex<T>& a, const Complex<T>& b)
  185. {
  186. Complex<T> c = a;
  187. c /= b;
  188. return c;
  189. }
  190. template <typename T>
  191. inline Complex<T> complex_divide(const Complex<T>& a, const T& b)
  192. {
  193. Complex<T> c = a;
  194. c /= Complex<T>((T)b,(T)0);
  195. return c;
  196. }
  197. template <typename T>
  198. inline Complex<T> complex_divide(const T& a, const Complex<T>& b)
  199. {
  200. Complex<T> c((T)a, (T)0);
  201. c /= b;
  202. return c;
  203. }
  204. template <typename T>
  205. Complex<T>::~Complex()
  206. {
  207. }
  208. template <typename T>
  209. T real(const Complex<T>& z)
  210. {
  211. return z.r;
  212. }
  213. template <typename T>
  214. T imag(const Complex<T>& z)
  215. {
  216. return z.i;
  217. }
  218. template <typename T>
  219. T abs(const Complex<T>& z)
  220. {
  221. T x,y,ans,temp;
  222. x=(T)fabs(z.r);
  223. y=(T)fabs(z.i);
  224. if(x == (T)0)
  225. ans=y;
  226. else if(y == (T)0)
  227. ans=x;
  228. else if(x>y){
  229. temp=y/x;
  230. ans=(T)(x*sqrt((T)1.0+temp*temp));
  231. } else {
  232. temp = x/y;
  233. ans=(T)(y*sqrt((T)1.0+temp*temp));
  234. }
  235. return ans;
  236. }
  237. template <typename T>
  238. T arg(const Complex<T>& z)
  239. {
  240. if(z.r == (T)0 && z.i == (T)0) return (T)0;
  241. else if(z.i >= (T)0) return (T)acos(z.r/abs(z));
  242. else return (T)(2*M_PI-acos(z.r/abs(z)));
  243. }
  244. template <typename T>
  245. Complex<T> sqrt(const Complex<T>& z)
  246. {
  247. Complex<T> c;
  248. T x,y,w,r;
  249. if((z.r == (T)0) && (z.i == (T)0)){
  250. c.r = (T)0;
  251. c.i = (T)0;
  252. return c;
  253. } else {
  254. x=(T)fabs(z.r);
  255. y=(T)fabs(z.i);
  256. if(x>=y){
  257. r=y/x;
  258. w=(T)(sqrt(x)*sqrt(0.5*(1.0+sqrt(1.0+r*r))));
  259. } else {
  260. r=x/y;
  261. w=(T)(sqrt(y)*sqrt(0.5*(r+sqrt(1.0+r*r))));
  262. }
  263. if(z.r >= (T)0){
  264. c.r=w;
  265. c.i=z.i/(T)(2*w);
  266. } else {
  267. c.i=(z.i >= (T)0) ? w : -w;
  268. c.r=z.i/(T)(2.0*c.i);
  269. }
  270. return c;
  271. }
  272. }
  273. template <typename T>
  274. Complex<T> conjg(const Complex<T>& z)
  275. {
  276. Complex<T> c;
  277. c.r = z.r;
  278. c.i = -z.i;
  279. return c;
  280. }
  281. template <typename T>
  282. Complex<T>& Complex<T>::operator=(const Complex<T>& a)
  283. {
  284. r = a.r;
  285. i = a.i;
  286. return *this;
  287. }
  288. template <typename T>
  289. Complex<T>& Complex<T>::operator+=(const Complex<T>& a)
  290. {
  291. r += a.r;
  292. i += a.i;
  293. return *this;
  294. }
  295. template <typename T>
  296. Complex<T>& Complex<T>::operator-=(const Complex<T>& a)
  297. {
  298. r -= a.r;
  299. i -= a.i;
  300. return *this;
  301. }
  302. template <typename T>
  303. Complex<T>& Complex<T>::operator*=(const Complex<T>& a)
  304. {
  305. T t;
  306. r = (t=r)*a.r-i*a.i;
  307. i = i*a.r+t*a.i;
  308. return *this;
  309. }
  310. template <typename T>
  311. Complex<T>& Complex<T>::operator/=(const Complex<T>& a)
  312. {
  313. T ratio,den,t;
  314. if((T)fabs(a.r) >= (T)fabs(a.i)){
  315. ratio = a.i/a.r;
  316. den = a.r+ratio*a.i;
  317. r = ((t=r)+ratio*i)/den;
  318. i = (i-ratio*t)/den;
  319. }
  320. else{
  321. ratio = a.r/a.i;
  322. den = a.i+ratio*a.r;
  323. r = ((t=r)*ratio+i)/den;
  324. i = (i*ratio-t)/den;
  325. }
  326. return *this;
  327. }
  328. #endif