Mercurial > hg > peckfft
comparison peck_fft.c @ 1:cfec79393811
cleanup
author | Peter Meerwald <p.meerwald@bct-electronic.com> |
---|---|
date | Fri, 16 Sep 2011 12:57:27 +0200 |
parents | 723f588b82ac |
children | 2d6c49fcafcb |
comparison
equal
deleted
inserted
replaced
0:723f588b82ac | 1:cfec79393811 |
---|---|
13 */ | 13 */ |
14 | 14 |
15 | 15 |
16 #include "_peck_fft_guts.h" | 16 #include "_peck_fft_guts.h" |
17 /* The guts header contains all the multiplication and addition macros that are defined for | 17 /* The guts header contains all the multiplication and addition macros that are defined for |
18 fixed or floating point complex numbers. It also delares the kf_ internal functions. | 18 * fixed or floating point complex numbers. It also delares the kf_ internal functions. |
19 */ | 19 */ |
20 | 20 |
21 static void kf_bfly2( | 21 static void kf_bfly2( |
22 peck_fft_cpx * Fout, | 22 peck_fft_cpx * Fout, |
23 const size_t fstride, | 23 const size_t fstride, |
24 const peck_fft_cfg st, | 24 const peck_fft_cfg st, |
25 int m | 25 int m) { |
26 ) | |
27 { | |
28 | 26 |
29 //printf("kf_bfly2\n"); | 27 //printf("kf_bfly2\n"); |
30 | 28 |
31 peck_fft_cpx * Fout2; | 29 peck_fft_cpx * Fout2; |
32 peck_fft_cpx * tw1 = st->twiddles; | 30 peck_fft_cpx * tw1 = st->twiddles; |
33 peck_fft_cpx t; | 31 peck_fft_cpx t; |
34 Fout2 = Fout + m; | 32 Fout2 = Fout + m; |
35 do{ | 33 do { |
36 C_FIXDIV(*Fout,2); C_FIXDIV(*Fout2,2); | 34 C_FIXDIV(*Fout, 2); |
37 | 35 C_FIXDIV(*Fout2, 2); |
38 C_MUL (t, *Fout2 , *tw1); | 36 |
37 C_MUL(t, *Fout2, *tw1); | |
39 tw1 += fstride; | 38 tw1 += fstride; |
40 C_SUB( *Fout2 , *Fout , t ); | 39 C_SUB(*Fout2, *Fout, t); |
41 C_ADDTO( *Fout , t ); | 40 C_ADDTO(*Fout, t); |
42 ++Fout2; | 41 ++Fout2; |
43 ++Fout; | 42 ++Fout; |
44 }while (--m); | 43 } while (--m); |
45 } | 44 } |
46 | 45 |
47 static void kf_bfly4( | 46 static void kf_bfly4( |
48 peck_fft_cpx * Fout, | 47 peck_fft_cpx * Fout, |
49 const size_t fstride, | 48 const size_t fstride, |
50 const peck_fft_cfg st, | 49 const peck_fft_cfg st, |
51 const size_t m | 50 const size_t m) { |
52 ) | |
53 { | |
54 peck_fft_cpx *tw1,*tw2,*tw3; | 51 peck_fft_cpx *tw1,*tw2,*tw3; |
55 peck_fft_cpx scratch[6]; | 52 peck_fft_cpx scratch[6]; |
56 size_t k=m; | 53 size_t k=m; |
57 const size_t m2=2*m; | 54 const size_t m2=2*m; |
58 const size_t m3=3*m; | 55 const size_t m3=3*m; |
59 | 56 |
60 //printf("kf_bfly4\n"); | 57 //printf("kf_bfly4\n"); |
61 | 58 |
62 | |
63 tw3 = tw2 = tw1 = st->twiddles; | 59 tw3 = tw2 = tw1 = st->twiddles; |
64 | 60 |
65 do { | 61 do { |
66 C_FIXDIV(*Fout,4); C_FIXDIV(Fout[m],4); C_FIXDIV(Fout[m2],4); C_FIXDIV(Fout[m3],4); | 62 C_FIXDIV(*Fout, 4); |
67 | 63 C_FIXDIV(Fout[m], 4); |
68 C_MUL(scratch[0],Fout[m] , *tw1 ); | 64 C_FIXDIV(Fout[m2], 4); |
69 C_MUL(scratch[1],Fout[m2] , *tw2 ); | 65 C_FIXDIV(Fout[m3], 4); |
70 C_MUL(scratch[2],Fout[m3] , *tw3 ); | 66 |
71 | 67 C_MUL(scratch[0], Fout[m], *tw1); |
72 C_SUB( scratch[5] , *Fout, scratch[1] ); | 68 C_MUL(scratch[1], Fout[m2], *tw2); |
69 C_MUL(scratch[2], Fout[m3], *tw3); | |
70 | |
71 C_SUB(scratch[5], *Fout, scratch[1]); | |
73 C_ADDTO(*Fout, scratch[1]); | 72 C_ADDTO(*Fout, scratch[1]); |
74 C_ADD( scratch[3] , scratch[0] , scratch[2] ); | 73 C_ADD(scratch[3], scratch[0], scratch[2]); |
75 C_SUB( scratch[4] , scratch[0] , scratch[2] ); | 74 C_SUB(scratch[4], scratch[0], scratch[2]); |
76 C_SUB( Fout[m2], *Fout, scratch[3] ); | 75 C_SUB(Fout[m2], *Fout, scratch[3]); |
77 tw1 += fstride; | 76 tw1 += fstride; |
78 tw2 += fstride*2; | 77 tw2 += fstride*2; |
79 tw3 += fstride*3; | 78 tw3 += fstride*3; |
80 C_ADDTO( *Fout , scratch[3] ); | 79 C_ADDTO(*Fout, scratch[3]); |
81 | 80 |
82 if(st->inverse) { | 81 if (st->inverse) { |
83 Fout[m].r = scratch[5].r - scratch[4].i; | 82 Fout[m].r = scratch[5].r - scratch[4].i; |
84 Fout[m].i = scratch[5].i + scratch[4].r; | 83 Fout[m].i = scratch[5].i + scratch[4].r; |
85 Fout[m3].r = scratch[5].r + scratch[4].i; | 84 Fout[m3].r = scratch[5].r + scratch[4].i; |
86 Fout[m3].i = scratch[5].i - scratch[4].r; | 85 Fout[m3].i = scratch[5].i - scratch[4].r; |
87 }else{ | 86 } else { |
88 Fout[m].r = scratch[5].r + scratch[4].i; | 87 Fout[m].r = scratch[5].r + scratch[4].i; |
89 Fout[m].i = scratch[5].i - scratch[4].r; | 88 Fout[m].i = scratch[5].i - scratch[4].r; |
90 Fout[m3].r = scratch[5].r - scratch[4].i; | 89 Fout[m3].r = scratch[5].r - scratch[4].i; |
91 Fout[m3].i = scratch[5].i + scratch[4].r; | 90 Fout[m3].i = scratch[5].i + scratch[4].r; |
92 } | 91 } |
93 ++Fout; | 92 ++Fout; |
94 }while(--k); | 93 } while (--k); |
95 } | 94 } |
96 | 95 |
97 static void kf_bfly3( | 96 static void kf_bfly3( |
98 peck_fft_cpx * Fout, | 97 peck_fft_cpx * Fout, |
99 const size_t fstride, | 98 const size_t fstride, |
100 const peck_fft_cfg st, | 99 const peck_fft_cfg st, |
101 size_t m | 100 size_t m) { |
102 ) | |
103 { | |
104 size_t k=m; | 101 size_t k=m; |
105 const size_t m2 = 2*m; | 102 const size_t m2 = 2*m; |
106 peck_fft_cpx *tw1,*tw2; | 103 peck_fft_cpx *tw1, *tw2; |
107 peck_fft_cpx scratch[5]; | 104 peck_fft_cpx scratch[5]; |
108 peck_fft_cpx epi3; | 105 peck_fft_cpx epi3; |
109 epi3 = st->twiddles[fstride*m]; | 106 epi3 = st->twiddles[fstride*m]; |
110 | 107 |
111 printf("kf_bfly3\n"); | 108 printf("kf_bfly3\n"); |
112 | 109 |
113 | 110 |
114 tw1=tw2=st->twiddles; | 111 tw1=tw2=st->twiddles; |
115 | 112 |
116 do{ | 113 do { |
117 C_FIXDIV(*Fout,3); C_FIXDIV(Fout[m],3); C_FIXDIV(Fout[m2],3); | 114 C_FIXDIV(*Fout,3); C_FIXDIV(Fout[m],3); C_FIXDIV(Fout[m2],3); |
118 | 115 |
119 C_MUL(scratch[1],Fout[m] , *tw1); | 116 C_MUL(scratch[1],Fout[m] , *tw1); |
120 C_MUL(scratch[2],Fout[m2] , *tw2); | 117 C_MUL(scratch[2],Fout[m2] , *tw2); |
121 | 118 |
136 | 133 |
137 Fout[m].r -= scratch[0].i; | 134 Fout[m].r -= scratch[0].i; |
138 Fout[m].i += scratch[0].r; | 135 Fout[m].i += scratch[0].r; |
139 | 136 |
140 ++Fout; | 137 ++Fout; |
141 }while(--k); | 138 } while (--k); |
142 } | 139 } |
143 | 140 |
144 static void kf_bfly5( | 141 static void kf_bfly5( |
145 peck_fft_cpx * Fout, | 142 peck_fft_cpx * Fout, |
146 const size_t fstride, | 143 const size_t fstride, |