Revision: | 1.1 |
Committed: | Sun Apr 28 07:46:58 2013 UTC (10 years, 4 months ago) by tplarson |
Content type: | text/plain |
Branch: | MAIN |
CVS Tags: | globalhs_version_5, Ver_8-7, Ver_8-5, globalhs_version_23, globalhs_version_22, globalhs_version_21, globalhs_version_20, Ver_LATEST, globalhs_version_24, Ver_8-3, globalhs_version_8, globalhs_version_9, globalhs_version_0, globalhs_version_1, globalhs_version_2, globalhs_version_3, globalhs_version_4, Ver_9-41, globalhs_version_6, globalhs_version_7, Ver_9-5, Ver_8-8, globalhs_version_19, Ver_8-2, Ver_8-10, Ver_8-1, Ver_8-6, Ver_9-1, Ver_8-4, Ver_9-2, globalhs_version_12, globalhs_version_13, globalhs_version_10, globalhs_version_11, globalhs_version_16, globalhs_version_17, globalhs_version_14, globalhs_version_15, globalhs_version_18, Ver_9-4, Ver_9-3, Ver_8-11, Ver_8-12, Ver_9-0, HEAD |
Log Message: | functions needed for detrending and gapfilling |
# | Content |
---|---|
1 | // $Header: $ |
2 | |
3 | #include "ctypes_def.h" |
4 | #include "cblas.h" |
5 | |
6 | #if TYPE == FLOAT |
7 | #define LEVINSON slevinson |
8 | #elif TYPE == DOUBLE |
9 | #define LEVINSON dlevinson |
10 | #elif TYPE == COMPLEXFLOAT |
11 | #define LEVINSON clevinson |
12 | #elif TYPE == COMPLEXDOUBLE |
13 | #define LEVINSON zlevinson |
14 | #endif |
15 | |
16 | #ifdef NOBLAS |
17 | void LEVINSON( int n, CTYPE *r, CTYPE *b, CTYPE *x) |
18 | { |
19 | int k,i; |
20 | CTYPE alpha, mu; |
21 | CTYPE *b_tmp; |
22 | RTYPE beta; |
23 | |
24 | if (cimag(r[0]) != RZERO || creal(r[0]) <= RZERO ) |
25 | { |
26 | fprintf(stderr, "%s: Toeplitz matrix must be Hermitian.\n",__func__); |
27 | fprintf(stderr, "imag = %f, real = %f\n",cimag(r[0]),creal(r[0])); |
28 | abort(); |
29 | } |
30 | b_tmp = (CTYPE *)malloc(n*sizeof(CTYPE)); |
31 | beta = creal(r[0]); |
32 | x[0] = b[0] / r[0]; |
33 | b[0] = -r[1]/beta; |
34 | alpha = b[0]; |
35 | for (k=1; k<=n-1; k++) |
36 | { |
37 | beta = (RONE - CONJ(alpha)*alpha)*beta; |
38 | mu = b[k]; |
39 | for (i=2; i<=(k+1); i++) |
40 | mu -= conj(r[i-1])*x[k+1-i]; |
41 | mu /= beta; |
42 | for (i=1; i<=k; i++) |
43 | x[i-1] += mu*b[k-i]; |
44 | x[k] = mu; |
45 | |
46 | if (k<n-1) |
47 | { |
48 | alpha = -r[k+1]; |
49 | for (i=2; i<=(k+1); i++) |
50 | alpha -= r[i-1] * b[k+1-i]; |
51 | alpha /= beta; |
52 | memcpy(b_tmp, b, k*sizeof(CTYPE)); |
53 | for (i=1; i<=k; i++) |
54 | b[i-1] += alpha * CONJ(b_tmp[k-i]); |
55 | b[k] = alpha; |
56 | } |
57 | } |
58 | free(b_tmp); |
59 | } |
60 | |
61 | #else |
62 | |
63 | void LEVINSON( int n, CTYPE *r, CTYPE *b, CTYPE *x) |
64 | { |
65 | int k,i; |
66 | CTYPE alpha, mu; |
67 | CTYPE *b_tmp; |
68 | RTYPE beta; |
69 | |
70 | if (cimag(r[0]) != RZERO || creal(r[0]) <= RZERO ) |
71 | { |
72 | fprintf(stderr, "%s: Toeplitz matrix must be Hermitian.\n",__func__); |
73 | fprintf(stderr, "imag = %f, real = %f\n",cimag(r[0]),creal(r[0])); |
74 | abort(); |
75 | } |
76 | b_tmp = (CTYPE *)malloc(n*sizeof(CTYPE)); |
77 | beta = creal(r[0]); |
78 | x[0] = b[0] / r[0]; |
79 | b[0] = -r[1]/beta; |
80 | alpha = b[0]; |
81 | for (k=1; k<=n-1; k++) |
82 | { |
83 | beta = (RONE - CONJ(alpha)*alpha)*beta; |
84 | mu = b[k] - DOTC(k,&r[1],1,x,-1); |
85 | mu /= beta; |
86 | |
87 | AXPY(k,mu,b,-1,x,1); |
88 | x[k] = mu; |
89 | |
90 | if (k<n-1) |
91 | { |
92 | alpha = -r[k+1] - DOTU(k,&r[1],1,b,-1); |
93 | alpha /= beta; |
94 | for (i=0; i<k; i++) |
95 | b_tmp[i] = CONJ(b[i]); |
96 | AXPY(k,alpha,b_tmp,-1,b,1); |
97 | b[k] = alpha; |
98 | } |
99 | } |
100 | free(b_tmp); |
101 | } |
102 | |
103 | #endif |
104 | #undef LEVINSON |
105 | #undef AXPY |
106 | #undef DOTU |
107 | #undef DOTC |
108 | #include "ctypes_undef.h" |