32 ClassImp(TSpectrumTransform);
37 TSpectrumTransform::TSpectrumTransform()
40 fTransformType=kTransformCos;
42 fDirection=kTransformForward;
53 TSpectrumTransform::TSpectrumTransform(Int_t size):TNamed(
"SpectrumTransform",
"Miroslav Morhac transformer")
57 Error (
"TSpectrumTransform",
"Invalid length, must be > than 0");
67 Error (
"TSpectrumTransform",
"Invalid length, must be power of 2");
71 fTransformType=kTransformCos;
73 fDirection=kTransformForward;
84 TSpectrumTransform::~TSpectrumTransform()
95 void TSpectrumTransform::Haar(Double_t *working_space,
int num,
int direction)
97 int i, ii, li, l2, l3, j, jj, jj1, lj, iter, m, jmin, jmax;
98 Double_t a, b, c, wlk;
100 for (i = 0; i < num; i++)
101 working_space[i + num] = 0;
108 if (direction == kTransformForward) {
109 for (m = 1; m <= iter; m++) {
111 l2 = (Int_t) TMath::Power(2, li - 1);
112 for (i = 0; i < (2 * l2); i++) {
113 working_space[num + i] = working_space[i];
115 for (j = 0; j < l2; j++) {
118 val = working_space[jj + num] + working_space[jj + 1 + num];
119 working_space[j] = val;
120 val = working_space[jj + num] - working_space[jj + 1 + num];
121 working_space[l3] = val;
125 val = working_space[0];
126 val = val / TMath::Sqrt(TMath::Power(2, iter));
127 working_space[0] = val;
128 val = working_space[1];
129 val = val / TMath::Sqrt(TMath::Power(2, iter));
130 working_space[1] = val;
131 for (ii = 2; ii <= iter; ii++) {
133 wlk = 1 / TMath::Sqrt(TMath::Power(2, iter - i));
134 jmin = (Int_t) TMath::Power(2, i);
135 jmax = (Int_t) TMath::Power(2, ii) - 1;
136 for (j = jmin; j <= jmax; j++) {
137 val = working_space[j];
141 working_space[j] = val;
144 if (direction == kTransformInverse) {
145 for (m = 1; m <= iter; m++) {
148 c = TMath::Power(a, b);
150 for (i = 0; i < (2 * li); i++) {
151 working_space[i + num] = working_space[i];
153 for (j = 0; j < li; j++) {
155 jj = 2 * (j + 1) - 1;
157 val = working_space[j + num] - working_space[lj + num];
158 working_space[jj] = val;
159 val = working_space[j + num] + working_space[lj + num];
160 working_space[jj1] = val;
173 void TSpectrumTransform::Walsh(Double_t *working_space,
int num)
175 int i, m, nump = 1, mnum, mnum2, mp, ib, mp2, mnum21, iba, iter;
178 for (i = 0; i < num; i++)
179 working_space[i + num] = 0;
186 for (m = 1; m <= iter; m++) {
194 for (mp = 0; mp < nump; mp++) {
196 for (mp2 = 0; mp2 < mnum2; mp2++) {
197 mnum21 = mnum2 + mp2 + ib;
199 val1 = working_space[iba];
200 val2 = working_space[mnum21];
201 working_space[iba + num] = val1 + val2;
202 working_space[mnum21 + num] = val1 - val2;
205 for (i = 0; i < num; i++) {
206 working_space[i] = working_space[i + num];
212 for (i = 0; i < num; i++) {
213 val1 = working_space[i];
215 working_space[i] = val1;
226 void TSpectrumTransform::BitReverse(Double_t *working_space,
int num)
229 int i, ib, il, ibd, ip, ifac, i1;
230 for (i = 0; i < num; i++) {
231 working_space[i + num] = working_space[i];
233 for (i = 1; i <= num; i++) {
247 for (i1 = 1; i1 <= il; i1++) {
249 ip = ip + ifac * ipower[i1 - 1];
251 working_space[ip - 1] = working_space[i - 1 + num];
264 void TSpectrumTransform::Fourier(Double_t *working_space,
int num,
int hartley,
265 int direction,
int zt_clear)
267 int nxp2, nxp, i, j, k, m, iter, mxp, j1, j2, n1, n2, it;
268 Double_t a, b, c, d, sign, wpwr, arg, wr, wi, tr, ti, pi =
269 3.14159265358979323846;
270 Double_t val1, val2, val3, val4;
271 if (direction == kTransformForward && zt_clear == 0) {
272 for (i = 0; i < num; i++)
273 working_space[i + num] = 0;
282 if (direction == kTransformInverse)
285 for (it = 1; it <= iter; it++) {
290 for (m = 1; m <= nxp2; m++) {
293 wr = TMath::Cos(arg);
294 wi = sign * TMath::Sin(arg);
295 for (mxp = nxp; mxp <= num; mxp += nxp) {
298 val1 = working_space[j1 - 1];
299 val2 = working_space[j2 - 1];
300 val3 = working_space[j1 - 1 + num];
301 val4 = working_space[j2 - 1 + num];
310 working_space[j1 - 1] = val1;
313 working_space[j1 - 1 + num] = val1;
314 a = tr * wr - ti * wi;
316 working_space[j2 - 1] = val1;
317 a = ti * wr + tr * wi;
319 working_space[j2 - 1 + num] = val1;
326 for (i = 1; i <= n1; i++) {
329 val1 = working_space[j - 1];
330 val2 = working_space[j - 1 + num];
331 val3 = working_space[i - 1];
332 working_space[j - 1] = val3;
333 working_space[j - 1 + num] = working_space[i - 1 + num];
334 working_space[i - 1] = val1;
335 working_space[i - 1 + num] = val2;
337 lab60:
if (k >= j)
goto lab65;
345 for (i = 0; i < num; i++) {
347 val1 = working_space[i];
351 working_space[i] = val1;
352 b = working_space[i + num];
354 working_space[i + num] = b;
358 b = working_space[i];
359 c = working_space[i + num];
361 working_space[i] = b;
362 working_space[i + num] = 0;
365 if (hartley == 1 && direction == kTransformInverse) {
366 for (i = 1; i < num; i++)
367 working_space[num - i + num] = working_space[i];
368 working_space[0 + num] = working_space[0];
369 for (i = 0; i < num; i++) {
370 working_space[i] = working_space[i + num];
371 working_space[i + num] = 0;
385 void TSpectrumTransform::BitReverseHaar(Double_t *working_space,
int shift,
int num,
389 int i, ib, il, ibd, ip, ifac, i1;
390 for (i = 0; i < num; i++) {
391 working_space[i + shift + start] = working_space[i + start];
392 working_space[i + shift + start + 2 * shift] =
393 working_space[i + start + 2 * shift];
395 for (i = 1; i <= num; i++) {
409 for (i1 = 1; i1 <= il; i1++) {
411 ip = ip + ifac * ipower[i1 - 1];
413 working_space[ip - 1 + start] =
414 working_space[i - 1 + shift + start];
415 working_space[ip - 1 + start + 2 * shift] =
416 working_space[i - 1 + shift + start + 2 * shift];
430 int TSpectrumTransform::GeneralExe(Double_t *working_space,
int zt_clear,
int num,
431 int degree,
int type)
433 int i, j, k, m, nump, mnum, mnum2, mp, ib, mp2, mnum21, iba, iter,
434 mp2step, mppom, ring;
435 Double_t a, b, c, d, wpwr, arg, wr, wi, tr, ti, pi =
436 3.14159265358979323846;
437 Double_t val1, val2, val3, val4, a0oldr = 0, b0oldr = 0, a0r, b0r;
439 for (i = 0; i < num; i++)
440 working_space[i + 2 * num] = 0;
453 for (i = 0; i < iter - degree; i++)
455 for (m = 1; m <= iter; m++) {
460 && (type == kTransformFourierHaar
461 || type == kTransformWalshHaar
462 || type == kTransformCosHaar
463 || type == kTransformSinHaar))
467 for (mp = 0; mp < nump; mp++) {
468 if (type != kTransformWalshHaar) {
470 mppom = mppom % ring;
474 for (i = 0; i < (iter - 1); i++) {
475 if ((mppom & j) != 0)
481 wr = TMath::Cos(arg);
482 wi = TMath::Sin(arg);
490 for (mp2 = 0; mp2 < mnum2; mp2++) {
491 mnum21 = mnum2 + mp2 + ib;
493 if (mp2 % mp2step == 0) {
496 a0r = 1 / TMath::Sqrt(2.0);
497 b0r = 1 / TMath::Sqrt(2.0);
504 val1 = working_space[iba];
505 val2 = working_space[mnum21];
506 val3 = working_space[iba + 2 * num];
507 val4 = working_space[mnum21 + 2 * num];
512 tr = a * a0r + b * b0r;
514 working_space[num + iba] = val1;
515 ti = c * a0r + d * b0r;
517 working_space[num + iba + 2 * num] = val1;
519 a * b0r * wr - c * b0r * wi - b * a0r * wr + d * a0r * wi;
521 working_space[num + mnum21] = val1;
523 c * b0r * wr + a * b0r * wi - d * a0r * wr - b * a0r * wi;
525 working_space[num + mnum21 + 2 * num] = val1;
528 for (i = 0; i < num; i++) {
529 val1 = working_space[num + i];
530 working_space[i] = val1;
531 val1 = working_space[num + i + 2 * num];
532 working_space[i + 2 * num] = val1;
546 int TSpectrumTransform::GeneralInv(Double_t *working_space,
int num,
int degree,
549 int i, j, k, m, nump =
550 1, mnum, mnum2, mp, ib, mp2, mnum21, iba, iter, mp2step, mppom,
552 Double_t a, b, c, d, wpwr, arg, wr, wi, tr, ti, pi =
553 3.14159265358979323846;
554 Double_t val1, val2, val3, val4, a0oldr = 0, b0oldr = 0, a0r, b0r;
564 if (type == kTransformFourierHaar || type == kTransformWalshHaar
565 || type == kTransformCosHaar || type == kTransformSinHaar) {
566 for (i = 0; i < iter - degree; i++)
570 for (m = 1; m <= iter; m++) {
578 if (m > iter - degree + 1)
580 for (mp = nump - 1; mp >= 0; mp--) {
581 if (type != kTransformWalshHaar) {
583 mppom = mppom % ring;
587 for (i = 0; i < (iter - 1); i++) {
588 if ((mppom & j) != 0)
594 wr = TMath::Cos(arg);
595 wi = TMath::Sin(arg);
603 for (mp2 = 0; mp2 < mnum2; mp2++) {
604 mnum21 = mnum2 + mp2 + ib;
606 if (mp2 % mp2step == 0) {
609 a0r = 1 / TMath::Sqrt(2.0);
610 b0r = 1 / TMath::Sqrt(2.0);
617 val1 = working_space[iba];
618 val2 = working_space[mnum21];
619 val3 = working_space[iba + 2 * num];
620 val4 = working_space[mnum21 + 2 * num];
625 tr = a * a0r + b * wr * b0r + d * wi * b0r;
627 working_space[num + iba] = val1;
628 ti = c * a0r + d * wr * b0r - b * wi * b0r;
630 working_space[num + iba + 2 * num] = val1;
631 tr = a * b0r - b * wr * a0r - d * wi * a0r;
633 working_space[num + mnum21] = val1;
634 ti = c * b0r - d * wr * a0r + b * wi * a0r;
636 working_space[num + mnum21 + 2 * num] = val1;
639 if (m <= iter - degree
640 && (type == kTransformFourierHaar
641 || type == kTransformWalshHaar
642 || type == kTransformCosHaar
643 || type == kTransformSinHaar))
645 for (i = 0; i < num; i++) {
646 val1 = working_space[num + i];
647 working_space[i] = val1;
648 val1 = working_space[num + i + 2 * num];
649 working_space[i + 2 * num] = val1;
740 void TSpectrumTransform::Transform(
const Double_t *source, Double_t *destVector)
742 int i, j=0, k = 1, m, l;
744 Double_t a, b, pi = 3.14159265358979323846;
745 Double_t *working_space = 0;
746 if (fTransformType >= kTransformFourierWalsh && fTransformType <= kTransformSinHaar) {
747 if (fTransformType >= kTransformCosWalsh)
749 k = (Int_t) TMath::Power(2, fDegree);
752 switch (fTransformType) {
754 case kTransformWalsh:
755 working_space =
new Double_t[2 * fSize];
759 case kTransformFourier:
760 case kTransformHartley:
761 case kTransformFourierWalsh:
762 case kTransformFourierHaar:
763 case kTransformWalshHaar:
764 working_space =
new Double_t[4 * fSize];
766 case kTransformCosWalsh:
767 case kTransformCosHaar:
768 case kTransformSinWalsh:
769 case kTransformSinHaar:
770 working_space =
new Double_t[8 * fSize];
773 if (fDirection == kTransformForward) {
774 switch (fTransformType) {
776 for (i = 0; i < fSize; i++) {
777 working_space[i] = source[i];
779 Haar(working_space, fSize, fDirection);
780 for (i = 0; i < fSize; i++) {
781 destVector[i] = working_space[i];
784 case kTransformWalsh:
785 for (i = 0; i < fSize; i++) {
786 working_space[i] = source[i];
788 Walsh(working_space, fSize);
789 BitReverse(working_space, fSize);
790 for (i = 0; i < fSize; i++) {
791 destVector[i] = working_space[i];
796 for (i = 1; i <= (fSize / 2); i++) {
798 working_space[i - 1] = val;
799 working_space[fSize - i] = val;
801 Fourier(working_space, fSize, 0, kTransformForward, 0);
802 for (i = 0; i < fSize / 2; i++) {
803 a = pi * (Double_t) i / (Double_t) fSize;
805 b = working_space[i];
807 working_space[i] = a;
808 working_space[i + fSize] = 0;
809 } working_space[0] = working_space[0] / TMath::Sqrt(2.0);
810 for (i = 0; i < fSize / 2; i++) {
811 destVector[i] = working_space[i];
816 for (i = 1; i <= (fSize / 2); i++) {
818 working_space[i - 1] = val;
819 working_space[fSize - i] = -val;
821 Fourier(working_space, fSize, 0, kTransformForward, 0);
822 for (i = 0; i < fSize / 2; i++) {
823 a = pi * (Double_t) i / (Double_t) fSize;
825 b = working_space[i];
828 working_space[i - 1] = a;
829 working_space[i + fSize] = 0;
831 working_space[fSize / 2 - 1] =
832 working_space[fSize / 2] / TMath::Sqrt(2.0);
833 for (i = 0; i < fSize / 2; i++) {
834 destVector[i] = working_space[i];
837 case kTransformFourier:
838 for (i = 0; i < fSize; i++) {
839 working_space[i] = source[i];
841 Fourier(working_space, fSize, 0, kTransformForward, 0);
842 for (i = 0; i < 2 * fSize; i++) {
843 destVector[i] = working_space[i];
846 case kTransformHartley:
847 for (i = 0; i < fSize; i++) {
848 working_space[i] = source[i];
850 Fourier(working_space, fSize, 1, kTransformForward, 0);
851 for (i = 0; i < fSize; i++) {
852 destVector[i] = working_space[i];
855 case kTransformFourierWalsh:
856 case kTransformFourierHaar:
857 case kTransformWalshHaar:
858 case kTransformCosWalsh:
859 case kTransformCosHaar:
860 case kTransformSinWalsh:
861 case kTransformSinHaar:
862 for (i = 0; i < fSize; i++) {
864 if (fTransformType == kTransformCosWalsh
865 || fTransformType == kTransformCosHaar) {
866 j = (Int_t) TMath::Power(2, fDegree) / 2;
869 working_space[k + i % j] = val;
870 working_space[k + 2 * j - 1 - i % j] = val;
873 else if (fTransformType == kTransformSinWalsh
874 || fTransformType == kTransformSinHaar) {
875 j = (Int_t) TMath::Power(2, fDegree) / 2;
878 working_space[k + i % j] = val;
879 working_space[k + 2 * j - 1 - i % j] = -val;
883 working_space[i] = val;
885 if (fTransformType == kTransformFourierWalsh
886 || fTransformType == kTransformFourierHaar
887 || fTransformType == kTransformWalshHaar) {
888 for (i = 0; i < j; i++)
889 BitReverseHaar(working_space, fSize, k, i * k);
890 GeneralExe(working_space, 0, fSize, fDegree, fTransformType);
893 else if (fTransformType == kTransformCosWalsh
894 || fTransformType == kTransformCosHaar) {
895 m = (Int_t) TMath::Power(2, fDegree);
897 for (i = 0; i < l; i++)
898 BitReverseHaar(working_space, 2 * fSize, m, i * m);
899 GeneralExe(working_space, 0, 2 * fSize, fDegree, fTransformType);
900 for (i = 0; i < fSize; i++) {
903 a = pi * (Double_t) (i % j) / (Double_t) (2 * j);
905 b = working_space[k + i % j];
907 a = b / TMath::Sqrt(2.0);
911 working_space[i] = a;
912 working_space[i + 2 * fSize] = 0;
916 else if (fTransformType == kTransformSinWalsh
917 || fTransformType == kTransformSinHaar) {
918 m = (Int_t) TMath::Power(2, fDegree);
920 for (i = 0; i < l; i++)
921 BitReverseHaar(working_space, 2 * fSize, m, i * m);
922 GeneralExe(working_space, 0, 2 * fSize, fDegree, fTransformType);
923 for (i = 0; i < fSize; i++) {
926 a = pi * (Double_t) (i % j) / (Double_t) (2 * j);
928 b = working_space[j + k + i % j];
930 a = b / TMath::Sqrt(2.0);
934 working_space[j + k / 2 - i % j - 1] = a;
935 working_space[i + 2 * fSize] = 0;
938 if (fTransformType > kTransformWalshHaar)
939 k = (Int_t) TMath::Power(2, fDegree - 1);
942 k = (Int_t) TMath::Power(2, fDegree);
944 for (i = 0, l = 0; i < fSize; i++, l = (l + k) % fSize) {
945 working_space[fSize + i] = working_space[l + i / j];
946 working_space[fSize + i + 2 * fSize] =
947 working_space[l + i / j + 2 * fSize];
949 for (i = 0; i < fSize; i++) {
950 working_space[i] = working_space[fSize + i];
951 working_space[i + 2 * fSize] =
952 working_space[fSize + i + 2 * fSize];
954 for (i = 0; i < fSize; i++) {
955 destVector[i] = working_space[i];
957 if (fTransformType == kTransformFourierWalsh
958 || fTransformType == kTransformFourierHaar) {
959 for (i = 0; i < fSize; i++) {
960 destVector[fSize + i] = working_space[i + 2 * fSize];
967 else if (fDirection == kTransformInverse) {
968 switch (fTransformType) {
970 for (i = 0; i < fSize; i++) {
971 working_space[i] = source[i];
973 Haar(working_space, fSize, fDirection);
974 for (i = 0; i < fSize; i++) {
975 destVector[i] = working_space[i];
978 case kTransformWalsh:
979 for (i = 0; i < fSize; i++) {
980 working_space[i] = source[i];
982 BitReverse(working_space, fSize);
983 Walsh(working_space, fSize);
984 for (i = 0; i < fSize; i++) {
985 destVector[i] = working_space[i];
989 for (i = 0; i < fSize; i++) {
990 working_space[i] = source[i];
993 working_space[0] = working_space[0] * TMath::Sqrt(2.0);
994 for (i = 0; i < fSize / 2; i++) {
995 a = pi * (Double_t) i / (Double_t) fSize;
998 working_space[i + fSize] = (Double_t) working_space[i] * b;
999 working_space[i] = (Double_t) working_space[i] * a;
1000 } for (i = 2; i <= (fSize / 2); i++) {
1001 working_space[fSize - i + 1] = working_space[i - 1];
1002 working_space[fSize - i + 1 + fSize] =
1003 -working_space[i - 1 + fSize];
1005 working_space[fSize / 2] = 0;
1006 working_space[fSize / 2 + fSize] = 0;
1007 Fourier(working_space, fSize, 0, kTransformInverse, 1);
1008 for (i = 0; i < fSize / 2; i++) {
1009 destVector[i] = working_space[i];
1013 for (i = 0; i < fSize; i++) {
1014 working_space[i] = source[i];
1017 working_space[fSize / 2] =
1018 working_space[fSize / 2 - 1] * TMath::Sqrt(2.0);
1019 for (i = fSize / 2 - 1; i > 0; i--) {
1020 a = pi * (Double_t) i / (Double_t) fSize;
1021 working_space[i + fSize] =
1022 -(Double_t) working_space[i - 1] * TMath::Cos(a);
1024 (Double_t) working_space[i - 1] * TMath::Sin(a);
1025 } for (i = 2; i <= (fSize / 2); i++) {
1026 working_space[fSize - i + 1] = working_space[i - 1];
1027 working_space[fSize - i + 1 + fSize] =
1028 -working_space[i - 1 + fSize];
1030 working_space[0] = 0;
1031 working_space[fSize] = 0;
1032 working_space[fSize / 2 + fSize] = 0;
1033 Fourier(working_space, fSize, 0, kTransformInverse, 0);
1034 for (i = 0; i < fSize / 2; i++) {
1035 destVector[i] = working_space[i];
1038 case kTransformFourier:
1039 for (i = 0; i < 2 * fSize; i++) {
1040 working_space[i] = source[i];
1042 Fourier(working_space, fSize, 0, kTransformInverse, 0);
1043 for (i = 0; i < fSize; i++) {
1044 destVector[i] = working_space[i];
1047 case kTransformHartley:
1048 for (i = 0; i < fSize; i++) {
1049 working_space[i] = source[i];
1051 Fourier(working_space, fSize, 1, kTransformInverse, 0);
1052 for (i = 0; i < fSize; i++) {
1053 destVector[i] = working_space[i];
1056 case kTransformFourierWalsh:
1057 case kTransformFourierHaar:
1058 case kTransformWalshHaar:
1059 case kTransformCosWalsh:
1060 case kTransformCosHaar:
1061 case kTransformSinWalsh:
1062 case kTransformSinHaar:
1063 for (i = 0; i < fSize; i++) {
1064 working_space[i] = source[i];
1066 if (fTransformType == kTransformFourierWalsh
1067 || fTransformType == kTransformFourierHaar) {
1068 for (i = 0; i < fSize; i++) {
1069 working_space[i + 2 * fSize] = source[fSize + i];
1072 if (fTransformType > kTransformWalshHaar)
1073 k = (Int_t) TMath::Power(2, fDegree - 1);
1076 k = (Int_t) TMath::Power(2, fDegree);
1078 for (i = 0, l = 0; i < fSize; i++, l = (l + k) % fSize) {
1079 working_space[fSize + l + i / j] = working_space[i];
1080 working_space[fSize + l + i / j + 2 * fSize] =
1081 working_space[i + 2 * fSize];
1083 for (i = 0; i < fSize; i++) {
1084 working_space[i] = working_space[fSize + i];
1085 working_space[i + 2 * fSize] =
1086 working_space[fSize + i + 2 * fSize];
1088 if (fTransformType == kTransformFourierWalsh
1089 || fTransformType == kTransformFourierHaar
1090 || fTransformType == kTransformWalshHaar) {
1091 GeneralInv(working_space, fSize, fDegree, fTransformType);
1092 for (i = 0; i < j; i++)
1093 BitReverseHaar(working_space, fSize, k, i * k);
1096 else if (fTransformType == kTransformCosWalsh
1097 || fTransformType == kTransformCosHaar) {
1098 j = (Int_t) TMath::Power(2, fDegree) / 2;
1099 m = (Int_t) TMath::Power(2, fDegree);
1101 for (i = 0; i < fSize; i++) {
1104 a = pi * (Double_t) (i % j) / (Double_t) (2 * j);
1106 working_space[2 * fSize + k + i % j] =
1107 working_space[i] * TMath::Sqrt(2.0);
1108 working_space[4 * fSize + 2 * fSize + k + i % j] = 0;
1114 working_space[4 * fSize + 2 * fSize + k + i % j] =
1115 -(Double_t) working_space[i] * b;
1116 working_space[2 * fSize + k + i % j] =
1117 (Double_t) working_space[i] * a;
1118 } }
for (i = 0; i < fSize; i++) {
1122 working_space[2 * fSize + k + j] = 0;
1123 working_space[4 * fSize + 2 * fSize + k + j] = 0;
1127 working_space[2 * fSize + k + 2 * j - i % j] =
1128 working_space[2 * fSize + k + i % j];
1129 working_space[4 * fSize + 2 * fSize + k + 2 * j - i % j] =
1130 -working_space[4 * fSize + 2 * fSize + k + i % j];
1133 for (i = 0; i < 2 * fSize; i++) {
1134 working_space[i] = working_space[2 * fSize + i];
1135 working_space[4 * fSize + i] =
1136 working_space[4 * fSize + 2 * fSize + i];
1138 GeneralInv(working_space, 2 * fSize, fDegree, fTransformType);
1139 m = (Int_t) TMath::Power(2, fDegree);
1141 for (i = 0; i < l; i++)
1142 BitReverseHaar(working_space, 2 * fSize, m, i * m);
1145 else if (fTransformType == kTransformSinWalsh
1146 || fTransformType == kTransformSinHaar) {
1147 j = (Int_t) TMath::Power(2, fDegree) / 2;
1148 m = (Int_t) TMath::Power(2, fDegree);
1150 for (i = 0; i < fSize; i++) {
1153 a = pi * (Double_t) (i % j) / (Double_t) (2 * j);
1155 working_space[2 * fSize + k + j + i % j] =
1156 working_space[j + k / 2 - i % j -
1157 1] * TMath::Sqrt(2.0);
1158 working_space[4 * fSize + 2 * fSize + k + j + i % j] = 0;
1164 working_space[4 * fSize + 2 * fSize + k + j + i % j] =
1165 -(Double_t) working_space[j + k / 2 - i % j - 1] * b;
1166 working_space[2 * fSize + k + j + i % j] =
1167 (Double_t) working_space[j + k / 2 - i % j - 1] * a;
1168 } }
for (i = 0; i < fSize; i++) {
1172 working_space[2 * fSize + k] = 0;
1173 working_space[4 * fSize + 2 * fSize + k] = 0;
1177 working_space[2 * fSize + k + i % j] =
1178 working_space[2 * fSize + k + 2 * j - i % j];
1179 working_space[4 * fSize + 2 * fSize + k + i % j] =
1180 -working_space[4 * fSize + 2 * fSize + k + 2 * j -
1184 for (i = 0; i < 2 * fSize; i++) {
1185 working_space[i] = working_space[2 * fSize + i];
1186 working_space[4 * fSize + i] =
1187 working_space[4 * fSize + 2 * fSize + i];
1189 GeneralInv(working_space, 2 * fSize, fDegree, fTransformType);
1190 for (i = 0; i < l; i++)
1191 BitReverseHaar(working_space, 2 * fSize, m, i * m);
1193 for (i = 0; i < fSize; i++) {
1194 if (fTransformType >= kTransformCosWalsh) {
1197 val = working_space[k + i % j];
1201 val = working_space[i];
1202 destVector[i] = val;
1207 delete[]working_space;
1268 void TSpectrumTransform::FilterZonal(
const Double_t *source, Double_t *destVector)
1270 int i, j=0, k = 1, m, l;
1272 Double_t *working_space = 0;
1273 Double_t a, b, pi = 3.14159265358979323846, old_area, new_area;
1274 if (fTransformType >= kTransformFourierWalsh && fTransformType <= kTransformSinHaar) {
1275 if (fTransformType >= kTransformCosWalsh)
1277 k = (Int_t) TMath::Power(2, fDegree);
1280 switch (fTransformType) {
1281 case kTransformHaar:
1282 case kTransformWalsh:
1283 working_space =
new Double_t[2 * fSize];
1287 case kTransformFourier:
1288 case kTransformHartley:
1289 case kTransformFourierWalsh:
1290 case kTransformFourierHaar:
1291 case kTransformWalshHaar:
1292 working_space =
new Double_t[4 * fSize];
1294 case kTransformCosWalsh:
1295 case kTransformCosHaar:
1296 case kTransformSinWalsh:
1297 case kTransformSinHaar:
1298 working_space =
new Double_t[8 * fSize];
1301 switch (fTransformType) {
1302 case kTransformHaar:
1303 for (i = 0; i < fSize; i++) {
1304 working_space[i] = source[i];
1306 Haar(working_space, fSize, kTransformForward);
1308 case kTransformWalsh:
1309 for (i = 0; i < fSize; i++) {
1310 working_space[i] = source[i];
1312 Walsh(working_space, fSize);
1313 BitReverse(working_space, fSize);
1317 for (i = 1; i <= (fSize / 2); i++) {
1318 val = source[i - 1];
1319 working_space[i - 1] = val;
1320 working_space[fSize - i] = val;
1322 Fourier(working_space, fSize, 0, kTransformForward, 0);
1323 for (i = 0; i < fSize / 2; i++) {
1324 a = pi * (Double_t) i / (Double_t) fSize;
1326 b = working_space[i];
1328 working_space[i] = a;
1329 working_space[i + fSize] = 0;
1330 } working_space[0] = working_space[0] / TMath::Sqrt(2.0);
1335 for (i = 1; i <= (fSize / 2); i++) {
1336 val = source[i - 1];
1337 working_space[i - 1] = val;
1338 working_space[fSize - i] = -val;
1340 Fourier(working_space, fSize, 0, kTransformForward, 0);
1341 for (i = 0; i < fSize / 2; i++) {
1342 a = pi * (Double_t) i / (Double_t) fSize;
1344 b = working_space[i];
1347 working_space[i - 1] = a;
1348 working_space[i + fSize] = 0;
1350 working_space[fSize / 2 - 1] =
1351 working_space[fSize / 2] / TMath::Sqrt(2.0);
1354 case kTransformFourier:
1355 for (i = 0; i < fSize; i++) {
1356 working_space[i] = source[i];
1358 Fourier(working_space, fSize, 0, kTransformForward, 0);
1360 case kTransformHartley:
1361 for (i = 0; i < fSize; i++) {
1362 working_space[i] = source[i];
1364 Fourier(working_space, fSize, 1, kTransformForward, 0);
1366 case kTransformFourierWalsh:
1367 case kTransformFourierHaar:
1368 case kTransformWalshHaar:
1369 case kTransformCosWalsh:
1370 case kTransformCosHaar:
1371 case kTransformSinWalsh:
1372 case kTransformSinHaar:
1373 for (i = 0; i < fSize; i++) {
1375 if (fTransformType == kTransformCosWalsh || fTransformType == kTransformCosHaar) {
1376 j = (Int_t) TMath::Power(2, fDegree) / 2;
1379 working_space[k + i % j] = val;
1380 working_space[k + 2 * j - 1 - i % j] = val;
1383 else if (fTransformType == kTransformSinWalsh
1384 || fTransformType == kTransformSinHaar) {
1385 j = (Int_t) TMath::Power(2, fDegree) / 2;
1388 working_space[k + i % j] = val;
1389 working_space[k + 2 * j - 1 - i % j] = -val;
1393 working_space[i] = val;
1395 if (fTransformType == kTransformFourierWalsh
1396 || fTransformType == kTransformFourierHaar
1397 || fTransformType == kTransformWalshHaar) {
1398 for (i = 0; i < j; i++)
1399 BitReverseHaar(working_space, fSize, k, i * k);
1400 GeneralExe(working_space, 0, fSize, fDegree, fTransformType);
1403 else if (fTransformType == kTransformCosWalsh || fTransformType == kTransformCosHaar) {
1404 m = (Int_t) TMath::Power(2, fDegree);
1406 for (i = 0; i < l; i++)
1407 BitReverseHaar(working_space, 2 * fSize, m, i * m);
1408 GeneralExe(working_space, 0, 2 * fSize, fDegree, fTransformType);
1409 for (i = 0; i < fSize; i++) {
1412 a = pi * (Double_t) (i % j) / (Double_t) (2 * j);
1414 b = working_space[k + i % j];
1416 a = b / TMath::Sqrt(2.0);
1420 working_space[i] = a;
1421 working_space[i + 2 * fSize] = 0;
1425 else if (fTransformType == kTransformSinWalsh || fTransformType == kTransformSinHaar) {
1426 m = (Int_t) TMath::Power(2, fDegree);
1428 for (i = 0; i < l; i++)
1429 BitReverseHaar(working_space, 2 * fSize, m, i * m);
1430 GeneralExe(working_space, 0, 2 * fSize, fDegree, fTransformType);
1431 for (i = 0; i < fSize; i++) {
1434 a = pi * (Double_t) (i % j) / (Double_t) (2 * j);
1436 b = working_space[j + k + i % j];
1438 a = b / TMath::Sqrt(2.0);
1442 working_space[j + k / 2 - i % j - 1] = a;
1443 working_space[i + 2 * fSize] = 0;
1446 if (fTransformType > kTransformWalshHaar)
1447 k = (Int_t) TMath::Power(2, fDegree - 1);
1450 k = (Int_t) TMath::Power(2, fDegree);
1452 for (i = 0, l = 0; i < fSize; i++, l = (l + k) % fSize) {
1453 working_space[fSize + i] = working_space[l + i / j];
1454 working_space[fSize + i + 2 * fSize] =
1455 working_space[l + i / j + 2 * fSize];
1457 for (i = 0; i < fSize; i++) {
1458 working_space[i] = working_space[fSize + i];
1459 working_space[i + 2 * fSize] = working_space[fSize + i + 2 * fSize];
1463 if (!working_space)
return;
1464 for (i = 0, old_area = 0; i < fSize; i++) {
1465 old_area += working_space[i];
1467 for (i = 0, new_area = 0; i < fSize; i++) {
1468 if (i >= fXmin && i <= fXmax)
1469 working_space[i] = fFilterCoeff;
1470 new_area += working_space[i];
1472 if (new_area != 0) {
1473 a = old_area / new_area;
1474 for (i = 0; i < fSize; i++) {
1475 working_space[i] *= a;
1478 if (fTransformType == kTransformFourier) {
1479 for (i = 0, old_area = 0; i < fSize; i++) {
1480 old_area += working_space[i + fSize];
1482 for (i = 0, new_area = 0; i < fSize; i++) {
1483 if (i >= fXmin && i <= fXmax)
1484 working_space[i + fSize] = fFilterCoeff;
1485 new_area += working_space[i + fSize];
1487 if (new_area != 0) {
1488 a = old_area / new_area;
1489 for (i = 0; i < fSize; i++) {
1490 working_space[i + fSize] *= a;
1495 else if (fTransformType == kTransformFourierWalsh
1496 || fTransformType == kTransformFourierHaar) {
1497 for (i = 0, old_area = 0; i < fSize; i++) {
1498 old_area += working_space[i + 2 * fSize];
1500 for (i = 0, new_area = 0; i < fSize; i++) {
1501 if (i >= fXmin && i <= fXmax)
1502 working_space[i + 2 * fSize] = fFilterCoeff;
1503 new_area += working_space[i + 2 * fSize];
1505 if (new_area != 0) {
1506 a = old_area / new_area;
1507 for (i = 0; i < fSize; i++) {
1508 working_space[i + 2 * fSize] *= a;
1512 switch (fTransformType) {
1513 case kTransformHaar:
1514 Haar(working_space, fSize, kTransformInverse);
1515 for (i = 0; i < fSize; i++) {
1516 destVector[i] = working_space[i];
1519 case kTransformWalsh:
1520 BitReverse(working_space, fSize);
1521 Walsh(working_space, fSize);
1522 for (i = 0; i < fSize; i++) {
1523 destVector[i] = working_space[i];
1528 working_space[0] = working_space[0] * TMath::Sqrt(2.0);
1529 for (i = 0; i < fSize / 2; i++) {
1530 a = pi * (Double_t) i / (Double_t) fSize;
1533 working_space[i + fSize] = (Double_t) working_space[i] * b;
1534 working_space[i] = (Double_t) working_space[i] * a;
1535 } for (i = 2; i <= (fSize / 2); i++) {
1536 working_space[fSize - i + 1] = working_space[i - 1];
1537 working_space[fSize - i + 1 + fSize] =
1538 -working_space[i - 1 + fSize];
1540 working_space[fSize / 2] = 0;
1541 working_space[fSize / 2 + fSize] = 0;
1542 Fourier(working_space, fSize, 0, kTransformInverse, 1);
1543 for (i = 0; i < fSize / 2; i++) {
1544 destVector[i] = working_space[i];
1549 working_space[fSize / 2] =
1550 working_space[fSize / 2 - 1] * TMath::Sqrt(2.0);
1551 for (i = fSize / 2 - 1; i > 0; i--) {
1552 a = pi * (Double_t) i / (Double_t) fSize;
1553 working_space[i + fSize] =
1554 -(Double_t) working_space[i - 1] * TMath::Cos(a);
1555 working_space[i] = (Double_t) working_space[i - 1] * TMath::Sin(a);
1556 } for (i = 2; i <= (fSize / 2); i++) {
1557 working_space[fSize - i + 1] = working_space[i - 1];
1558 working_space[fSize - i + 1 + fSize] =
1559 -working_space[i - 1 + fSize];
1561 working_space[0] = 0;
1562 working_space[fSize] = 0;
1563 working_space[fSize / 2 + fSize] = 0;
1564 Fourier(working_space, fSize, 0, kTransformInverse, 0);
1565 for (i = 0; i < fSize / 2; i++) {
1566 destVector[i] = working_space[i];
1569 case kTransformFourier:
1570 Fourier(working_space, fSize, 0, kTransformInverse, 0);
1571 for (i = 0; i < fSize; i++) {
1572 destVector[i] = working_space[i];
1575 case kTransformHartley:
1576 Fourier(working_space, fSize, 1, kTransformInverse, 0);
1577 for (i = 0; i < fSize; i++) {
1578 destVector[i] = working_space[i];
1581 case kTransformFourierWalsh:
1582 case kTransformFourierHaar:
1583 case kTransformWalshHaar:
1584 case kTransformCosWalsh:
1585 case kTransformCosHaar:
1586 case kTransformSinWalsh:
1587 case kTransformSinHaar:
1588 if (fTransformType > kTransformWalshHaar)
1589 k = (Int_t) TMath::Power(2, fDegree - 1);
1592 k = (Int_t) TMath::Power(2, fDegree);
1594 for (i = 0, l = 0; i < fSize; i++, l = (l + k) % fSize) {
1595 working_space[fSize + l + i / j] = working_space[i];
1596 working_space[fSize + l + i / j + 2 * fSize] =
1597 working_space[i + 2 * fSize];
1599 for (i = 0; i < fSize; i++) {
1600 working_space[i] = working_space[fSize + i];
1601 working_space[i + 2 * fSize] = working_space[fSize + i + 2 * fSize];
1603 if (fTransformType == kTransformFourierWalsh
1604 || fTransformType == kTransformFourierHaar
1605 || fTransformType == kTransformWalshHaar) {
1606 GeneralInv(working_space, fSize, fDegree, fTransformType);
1607 for (i = 0; i < j; i++)
1608 BitReverseHaar(working_space, fSize, k, i * k);
1611 else if (fTransformType == kTransformCosWalsh || fTransformType == kTransformCosHaar) {
1612 j = (Int_t) TMath::Power(2, fDegree) / 2;
1613 m = (Int_t) TMath::Power(2, fDegree);
1615 for (i = 0; i < fSize; i++) {
1618 a = pi * (Double_t) (i % j) / (Double_t) (2 * j);
1620 working_space[2 * fSize + k + i % j] =
1621 working_space[i] * TMath::Sqrt(2.0);
1622 working_space[4 * fSize + 2 * fSize + k + i % j] = 0;
1628 working_space[4 * fSize + 2 * fSize + k + i % j] =
1629 -(Double_t) working_space[i] * b;
1630 working_space[2 * fSize + k + i % j] =
1631 (Double_t) working_space[i] * a;
1632 } }
for (i = 0; i < fSize; i++) {
1636 working_space[2 * fSize + k + j] = 0;
1637 working_space[4 * fSize + 2 * fSize + k + j] = 0;
1641 working_space[2 * fSize + k + 2 * j - i % j] =
1642 working_space[2 * fSize + k + i % j];
1643 working_space[4 * fSize + 2 * fSize + k + 2 * j - i % j] =
1644 -working_space[4 * fSize + 2 * fSize + k + i % j];
1647 for (i = 0; i < 2 * fSize; i++) {
1648 working_space[i] = working_space[2 * fSize + i];
1649 working_space[4 * fSize + i] =
1650 working_space[4 * fSize + 2 * fSize + i];
1652 GeneralInv(working_space, 2 * fSize, fDegree, fTransformType);
1653 m = (Int_t) TMath::Power(2, fDegree);
1655 for (i = 0; i < l; i++)
1656 BitReverseHaar(working_space, 2 * fSize, m, i * m);
1659 else if (fTransformType == kTransformSinWalsh || fTransformType == kTransformSinHaar) {
1660 j = (Int_t) TMath::Power(2, fDegree) / 2;
1661 m = (Int_t) TMath::Power(2, fDegree);
1663 for (i = 0; i < fSize; i++) {
1666 a = pi * (Double_t) (i % j) / (Double_t) (2 * j);
1668 working_space[2 * fSize + k + j + i % j] =
1669 working_space[j + k / 2 - i % j - 1] * TMath::Sqrt(2.0);
1670 working_space[4 * fSize + 2 * fSize + k + j + i % j] = 0;
1676 working_space[4 * fSize + 2 * fSize + k + j + i % j] =
1677 -(Double_t) working_space[j + k / 2 - i % j - 1] * b;
1678 working_space[2 * fSize + k + j + i % j] =
1679 (Double_t) working_space[j + k / 2 - i % j - 1] * a;
1680 } }
for (i = 0; i < fSize; i++) {
1684 working_space[2 * fSize + k] = 0;
1685 working_space[4 * fSize + 2 * fSize + k] = 0;
1689 working_space[2 * fSize + k + i % j] =
1690 working_space[2 * fSize + k + 2 * j - i % j];
1691 working_space[4 * fSize + 2 * fSize + k + i % j] =
1692 -working_space[4 * fSize + 2 * fSize + k + 2 * j - i % j];
1695 for (i = 0; i < 2 * fSize; i++) {
1696 working_space[i] = working_space[2 * fSize + i];
1697 working_space[4 * fSize + i] =
1698 working_space[4 * fSize + 2 * fSize + i];
1700 GeneralInv(working_space, 2 * fSize, fDegree, fTransformType);
1701 for (i = 0; i < l; i++)
1702 BitReverseHaar(working_space, 2 * fSize, m, i * m);
1704 for (i = 0; i < fSize; i++) {
1705 if (fTransformType >= kTransformCosWalsh) {
1708 val = working_space[k + i % j];
1712 val = working_space[i];
1713 destVector[i] = val;
1717 delete[]working_space;
1778 void TSpectrumTransform::Enhance(
const Double_t *source, Double_t *destVector)
1780 int i, j=0, k = 1, m, l;
1782 Double_t *working_space = 0;
1783 Double_t a, b, pi = 3.14159265358979323846, old_area, new_area;
1784 if (fTransformType >= kTransformFourierWalsh && fTransformType <= kTransformSinHaar) {
1785 if (fTransformType >= kTransformCosWalsh)
1787 k = (Int_t) TMath::Power(2, fDegree);
1790 switch (fTransformType) {
1791 case kTransformHaar:
1792 case kTransformWalsh:
1793 working_space =
new Double_t[2 * fSize];
1797 case kTransformFourier:
1798 case kTransformHartley:
1799 case kTransformFourierWalsh:
1800 case kTransformFourierHaar:
1801 case kTransformWalshHaar:
1802 working_space =
new Double_t[4 * fSize];
1804 case kTransformCosWalsh:
1805 case kTransformCosHaar:
1806 case kTransformSinWalsh:
1807 case kTransformSinHaar:
1808 working_space =
new Double_t[8 * fSize];
1811 switch (fTransformType) {
1812 case kTransformHaar:
1813 for (i = 0; i < fSize; i++) {
1814 working_space[i] = source[i];
1816 Haar(working_space, fSize, kTransformForward);
1818 case kTransformWalsh:
1819 for (i = 0; i < fSize; i++) {
1820 working_space[i] = source[i];
1822 Walsh(working_space, fSize);
1823 BitReverse(working_space, fSize);
1827 for (i = 1; i <= (fSize / 2); i++) {
1828 val = source[i - 1];
1829 working_space[i - 1] = val;
1830 working_space[fSize - i] = val;
1832 Fourier(working_space, fSize, 0, kTransformForward, 0);
1833 for (i = 0; i < fSize / 2; i++) {
1834 a = pi * (Double_t) i / (Double_t) fSize;
1836 b = working_space[i];
1838 working_space[i] = a;
1839 working_space[i + fSize] = 0;
1840 } working_space[0] = working_space[0] / TMath::Sqrt(2.0);
1845 for (i = 1; i <= (fSize / 2); i++) {
1846 val = source[i - 1];
1847 working_space[i - 1] = val;
1848 working_space[fSize - i] = -val;
1850 Fourier(working_space, fSize, 0, kTransformForward, 0);
1851 for (i = 0; i < fSize / 2; i++) {
1852 a = pi * (Double_t) i / (Double_t) fSize;
1854 b = working_space[i];
1857 working_space[i - 1] = a;
1858 working_space[i + fSize] = 0;
1860 working_space[fSize / 2 - 1] =
1861 working_space[fSize / 2] / TMath::Sqrt(2.0);
1864 case kTransformFourier:
1865 for (i = 0; i < fSize; i++) {
1866 working_space[i] = source[i];
1868 Fourier(working_space, fSize, 0, kTransformForward, 0);
1870 case kTransformHartley:
1871 for (i = 0; i < fSize; i++) {
1872 working_space[i] = source[i];
1874 Fourier(working_space, fSize, 1, kTransformForward, 0);
1876 case kTransformFourierWalsh:
1877 case kTransformFourierHaar:
1878 case kTransformWalshHaar:
1879 case kTransformCosWalsh:
1880 case kTransformCosHaar:
1881 case kTransformSinWalsh:
1882 case kTransformSinHaar:
1883 for (i = 0; i < fSize; i++) {
1885 if (fTransformType == kTransformCosWalsh || fTransformType == kTransformCosHaar) {
1886 j = (Int_t) TMath::Power(2, fDegree) / 2;
1889 working_space[k + i % j] = val;
1890 working_space[k + 2 * j - 1 - i % j] = val;
1893 else if (fTransformType == kTransformSinWalsh
1894 || fTransformType == kTransformSinHaar) {
1895 j = (Int_t) TMath::Power(2, fDegree) / 2;
1898 working_space[k + i % j] = val;
1899 working_space[k + 2 * j - 1 - i % j] = -val;
1903 working_space[i] = val;
1905 if (fTransformType == kTransformFourierWalsh
1906 || fTransformType == kTransformFourierHaar
1907 || fTransformType == kTransformWalshHaar) {
1908 for (i = 0; i < j; i++)
1909 BitReverseHaar(working_space, fSize, k, i * k);
1910 GeneralExe(working_space, 0, fSize, fDegree, fTransformType);
1913 else if (fTransformType == kTransformCosWalsh || fTransformType == kTransformCosHaar) {
1914 m = (Int_t) TMath::Power(2, fDegree);
1916 for (i = 0; i < l; i++)
1917 BitReverseHaar(working_space, 2 * fSize, m, i * m);
1918 GeneralExe(working_space, 0, 2 * fSize, fDegree, fTransformType);
1919 for (i = 0; i < fSize; i++) {
1922 a = pi * (Double_t) (i % j) / (Double_t) (2 * j);
1924 b = working_space[k + i % j];
1926 a = b / TMath::Sqrt(2.0);
1930 working_space[i] = a;
1931 working_space[i + 2 * fSize] = 0;
1935 else if (fTransformType == kTransformSinWalsh || fTransformType == kTransformSinHaar) {
1936 m = (Int_t) TMath::Power(2, fDegree);
1938 for (i = 0; i < l; i++)
1939 BitReverseHaar(working_space, 2 * fSize, m, i * m);
1940 GeneralExe(working_space, 0, 2 * fSize, fDegree, fTransformType);
1941 for (i = 0; i < fSize; i++) {
1944 a = pi * (Double_t) (i % j) / (Double_t) (2 * j);
1946 b = working_space[j + k + i % j];
1948 a = b / TMath::Sqrt(2.0);
1952 working_space[j + k / 2 - i % j - 1] = a;
1953 working_space[i + 2 * fSize] = 0;
1956 if (fTransformType > kTransformWalshHaar)
1957 k = (Int_t) TMath::Power(2, fDegree - 1);
1960 k = (Int_t) TMath::Power(2, fDegree);
1962 for (i = 0, l = 0; i < fSize; i++, l = (l + k) % fSize) {
1963 working_space[fSize + i] = working_space[l + i / j];
1964 working_space[fSize + i + 2 * fSize] =
1965 working_space[l + i / j + 2 * fSize];
1967 for (i = 0; i < fSize; i++) {
1968 working_space[i] = working_space[fSize + i];
1969 working_space[i + 2 * fSize] = working_space[fSize + i + 2 * fSize];
1973 if (!working_space)
return;
1974 for (i = 0, old_area = 0; i < fSize; i++) {
1975 old_area += working_space[i];
1977 for (i = 0, new_area = 0; i < fSize; i++) {
1978 if (i >= fXmin && i <= fXmax)
1979 working_space[i] *= fEnhanceCoeff;
1980 new_area += working_space[i];
1982 if (new_area != 0) {
1983 a = old_area / new_area;
1984 for (i = 0; i < fSize; i++) {
1985 working_space[i] *= a;
1988 if (fTransformType == kTransformFourier) {
1989 for (i = 0, old_area = 0; i < fSize; i++) {
1990 old_area += working_space[i + fSize];
1992 for (i = 0, new_area = 0; i < fSize; i++) {
1993 if (i >= fXmin && i <= fXmax)
1994 working_space[i + fSize] *= fEnhanceCoeff;
1995 new_area += working_space[i + fSize];
1997 if (new_area != 0) {
1998 a = old_area / new_area;
1999 for (i = 0; i < fSize; i++) {
2000 working_space[i + fSize] *= a;
2005 else if (fTransformType == kTransformFourierWalsh
2006 || fTransformType == kTransformFourierHaar) {
2007 for (i = 0, old_area = 0; i < fSize; i++) {
2008 old_area += working_space[i + 2 * fSize];
2010 for (i = 0, new_area = 0; i < fSize; i++) {
2011 if (i >= fXmin && i <= fXmax)
2012 working_space[i + 2 * fSize] *= fEnhanceCoeff;
2013 new_area += working_space[i + 2 * fSize];
2015 if (new_area != 0) {
2016 a = old_area / new_area;
2017 for (i = 0; i < fSize; i++) {
2018 working_space[i + 2 * fSize] *= a;
2022 switch (fTransformType) {
2023 case kTransformHaar:
2024 Haar(working_space, fSize, kTransformInverse);
2025 for (i = 0; i < fSize; i++) {
2026 destVector[i] = working_space[i];
2029 case kTransformWalsh:
2030 BitReverse(working_space, fSize);
2031 Walsh(working_space, fSize);
2032 for (i = 0; i < fSize; i++) {
2033 destVector[i] = working_space[i];
2038 working_space[0] = working_space[0] * TMath::Sqrt(2.0);
2039 for (i = 0; i < fSize / 2; i++) {
2040 a = pi * (Double_t) i / (Double_t) fSize;
2043 working_space[i + fSize] = (Double_t) working_space[i] * b;
2044 working_space[i] = (Double_t) working_space[i] * a;
2045 } for (i = 2; i <= (fSize / 2); i++) {
2046 working_space[fSize - i + 1] = working_space[i - 1];
2047 working_space[fSize - i + 1 + fSize] =
2048 -working_space[i - 1 + fSize];
2050 working_space[fSize / 2] = 0;
2051 working_space[fSize / 2 + fSize] = 0;
2052 Fourier(working_space, fSize, 0, kTransformInverse, 1);
2053 for (i = 0; i < fSize / 2; i++) {
2054 destVector[i] = working_space[i];
2059 working_space[fSize / 2] =
2060 working_space[fSize / 2 - 1] * TMath::Sqrt(2.0);
2061 for (i = fSize / 2 - 1; i > 0; i--) {
2062 a = pi * (Double_t) i / (Double_t) fSize;
2063 working_space[i + fSize] =
2064 -(Double_t) working_space[i - 1] * TMath::Cos(a);
2065 working_space[i] = (Double_t) working_space[i - 1] * TMath::Sin(a);
2066 } for (i = 2; i <= (fSize / 2); i++) {
2067 working_space[fSize - i + 1] = working_space[i - 1];
2068 working_space[fSize - i + 1 + fSize] =
2069 -working_space[i - 1 + fSize];
2071 working_space[0] = 0;
2072 working_space[fSize] = 0;
2073 working_space[fSize / 2 + fSize] = 0;
2074 Fourier(working_space, fSize, 0, kTransformInverse, 0);
2075 for (i = 0; i < fSize / 2; i++) {
2076 destVector[i] = working_space[i];
2079 case kTransformFourier:
2080 Fourier(working_space, fSize, 0, kTransformInverse, 0);
2081 for (i = 0; i < fSize; i++) {
2082 destVector[i] = working_space[i];
2085 case kTransformHartley:
2086 Fourier(working_space, fSize, 1, kTransformInverse, 0);
2087 for (i = 0; i < fSize; i++) {
2088 destVector[i] = working_space[i];
2091 case kTransformFourierWalsh:
2092 case kTransformFourierHaar:
2093 case kTransformWalshHaar:
2094 case kTransformCosWalsh:
2095 case kTransformCosHaar:
2096 case kTransformSinWalsh:
2097 case kTransformSinHaar:
2098 if (fTransformType > kTransformWalshHaar)
2099 k = (Int_t) TMath::Power(2, fDegree - 1);
2102 k = (Int_t) TMath::Power(2, fDegree);
2104 for (i = 0, l = 0; i < fSize; i++, l = (l + k) % fSize) {
2105 working_space[fSize + l + i / j] = working_space[i];
2106 working_space[fSize + l + i / j + 2 * fSize] =
2107 working_space[i + 2 * fSize];
2109 for (i = 0; i < fSize; i++) {
2110 working_space[i] = working_space[fSize + i];
2111 working_space[i + 2 * fSize] = working_space[fSize + i + 2 * fSize];
2113 if (fTransformType == kTransformFourierWalsh
2114 || fTransformType == kTransformFourierHaar
2115 || fTransformType == kTransformWalshHaar) {
2116 GeneralInv(working_space, fSize, fDegree, fTransformType);
2117 for (i = 0; i < j; i++)
2118 BitReverseHaar(working_space, fSize, k, i * k);
2121 else if (fTransformType == kTransformCosWalsh || fTransformType == kTransformCosHaar) {
2122 j = (Int_t) TMath::Power(2, fDegree) / 2;
2123 m = (Int_t) TMath::Power(2, fDegree);
2125 for (i = 0; i < fSize; i++) {
2128 a = pi * (Double_t) (i % j) / (Double_t) (2 * j);
2130 working_space[2 * fSize + k + i % j] =
2131 working_space[i] * TMath::Sqrt(2.0);
2132 working_space[4 * fSize + 2 * fSize + k + i % j] = 0;
2138 working_space[4 * fSize + 2 * fSize + k + i % j] =
2139 -(Double_t) working_space[i] * b;
2140 working_space[2 * fSize + k + i % j] =
2141 (Double_t) working_space[i] * a;
2142 } }
for (i = 0; i < fSize; i++) {
2146 working_space[2 * fSize + k + j] = 0;
2147 working_space[4 * fSize + 2 * fSize + k + j] = 0;
2151 working_space[2 * fSize + k + 2 * j - i % j] =
2152 working_space[2 * fSize + k + i % j];
2153 working_space[4 * fSize + 2 * fSize + k + 2 * j - i % j] =
2154 -working_space[4 * fSize + 2 * fSize + k + i % j];
2157 for (i = 0; i < 2 * fSize; i++) {
2158 working_space[i] = working_space[2 * fSize + i];
2159 working_space[4 * fSize + i] =
2160 working_space[4 * fSize + 2 * fSize + i];
2162 GeneralInv(working_space, 2 * fSize, fDegree, fTransformType);
2163 m = (Int_t) TMath::Power(2, fDegree);
2165 for (i = 0; i < l; i++)
2166 BitReverseHaar(working_space, 2 * fSize, m, i * m);
2169 else if (fTransformType == kTransformSinWalsh || fTransformType == kTransformSinHaar) {
2170 j = (Int_t) TMath::Power(2, fDegree) / 2;
2171 m = (Int_t) TMath::Power(2, fDegree);
2173 for (i = 0; i < fSize; i++) {
2176 a = pi * (Double_t) (i % j) / (Double_t) (2 * j);
2178 working_space[2 * fSize + k + j + i % j] =
2179 working_space[j + k / 2 - i % j - 1] * TMath::Sqrt(2.0);
2180 working_space[4 * fSize + 2 * fSize + k + j + i % j] = 0;
2186 working_space[4 * fSize + 2 * fSize + k + j + i % j] =
2187 -(Double_t) working_space[j + k / 2 - i % j - 1] * b;
2188 working_space[2 * fSize + k + j + i % j] =
2189 (Double_t) working_space[j + k / 2 - i % j - 1] * a;
2190 } }
for (i = 0; i < fSize; i++) {
2194 working_space[2 * fSize + k] = 0;
2195 working_space[4 * fSize + 2 * fSize + k] = 0;
2199 working_space[2 * fSize + k + i % j] =
2200 working_space[2 * fSize + k + 2 * j - i % j];
2201 working_space[4 * fSize + 2 * fSize + k + i % j] =
2202 -working_space[4 * fSize + 2 * fSize + k + 2 * j - i % j];
2205 for (i = 0; i < 2 * fSize; i++) {
2206 working_space[i] = working_space[2 * fSize + i];
2207 working_space[4 * fSize + i] =
2208 working_space[4 * fSize + 2 * fSize + i];
2210 GeneralInv(working_space, 2 * fSize, fDegree, fTransformType);
2211 for (i = 0; i < l; i++)
2212 BitReverseHaar(working_space, 2 * fSize, m, i * m);
2214 for (i = 0; i < fSize; i++) {
2215 if (fTransformType >= kTransformCosWalsh) {
2218 val = working_space[k + i % j];
2222 val = working_space[i];
2223 destVector[i] = val;
2227 delete[]working_space;
2236 void TSpectrumTransform::SetTransformType(Int_t transType, Int_t degree)
2241 for (; n < fSize;) {
2245 if (transType < kTransformHaar || transType > kTransformSinHaar){
2246 Error (
"TSpectrumTransform",
"Invalid type of transform");
2249 if (transType >= kTransformFourierWalsh && transType <= kTransformSinHaar) {
2250 if (degree > j || degree < 1){
2251 Error (
"TSpectrumTransform",
"Invalid degree of mixed transform");
2255 fTransformType=transType;
2263 void TSpectrumTransform::SetRegion(Int_t xmin, Int_t xmax)
2265 if(xmin<0 || xmax < xmin || xmax >= fSize){
2266 Error(
"TSpectrumTransform",
"Wrong range");
2277 void TSpectrumTransform::SetDirection(Int_t direction)
2279 if(direction != kTransformForward && direction != kTransformInverse){
2280 Error(
"TSpectrumTransform",
"Wrong direction");
2283 fDirection = direction;
2290 void TSpectrumTransform::SetFilterCoeff(Double_t filterCoeff)
2292 fFilterCoeff = filterCoeff;
2299 void TSpectrumTransform::SetEnhanceCoeff(Double_t enhanceCoeff)
2301 fEnhanceCoeff = enhanceCoeff;