libdspl-2.0
Библиотека алгоритмов цифровой обработки сигналов
sine_int.c
1 /*
2 * Copyright (c) 2015-2024 Sergey Bakhurin
3 * Digital Signal Processing Library [http://dsplib.org]
4 *
5 * This file is part of DSPL.
6 *
7 * is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * DSPL is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
19 */
20 
21 
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include "dspl.h"
25 
26 #ifdef DOXYGEN_ENGLISH
27 
70 #endif
71 #ifdef DOXYGEN_RUSSIAN
72 
113 #endif
114 int DSPL_API sine_int(double* x, int n, double* si)
115 {
116  int k, sgn, p;
117  double num, den, y, x2, x22, z, f, g;
118 
119  double A[8] = {+1.00000000000000000E0,
120  -4.54393409816329991E-2,
121  +1.15457225751016682E-3,
122  -1.41018536821330254E-5,
123  +9.43280809438713025E-8,
124  -3.53201978997168357E-10,
125  +7.08240282274875911E-13,
126  -6.05338212010422477E-16};
127 
128 
129 
130  double B[7] = {+1.0,
131  +1.01162145739225565E-2,
132  +4.99175116169755106E-5,
133  +1.55654986308745614E-7,
134  +3.28067571055789734E-10,
135  +4.50490975753865810E-13,
136  +3.21107051193712168E-16};
137 
138 
139 
140  double FA[11] = {+1.000000000000000000000E0,
141  +7.444370681619367006180E2,
142  +1.963963728951468698010E5,
143  +2.377503101254318340340E7,
144  +1.430734038212746368880E9,
145  +4.33736238870432522765E10,
146  +6.40533830574022022911E11,
147  +4.20968180571076940208E12,
148  +1.00795182980368574617E13,
149  +4.94816688199951963482E12,
150  -4.94701168645415959931E11};
151 
152  double FB[10] = {+1.000000000000000000000E0,
153  +7.464370681619276780310E2,
154  +1.978652470315839514500E5,
155  +2.415356701651268451440E7,
156  +1.474789521929854649580E9,
157  +4.58595115847765779830E10,
158  +7.08501308149515401563E11,
159  +5.06084464593475076774E12,
160  +1.43468549171581016479E13,
161  +1.11535493509914254097E13};
162 
163 
164 
165  double GA[11] = {+1.000000000000000000E0,
166  +8.135952011516861500E2,
167  +2.352391816264782000E5,
168  +3.125575707957787310E7,
169  +2.062975951467633540E9,
170  +6.83052205423625007E10,
171  +1.09049528450362786E12,
172  +7.57664583257834349E12,
173  +1.81004487464664575E13,
174  +6.43291613143049485E12,
175  -1.36517137670871689E12};
176 
177 
178  double GB[10] = {+1.000000000000000000E0,
179  +8.195952011514515640E2,
180  +2.400367528355787770E5,
181  +3.260266616470908220E7,
182  +2.233555432780993600E9,
183  +7.87465017341829930E10,
184  +1.39866710696414565E12,
185  +1.17164723371736605E13,
186  +4.01839087307656620E13,
187  +3.99653257887490811E13};
188 
189  if(!x || !si)
190  return ERROR_PTR;
191  if(n<1)
192  return ERROR_SIZE;
193 
194 
195  for(p = 0; p < n; p++)
196  {
197  sgn = x[p] > 0.0 ? 0 : 1;
198  y = x[p] < 0.0 ? -x[p] : x[p];
199 
200  if(y < 4)
201  {
202  x2 = y * y;
203  z = 1.0;
204  num = 0.0;
205  for(k = 0; k < 8; k++)
206  {
207  num += A[k] * z;
208  z*=x2;
209  }
210  z = 1.0;
211  den = 0.0;
212  for(k = 0; k < 7; k++)
213  {
214  den += B[k]*z;
215  z*=x2;
216  }
217  si[p] = x[p] * num/den;
218  }
219  else
220  {
221 
222  x2 = 1.0/y;
223  x22 = x2*x2;
224  z = 1.0;
225  num = 0.0;
226  for(k = 0; k < 11; k++)
227  {
228  num += FA[k] * z;
229  z*=x22;
230  }
231  z = 1.0;
232  den = 0.0;
233  for(k = 0; k < 10; k++)
234  {
235  den += FB[k]*z;
236  z*=x22;
237  }
238 
239  f = x2 * num / den;
240 
241  z = 1.0;
242  num = 0.0;
243  for(k = 0; k < 11; k++)
244  {
245  num += GA[k] * z;
246  z*=x22;
247  }
248  z = 1.0;
249  den = 0.0;
250  for(k = 0; k < 10; k++)
251  {
252  den += GB[k]*z;
253  z*=x22;
254  }
255 
256  g = x22 * num / den;
257 
258  si[p] = sgn ? f * cos(y) + g * sin(y) - M_PI * 0.5 :
259  M_PI * 0.5 - f * cos(y) - g * sin(y);
260  }
261  }
262  return RES_OK;
263 }
264 
int sine_int(double *x, int n, double *si)
Функция интегрального синуса
Definition: sine_int.c:114
#define ERROR_PTR
Ошибка указателя. Данная ошибка означает, что один из обязательных указателей (память под который дол...
Definition: dspl.h:610
#define ERROR_SIZE
Ошибка при передаче размера массива. Данная ошибка возникает когда помимо указателя на массив входных...
Definition: dspl.h:618
#define RES_OK
Функция завершилась корректно. Ошибки отсутствуют.
Definition: dspl.h:558