00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include "spli.h"
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 PUBLIC SPL_FLOAT XAPI lpa_cor_sls_ka( SPL_pFLOAT vac, SPL_pFLOAT vki,
00045 SPL_pFLOAT vai, SPL_INT p, SPL_pFLOAT vtmp )
00046 {
00047 SPL_INT i,k,t;
00048 #define po vtmp
00049 SPL_pFLOAT pa, pn, px;
00050 SPL_FLOAT sum,tk,ak,lk;
00051 assert(p>0);
00052
00053 t = (p+1)/2;
00054
00055 pa=po+t;
00056 pn=pa+t;
00057
00058 vki[0]=LP_NEGSUM_NEG((lk=2.0-(ak=(tk=vac[0]+vac[1])/vac[0]))-1.0);
00059 pa[0]=lk-ak;
00060 t=0;
00061
00062 for (k=1; k<p; k++) {
00063 __xsum(i,0,t,(vac[i+1]+vac[k-i])*pa[i],sum,vac[0]+vac[k+1]);
00064 if (k&1) {
00065 sum+=vac[t+1]*pa[t];
00066 ak=sum/tk;
00067 tk=sum;
00068 pn[0]=pa[0]+1-ak;
00069 for (i=1; i<=t; i++)
00070 pn[i]=pa[i]+pa[i-1]-ak*po[i-1];
00071 t++;
00072 }
00073 else {
00074 ak=sum/tk;
00075 tk=sum;
00076 pn[0]=pa[0]+1-ak;
00077 for (i=1; i<t; i++)
00078 pn[i]=pa[i]+pa[i-1]-ak*po[i-1];
00079 pn[t]=pa[t-1]+pa[t-1]-ak*po[t-1];
00080 }
00081 vki[k]=LP_NEGSUM_NEG((lk=2.0-ak/lk)-1.0);
00082 px=po;
00083 po=pa;
00084 pa=pn;
00085 pn=px;
00086 }
00087
00088 vai[0]=LP_NEGSUM_NEG(1.0+pa[0]-lk);
00089 if (p&1)
00090 t++;
00091 else
00092 po[t-1]*=lk;
00093 for (i=1; i<t; i++)
00094 vai[i]=vai[i-1]+LP_NEGSUM_NEG(pa[i])+LP_POSSUM_NEG(po[i-1]*=lk);
00095 p--;
00096 for (i=t; i<p; i++)
00097 vai[i]=vai[i-1]+LP_NEGSUM_NEG(pa[p-i])+LP_POSSUM_NEG(po[p-i]);
00098 vai[p]=vki[p];
00099
00100 return lk*tk;
00101 #undef po
00102 }
00103
00104
00105
00106 PUBLIC SPL_INT XAPI tnel_lpa_cor_sls( SPL_INT p )
00107 {
00108 return 3*((p+1)/2);
00109 }
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119 PUBLIC SPL_FLOAT XAPI lpa_cor_sls_k( SPL_pFLOAT vac, SPL_pFLOAT vki,
00120 SPL_INT p, SPL_pFLOAT vtmp )
00121 {
00122 SPL_INT i,k,t;
00123 #define po vtmp
00124 SPL_pFLOAT pa, pn, px;
00125 SPL_FLOAT sum,tk,ak,lk;
00126 assert(p>0);
00127
00128 t = (p+1)/2;
00129
00130 pa=po+t;
00131 pn=pa+t;
00132
00133 vki[0]=LP_NEGSUM_NEG((lk=2.0-(ak=(tk=vac[0]+vac[1])/vac[0]))-1.0);
00134 pa[0]=lk-ak;
00135 t=0;
00136
00137 for (k=1; k<p; k++) {
00138 __xsum(i,0,t,(vac[i+1]+vac[k-i])*pa[i],sum,vac[0]+vac[k+1]);
00139 if (k&1) {
00140 sum+=vac[t+1]*pa[t];
00141 ak=sum/tk;
00142 tk=sum;
00143 pn[0]=pa[0]+1.0-ak;
00144 for (i=1; i<=t; i++)
00145 pn[i]=pa[i]+pa[i-1]-ak*po[i-1];
00146 t++;
00147 }
00148 else {
00149 ak=sum/tk;
00150 tk=sum;
00151 pn[0]=pa[0]+1.0-ak;
00152 for (i=1; i<t; i++)
00153 pn[i]=pa[i]+pa[i-1]-ak*po[i-1];
00154 pn[t]=pa[t-1]+pa[t-1]-ak*po[t-1];
00155 }
00156 vki[k]=LP_NEGSUM_NEG((lk=2.0-ak/lk)-1.0);
00157 px=po;
00158 po=pa;
00159 pa=pn;
00160 pn=px;
00161 }
00162
00163 return lk*tk;
00164 #undef po
00165 }
00166
00167
00168
00169
00170
00171
00172
00173
00174 PUBLIC SPL_FLOAT XAPI lpa_cor_sls_a( SPL_pFLOAT vac, SPL_pFLOAT vai,
00175 SPL_INT p, SPL_pFLOAT vtmp )
00176 {
00177 SPL_INT i,k,t;
00178 #define po vtmp
00179 SPL_pFLOAT pa, pn, px;
00180 SPL_FLOAT sum,tk,ak,lk;
00181 assert(p>0);
00182
00183 t = (p+1)/2;
00184
00185 pa=po+t;
00186 pn=pa+t;
00187
00188 pa[0]=2.0-2.0*((tk=vac[0]+vac[1])/vac[0]);
00189 t=0;
00190
00191 for (k=1; k<p; k++) {
00192 __xsum(i,0,t,(vac[i+1]+vac[k-i])*pa[i],sum,vac[0]+vac[k+1]);
00193 if (k&1) {
00194 sum+=vac[t+1]*pa[t];
00195 ak=sum/tk;
00196 tk=sum;
00197 pn[0]=pa[0]+1.0-ak;
00198 for (i=1; i<=t; i++)
00199 pn[i]=pa[i]+pa[i-1]-ak*po[i-1];
00200 t++;
00201 }
00202 else {
00203 ak=sum/tk;
00204 tk=sum;
00205 pn[0]=pa[0]+1.0-ak;
00206 for (i=1; i<t; i++)
00207 pn[i]=pa[i]+pa[i-1]-ak*po[i-1];
00208 pn[t]=pa[t-1]+pa[t-1]-ak*po[t-1];
00209 }
00210 px=po;
00211 po=pa;
00212 pa=pn;
00213 pn=px;
00214 }
00215
00216 lk=sum=1.0;
00217 if (p&1) {
00218 for (i=0; i<t; i++) {
00219 sum+=po[i];
00220 lk+=pa[i];
00221 }
00222 lk=(lk+lk+pa[i])/(sum+sum);
00223 t++;
00224 }
00225 else {
00226 for (i=0; i<t-1; i++) {
00227 sum+=po[i];
00228 lk+=pa[i];
00229 }
00230 lk=(2.0*(lk+pa[i]))/(sum+sum+po[i]);
00231 po[t-1]*=lk;
00232 }
00233 vai[0]=LP_NEGSUM_NEG(1.0+pa[0]-lk);
00234 for (i=1; i<t; i++)
00235 vai[i]=vai[i-1]+LP_NEGSUM_NEG(pa[i])+LP_POSSUM_NEG((po[i-1]*=lk));
00236 p--;
00237 for (i=t; i<p; i++)
00238 vai[i]=vai[i-1]+LP_NEGSUM_NEG(pa[p-i])+LP_POSSUM_NEG(po[p-i]);
00239 vai[p]=LP_NEGSUM_NEG(lk-1.0);
00240
00241 return lk*tk;
00242 }
00243
00244
00245
00246
00247
00248
00249
00250
00251 PUBLIC SPL_FLOAT XAPI lpa_cor_sls_e( SPL_pFLOAT vac, SPL_INT p,
00252 SPL_pFLOAT vtmp )
00253 {
00254 SPL_INT i,k,t;
00255 #define po vtmp
00256 SPL_pFLOAT pa, pn, px;
00257 SPL_FLOAT sum,tk,ak,lk;
00258 assert(p>0);
00259
00260 t = (p+1)/2;
00261
00262 pa=po+t;
00263 pn=pa+t;
00264
00265 pa[0]=2.0-2.0*((tk=vac[0]+vac[1])/vac[0]);
00266 t=0;
00267
00268 for (k=1; k<p; k++) {
00269 __xsum(i,0,t,(vac[i+1]+vac[k-i])*pa[i],sum,vac[0]+vac[k+1]);
00270 if (k&1) {
00271 sum+=vac[t+1]*pa[t];
00272 ak=sum/tk;
00273 tk=sum;
00274 pn[0]=pa[0]+1.0-ak;
00275 for (i=1; i<=t; i++)
00276 pn[i]=pa[i]+pa[i-1]-ak*po[i-1];
00277 t++;
00278 }
00279 else {
00280 ak=sum/tk;
00281 tk=sum;
00282 pn[0]=pa[0]+1.0-ak;
00283 for (i=1; i<t; i++)
00284 pn[i]=pa[i]+pa[i-1]-ak*po[i-1];
00285 pn[t]=pa[t-1]+pa[t-1]-ak*po[t-1];
00286 }
00287 px=po;
00288 po=pa;
00289 pa=pn;
00290 pn=px;
00291 }
00292
00293 lk=sum=1.0;
00294 if (p&1) {
00295 for (i=0; i<t; i++) {
00296 sum+=po[i];
00297 lk+=pa[i];
00298 }
00299 lk=(lk+lk+pa[i])/(sum+sum);
00300 }
00301 else {
00302 for (i=0; i<t-1; i++) {
00303 sum+=po[i];
00304 lk+=pa[i];
00305 }
00306 lk=(2.0*(lk+pa[i]))/(sum+sum+po[i]);
00307 }
00308 return lk*tk;
00309 #undef po
00310 }
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320 PUBLIC SPL_FLOAT XAPI lpa_cor_sla_ka( SPL_pFLOAT vac, SPL_pFLOAT vki,
00321 SPL_pFLOAT vai, SPL_INT p, SPL_pFLOAT vtmp )
00322 {
00323 SPL_INT i,k,t;
00324 #define po vtmp
00325 SPL_pFLOAT pa, pn, px;
00326 SPL_FLOAT sum,tk,ak,lk;
00327 assert(p>0);
00328
00329 t = p/2;
00330
00331 pa=po+t;
00332 pn=pa+t;
00333
00334 vki[0]=LP_NEGSUM_NEG(1.0-(lk=2.0-(ak=(tk=vac[0]-vac[1])/vac[0])));
00335 pa[0]=0.0;
00336 t=0;
00337
00338 for (k=1; k<p; k++) {
00339 if (k&1) {
00340 __xsum(i,0,t,(vac[i+1]-vac[k-i])*pa[i],sum,vac[0]-vac[k+1]);
00341 ak=sum/tk;
00342 tk=sum;
00343 pn[0]=pa[0]+1.0-ak;
00344 for (i=1; i<t; i++)
00345 pn[i]=pa[i]+pa[i-1]-ak*po[i-1];
00346 if (t)
00347 pn[t]=pa[t-1]-ak*po[t-1];
00348 }
00349 else {
00350 __sum(i,0,t,(vac[i+1]-vac[k-i])*pa[i],sum,vac[0]-vac[k+1]);
00351 ak=sum/tk;
00352 tk=sum;
00353 pn[0]=pa[0]+1.0-ak;
00354 for (i=1; i<=t; i++)
00355 pn[i]=pa[i]+pa[i-1]-ak*po[i-1];
00356 t++;
00357 }
00358
00359 vki[k]=LP_NEGSUM_NEG(1.0-(lk=2.0-ak/lk));
00360 px=po;
00361 po=pa;
00362 pa=pn;
00363 pn=px;
00364 }
00365
00366 vai[0]=LP_NEGSUM_NEG(1.0+pa[0]-lk);
00367 p--;
00368 if (p&1) {
00369 for (i=1; i<=t; i++)
00370 vai[i]=vai[i-1]+LP_NEGSUM_NEG(pa[i])+LP_POSSUM_NEG(po[i-1]*=lk);
00371 vai[t+1]=vai[t]+LP_POSSUM_NEG(pa[t]);
00372 for (i=t+2; i<p; i++)
00373 vai[i]=vai[i-1]+LP_POSSUM_NEG(pa[p-i])+LP_NEGSUM_NEG(po[p-i]);
00374 }
00375 else if (t) {
00376 for (i=1; i<t; i++)
00377 vai[i]=vai[i-1]+LP_NEGSUM_NEG(pa[i])+LP_POSSUM_NEG(po[i-1]*=lk);
00378 vai[t]=vai[t-1]+LP_POSSUM_NEG(po[t-1]*=lk);
00379 for (i=t+1; i<p; i++)
00380 vai[i]=vai[i-1]+LP_POSSUM_NEG(pa[p-i])+LP_NEGSUM_NEG(po[p-i]);
00381 }
00382 vai[p]=vki[p];
00383
00384 return lk*tk;
00385 #undef po
00386 }
00387
00388
00389
00390 PUBLIC SPL_INT XAPI tnel_lpa_cor_sla( SPL_INT p )
00391 {
00392 return 3*(p/2);
00393 }
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403 PUBLIC SPL_FLOAT XAPI lpa_cor_sla_k( SPL_pFLOAT vac, SPL_pFLOAT vki,
00404 SPL_INT p, SPL_pFLOAT vtmp )
00405 {
00406 SPL_INT i,k,t;
00407 #define po vtmp
00408 SPL_pFLOAT pa, pn, px;
00409 SPL_FLOAT sum,tk,ak,lk;
00410 assert(p>0);
00411
00412 t = p/2;
00413
00414 pa=po+t;
00415 pn=pa+t;
00416
00417 vki[0]=LP_NEGSUM_NEG(1.0-(lk=2.0-(ak=(tk=vac[0]-vac[1])/vac[0])));
00418 pa[0]=0.0;
00419 t=0;
00420
00421 for (k=1; k<p; k++) {
00422 if (k&1) {
00423 __xsum(i,0,t,(vac[i+1]-vac[k-i])*pa[i],sum,vac[0]-vac[k+1]);
00424 ak=sum/tk;
00425 tk=sum;
00426 pn[0]=pa[0]+1.0-ak;
00427 for (i=1; i<t; i++)
00428 pn[i]=pa[i]+pa[i-1]-ak*po[i-1];
00429 if (t)
00430 pn[t]=pa[t-1]-ak*po[t-1];
00431 }
00432 else {
00433 __sum(i,0,t,(vac[i+1]-vac[k-i])*pa[i],sum,vac[0]-vac[k+1]);
00434 ak=sum/tk;
00435 tk=sum;
00436 pn[0]=pa[0]+1.0-ak;
00437 for (i=1; i<=t; i++)
00438 pn[i]=pa[i]+pa[i-1]-ak*po[i-1];
00439 t++;
00440 }
00441
00442 vki[k]=LP_NEGSUM_NEG(1.0-(lk=2.0-ak/lk));
00443 px=po;
00444 po=pa;
00445 pa=pn;
00446 pn=px;
00447 }
00448
00449 return lk*tk;
00450 #undef po
00451 }
00452
00453
00454
00455
00456
00457
00458
00459
00460 PUBLIC SPL_FLOAT XAPI lpa_cor_sla_a( SPL_pFLOAT vac, SPL_pFLOAT vai,
00461 SPL_INT p, SPL_pFLOAT vtmp )
00462 {
00463 SPL_INT i,k,t;
00464 #define po vtmp
00465 SPL_pFLOAT pa, pn, px;
00466 SPL_FLOAT sum,tk,ak,lk;
00467 assert(p>0);
00468
00469 t = p/2;
00470
00471 pa=po+t;
00472 pn=pa+t;
00473
00474 lk=2.0-(ak=(tk=vac[0]-vac[1])/vac[0]);
00475 pa[0]=0.0;
00476 t=0;
00477
00478 for (k=1; k<p; k++) {
00479 if (k&1) {
00480 __xsum(i,0,t,(vac[i+1]-vac[k-i])*pa[i],sum,vac[0]-vac[k+1]);
00481 ak=sum/tk;
00482 tk=sum;
00483 pn[0]=pa[0]+1.0-ak;
00484 for (i=1; i<t; i++)
00485 pn[i]=pa[i]+pa[i-1]-ak*po[i-1];
00486 if (t)
00487 pn[t]=pa[t-1]-ak*po[t-1];
00488 }
00489 else {
00490 __sum(i,0,t,(vac[i+1]-vac[k-i])*pa[i],sum,vac[0]-vac[k+1]);
00491 ak=sum/tk;
00492 tk=sum;
00493 pn[0]=pa[0]+1.0-ak;
00494 for (i=1; i<=t; i++)
00495 pn[i]=pa[i]+pa[i-1]-ak*po[i-1];
00496 t++;
00497 }
00498 lk=2.0-ak/lk;
00499
00500 px=po;
00501 po=pa;
00502 pa=pn;
00503 pn=px;
00504 }
00505
00506 vai[0]=LP_NEGSUM_NEG(1.0+pa[0]-lk);
00507 p--;
00508 if (p&1) {
00509 for (i=1; i<=t; i++)
00510 vai[i]=vai[i-1]+LP_NEGSUM_NEG(pa[i])+LP_POSSUM_NEG(po[i-1]*=lk);
00511 vai[t+1]=vai[t]+LP_POSSUM_NEG(pa[t]);
00512 for (i=t+2; i<=p; i++)
00513 vai[i]=vai[i-1]+LP_POSSUM_NEG(pa[p-i])+LP_NEGSUM_NEG(po[p-i]);
00514 }
00515 else if (t) {
00516 for (i=1; i<t; i++)
00517 vai[i]=vai[i-1]+LP_NEGSUM_NEG(pa[i])+LP_POSSUM_NEG(po[i-1]*=lk);
00518 vai[t]=vai[t-1]+LP_POSSUM_NEG(po[t-1]*=lk);
00519 for (i=t+1; i<=p; i++)
00520 vai[i]=vai[i-1]+LP_POSSUM_NEG(pa[p-i])+LP_NEGSUM_NEG(po[p-i]);
00521 }
00522
00523 return lk*tk;
00524 #undef po
00525 }
00526
00527
00528
00529
00530
00531
00532
00533
00534 PUBLIC SPL_FLOAT XAPI lpa_cor_sla_e( SPL_pFLOAT vac, SPL_INT p,
00535 SPL_pFLOAT vtmp )
00536 {
00537 SPL_INT i,k,t;
00538 #define po vtmp
00539 SPL_pFLOAT pa, pn, px;
00540 SPL_FLOAT sum,tk,ak,lk;
00541 assert(p>0);
00542
00543 t = p/2;
00544
00545 pa=po+t;
00546 pn=pa+t;
00547
00548 lk=2.0-(ak=(tk=vac[0]-vac[1])/vac[0]);
00549 pa[0]=0.0;
00550 t=0;
00551
00552 for (k=1; k<p; k++) {
00553 if (k&1) {
00554 __xsum(i,0,t,(vac[i+1]-vac[k-i])*pa[i],sum,vac[0]-vac[k+1]);
00555 ak=sum/tk;
00556 tk=sum;
00557 pn[0]=pa[0]+1.0-ak;
00558 for (i=1; i<t; i++)
00559 pn[i]=pa[i]+pa[i-1]-ak*po[i-1];
00560 if (t)
00561 pn[t]=pa[t-1]-ak*po[t-1];
00562 }
00563 else {
00564 __sum(i,0,t,(vac[i+1]-vac[k-i])*pa[i],sum,vac[0]-vac[k+1]);
00565 ak=sum/tk;
00566 tk=sum;
00567 pn[0]=pa[0]+1.0-ak;
00568 for (i=1; i<=t; i++)
00569 pn[i]=pa[i]+pa[i-1]-ak*po[i-1];
00570 t++;
00571 }
00572 lk=2.0-ak/lk;
00573
00574 px=po;
00575 po=pa;
00576 pa=pn;
00577 pn=px;
00578 }
00579
00580 return lk*tk;
00581 #undef po
00582 }
00583
00584
00585