UNIVERS  15.3
UNIVERS base processing software API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
interpol.h
1 /* interpol.h */
2 /* $Id: interpol.h,v 1.10 2009/08/18 10:34:09 vlad Exp $ */
3 #ifndef __interpol_h
4 #define __interpol_h
5 
6 /***********************************************************************
7  *
8  * Library for interpolation purposes.
9  *
10  ***********************************************************************/
11 
12 #ifdef GE_BUILD
13 
14 #ifdef __cplusplus
15 extern "C" {
16 #endif /* __cplusplus */
17 
24 double CosInterp (double x, double x1, double y1, double x2, double y2);
25 
26 #ifdef __cplusplus
27 };
28 #endif /* __cplusplus */
29 
30 #else // GE_BUILD
31 
32 #include <mix/Types.h>
33 
34 #ifdef __cplusplus
35 extern "C" {
36 #endif /* __cplusplus */
37 
38 
39 /***********************************************************************
40  Auxiliary procedure for computation n2 based on {a1}[n1] and
41  new united step da2. If returned n2=0 then a1 is not ordered
42  well (must be a1(i-1)<=a1(i) for i=[2..n1]).
43  Input parameters:
44  a1(n1) - input vector of argument
45  n1 - dimension of the argument vector
46  da2 - unified step of argument
47  Output parameters:
48  n2 - number of samples for argument with unified step
49  Versions:
50  getunistep - single precision
51  dgetunistep - double precision
52  ***********************************************************************/
53 
54 void Fortran(getunistep)(const Real4 a1[], const Int4* n1,
55  const Real4* da2, const Int4* n2);
56 void Fortran(dgetunistep)(const Real8 a1[], const Int4* n1,
57  const Real8* da2, const Int4* n2);
58 
59 
60 /***********************************************************************
61  Linear interpolation of {a1,f1}[n1] array to {a2,f2}[n2].
62  Input parameters:
63  a1(n1) - input vector of argument
64  f1(n1) - input vector of function
65  n1 - dimension of the argument vector
66  da2 - unified step of argument
67  n2 - number of samples for argument with unified step
68  Output parameters:
69  f2(n2) - output vector of function with unified argument step
70  da2 from a1(1) to a1(n1)
71  Versions:
72  linmakeunistep - single precision
73  dlinmakeunistep - double precision
74  ***********************************************************************/
75 
76 void Fortran(linmakeunistep)(Real4 a1[], Real4 f1[], Int4* n1,
77  Real4* da2, Real4 f2[], Int4* n2);
78 void Fortran(dlinmakeunistep)(Real8 a1[], Real8 f1[], Int4* n1,
79  Real8* da2, Real8 f2[], Int4* n2);
80 
81 
82 /***********************************************************************
83  Linear interpolation of discrete function f1 which is defined in
84  a1(1),...,a1(n1) points in point a2. a1 must be sorted in ascent
85  or descent order. If a2 is out of [a1(1),a1(n1)] range then
86  function returns zero.
87 
88  Input parameters:
89  a1(n1) - discrete function's arguments (ascent or descent order)
90  f1(n1) - discrete function's values
91  n1 - number of points of discrete function
92  a2 - argument where function's value is to be calculated
93  Return value:
94  0.0 - a2 is out of a1[] range
95  ??? - result of linear interpolation
96  Versions:
97  lininterp - single precision
98  dlininterp - double precision
99  ***********************************************************************/
100 
101 Real4 Fortran(lininterp) (const Real4 a1[], const Real4 f1[],
102  const Int4* n1, const Real4* a2);
103 Real8 Fortran(dlininterp) (const Real8 a1[], const Real8 f1[],
104  const Int4* n1, const Real8* a2);
105 
106 
107 /**********************************************************************
108 * ПОДПРОГРАММА ДЛЯ УМЕНЬШЕНИЯ ШАГА ДИСКРЕТИЗАЦИИ *
109 * (ИНТЕРПОЛЯЦИЯ ПО ВРЕМЕНИ) *
110 * *
111 * ВХОДНЫЕ ДАННЫЕ: *
112 * real*4 TI(n) - исходная трасса *
113 * integer*4 n - число отсчетов в трассе *
114 * integer*4 kdt - во сколько раз уменьшить шаг *
115 * дискретизации (2, 4, 8 раз) *
116 * real*8 X(m) - рабочий массив *
117 * ( m=(2**(int(log2(n))+1))*kdt ) *
118 * complex*16 W(k) - рабочий массив ( k=m/2+1 ) *
119 * *
120 * ВЫХОДНЫЕ ДАННЫЕ: *
121 * real*4 TO(nn)- интерполированная трасса *
122 * integer*4 nn - количество отсчетов в вых. трассе *
123 * ( nn=(n-1)*kdt+1 ) *
124 * integer*4 ierr - индикатор ошибок: *
125 * ierr=0 - ошибок нет *
126 * ierr=1 - ошибка в параметре kdt *
127 * *
128 ***********************************************************************/
129 void Fortran(dtlow) (float TI[], int* n, int* kdt,
130  double X[], /*complex*/double W[],
131  float TS[], int* nn, int* ierr);
132 
133 
134 /**********************************************************************
135 * ПОДПРОГРАММА ДЛЯ УВЕЛИЧЕНИЯ ШАГА ДИСКРЕТИЗАЦИИ *
136 * С ВОЗМОЖНОСТЬЮ ФИЛЬТРАЦИИ ВЫСОКИХ ЧАСТОТ *
137 * *
138 * ВХОДНЫЕ ДАННЫЕ: *
139 * real*4 TI(n) - исходная трасса *
140 * integer*4 n - число отсчетов в трассе *
141 * integer*4 kdt - во сколько раз увеличить шаг *
142 * дискретизации *
143 * real*8 X(m) - рабочий массив *
144 * ( m=2**(int(log2(n))+1) ) *
145 * complex*16 W(k) - рабочий массив ( k=m/2+1 ) *
146 * *
147 * integer*4 ind - индикатор фильтрации высоких частот *
148 * ( ind=0 - без фильтрации) *
149 * ( ind=1 - с фильтрацией) *
150 * *
151 * ВЫХОДНЫЕ ДАННЫЕ: *
152 * real*4 TO(nn)- интерполированная трасса *
153 * integer*4 nn - количество отсчетов в вых. трассе *
154 * ( nn=int((n-1)/kdt)+1 ) *
155 * integer*4 ierr - индикатор ошибок: *
156 * ierr=0 - ошибок нет *
157 * ierr=1 - ошибка в параметре kdt *
158 * *
159 ***********************************************************************/
160 void Fortran(dtup) (float TI[], int* n, int* kdt, const int* ind,
161  double X[], /*complex*/double W[],
162  float TS[], int* nn, int* ierr);
163 
164 /**********************************************************************
165 * ПОДПРОГРАММА ИЗМЕНЕНИЯ ШАГА ДИСКРЕТИЗАЦИИ *
166 * (ПАРАБОЛИЧЕСКАЯ АППРОКСИМАЦИЯ) *
167 * *
168 * ВХОДНЫЕ ДАННЫЕ: *
169 * T_in(n_in) real*4 - исходная трасса *
170 * n_in integer*4 - количество отсчетов *
171 * dt_in real*4 - старый шаг дискретизации *
172 * dt_out real*4 - новый шаг дискретизации *
173 * *
174 * ВЫХОДНЫЕ ДАННЫЕ: *
175 * T_out(n_out) real*4 - трасса с измененным шагом *
176 * дискретизации *
177 * n_out integer*4 - количество отсчетов выходной трассы *
178 * *
179 * ПРИМЕЧАНИЕ: *
180 * n_out=int((n_in-1)*dt_in/dt_out+1+0.5) *
181 **********************************************************************/
182 void Fortran(dtchappr)(float T_in[],int* n_in,
183  float* dt_in,float* dt_out,
184  float T_out[],int* n_out);
185 
186 
187 /**********************************************************************
188  * SQEQ SUBROUTINE
189  * solve equation: a*x^2 + b*x + c = 0
190  **********************************************************************/
191 void Fortran(sqeq) (const float* A, const float* B, const float* C,
192  float* X1, float* X2, int* IERR);
193 
194 
201 double CosInterp (double x,
202  double x1, double y1, double x2, double y2);
203 
204 
213 int PolInterp (int nBase, const double* pBaseX, const double* pBaseY,
214  int nCalc, const double* pCalcX, double* pCalcY);
215 
216 
221 double TrapezoidSquare (double x1, double x2, double y1, double y2);
222 
223 
229 double TrapIntegralExtC (int n, const double x[], const double y[],
230  double x1_, double x2_);
231 
232 
233 #ifdef __cplusplus
234 };
235 #endif /* __cplusplus */
236 
237 #endif //GE_BUILD
238 
239 
240 
241 #endif /* interpol.h */