1 /* Test real_fft routines */
3 closeto(e,tol):=block([numer:true,abse],abse:abs(e),if(abse<=tol) then true else abse);
4 closeto(e,tol):=block([numer:true,abse],abse:abs(e),if(abse<=tol) then true else abse);
6 (compare_real_fft(tol, x) :=
7 block([rft: real_fft(x),
11 maxdiff: lreduce('max, abs(rft - ft)),
12 closeto(maxdiff, tol)),
16 (compare_inverse_real_fft(tol, x) :=
17 block([rft: inverse_real_fft(real_fft(x)),
19 maxdiff: lreduce('max, abs(x - rft)),
20 closeto(maxdiff, tol)),
25 /* verify that real_fft does not modify its argument */
27 (foo0 : [1, 2, 4, 8], 0);
30 (kill (foo), foo : foo0, real_fft (foo), foo);
33 (foo : make_array (any, 4), fillarray (foo, foo0), real_fft (foo), listarray (foo));
36 (kill (foo), array (foo, 3), fillarray (foo, foo0), real_fft (foo), listarray (foo));
39 /* Verify basic computation */
50 errcatch(real_fft([1,2,3]));
53 compare_real_fft(0, makelist(k, k, 1, 4));
56 compare_real_fft(1.2413e-16, makelist(k, k, 1, 16));
59 compare_real_fft(9.8712e-14, makelist(k, k, 1, 1024));
62 compare_real_fft(3.8703e-13, makelist(k, k, 1, 4096));
68 inverse_real_fft([123]);
71 inverse_real_fft([1.5 ,-0.5]);
74 compare_inverse_real_fft(0, makelist(k, k, 1, 4));
77 compare_inverse_real_fft(1.7764e-15, makelist(k, k, 1, 16));
80 compare_inverse_real_fft(3.9791e-13, makelist(k, k, 1, 1024));
83 compare_inverse_real_fft(2.2738e-12, makelist(k, k, 1, 4096));
86 /* verify that bf_real_fft does not modify its argument */
88 (foo0 : [1, 2, 4, 8], 0);
91 (kill (foo), foo : foo0, bf_real_fft (foo), foo);
94 (foo : make_array (any, 4), fillarray (foo, foo0), bf_real_fft (foo), listarray (foo));
97 (kill (foo), array (foo, 3), fillarray (foo, foo0), bf_real_fft (foo), listarray (foo));
100 /* Verify basic computation */
111 errcatch(bf_real_fft([1,2,3]));
114 (compare_bf_real_fft(tol, x) :=
115 block([rft: bf_real_fft(x),
119 maxdiff: lreduce('max, abs(rft - ft)),
120 closeto(maxdiff, tol)),
124 (compare_bf_inverse_real_fft(tol, x) :=
125 block([rft: bf_inverse_real_fft(bf_real_fft(x)),
127 maxdiff: lreduce('max, abs(x - rft)),
128 closeto(maxdiff, tol)),
132 compare_bf_real_fft(0, makelist(k, k, 1, 4));
135 compare_bf_real_fft(2.7756b-17, makelist(k, k, 1, 16));
138 compare_bf_real_fft(5.7034b-15, makelist(k, k, 1, 1024));
141 compare_bf_real_fft(2.4145b-14, makelist(k, k, 1, 4096));
144 bf_inverse_real_fft([]);
147 bf_inverse_real_fft([1.5 ,-0.5]);
150 compare_bf_inverse_real_fft(0, makelist(k, k, 1, 4));
153 compare_bf_inverse_real_fft(3.3088b-24, makelist(k, k, 1, 16));
156 compare_bf_inverse_real_fft(8.4704b-22, makelist(k, k, 1, 1024));
159 compare_bf_inverse_real_fft(5.0822b-21, makelist(k, k, 1, 4096));
162 (errcatch(real_fft([1,2,3])), error);
163 ["real_fft: size of input must be a power of 2, not ~M",3];
165 (errcatch(inverse_real_fft([1,2,3,4])), error);
166 ["inverse_real_fft: input length must be one more than a power of two, not ~M",4];
168 (errcatch(bf_real_fft([1,2,3])), error);
169 ["bf_fft: size of input must be a power of 2, not ~M",3];
171 (errcatch(bf_inverse_real_fft([1,2,3,4])), error);
172 ["bf_inverse_real_fft: input length must be one more than a power of two, not ~M",4];