File: timer2.c

package info (click to toggle)
fftw3 3.1.2-1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 14,016 kB
  • ctags: 10,195
  • sloc: ansic: 154,845; asm: 33,960; ml: 12,962; sh: 8,943; perl: 1,392; makefile: 878; fortran: 108
file content (125 lines) | stat: -rw-r--r-- 3,106 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*
 * Copyright (c) 2001 Matteo Frigo
 * Copyright (c) 2001 Massachusetts Institute of Technology
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */

#include "bench.h"

/* FFT routine used for calibratin the timer */

#define WS(a, b) a * b

void bench_fft8(const float *ri, const float *ii, float *ro, float *io,
		int is, int os)
{
     const float KP707106781 = 0.707106781186547524400844362104849039284835938;
     float T3, Tn, Ti, TC, T6, TB, Tl, To, Td, TN, Tz, TH, Ta, TM, Tu;
     float TG;
     {
	  float T1, T2, Tj, Tk;
	  T1 = ri[0];
	  T2 = ri[WS(is, 4)];
	  T3 = T1 + T2;
	  Tn = T1 - T2;
	  {
	       float Tg, Th, T4, T5;
	       Tg = ii[0];
	       Th = ii[WS(is, 4)];
	       Ti = Tg + Th;
	       TC = Tg - Th;
	       T4 = ri[WS(is, 2)];
	       T5 = ri[WS(is, 6)];
	       T6 = T4 + T5;
	       TB = T4 - T5;
	  }
	  Tj = ii[WS(is, 2)];
	  Tk = ii[WS(is, 6)];
	  Tl = Tj + Tk;
	  To = Tj - Tk;
	  {
	       float Tb, Tc, Tv, Tw, Tx, Ty;
	       Tb = ri[WS(is, 7)];
	       Tc = ri[WS(is, 3)];
	       Tv = Tb - Tc;
	       Tw = ii[WS(is, 7)];
	       Tx = ii[WS(is, 3)];
	       Ty = Tw - Tx;
	       Td = Tb + Tc;
	       TN = Tw + Tx;
	       Tz = Tv - Ty;
	       TH = Tv + Ty;
	  }
	  {
	       float T8, T9, Tq, Tr, Ts, Tt;
	       T8 = ri[WS(is, 1)];
	       T9 = ri[WS(is, 5)];
	       Tq = T8 - T9;
	       Tr = ii[WS(is, 1)];
	       Ts = ii[WS(is, 5)];
	       Tt = Tr - Ts;
	       Ta = T8 + T9;
	       TM = Tr + Ts;
	       Tu = Tq + Tt;
	       TG = Tt - Tq;
	  }
     }
     {
	  float T7, Te, TP, TQ;
	  T7 = T3 + T6;
	  Te = Ta + Td;
	  ro[WS(os, 4)] = T7 - Te;
	  ro[0] = T7 + Te;
	  TP = Ti + Tl;
	  TQ = TM + TN;
	  io[WS(os, 4)] = TP - TQ;
	  io[0] = TP + TQ;
     }
     {
	  float Tf, Tm, TL, TO;
	  Tf = Td - Ta;
	  Tm = Ti - Tl;
	  io[WS(os, 2)] = Tf + Tm;
	  io[WS(os, 6)] = Tm - Tf;
	  TL = T3 - T6;
	  TO = TM - TN;
	  ro[WS(os, 6)] = TL - TO;
	  ro[WS(os, 2)] = TL + TO;
     }
     {
	  float Tp, TA, TJ, TK;
	  Tp = Tn + To;
	  TA = KP707106781 * (Tu + Tz);
	  ro[WS(os, 5)] = Tp - TA;
	  ro[WS(os, 1)] = Tp + TA;
	  TJ = TC - TB;
	  TK = KP707106781 * (TG + TH);
	  io[WS(os, 5)] = TJ - TK;
	  io[WS(os, 1)] = TJ + TK;
     }
     {
	  float TD, TE, TF, TI;
	  TD = TB + TC;
	  TE = KP707106781 * (Tz - Tu);
	  io[WS(os, 7)] = TD - TE;
	  io[WS(os, 3)] = TD + TE;
	  TF = Tn - To;
	  TI = KP707106781 * (TG - TH);
	  ro[WS(os, 7)] = TF - TI;
	  ro[WS(os, 3)] = TF + TI;
     }
}