5
fftreal in 'fftreal.pas',
17
buffer_size : longint;
19
time0, time1, time2 : int64;
24
tempp1, tempp2 : pflt_array;
27
(*______________________________________________
30
*______________________________________________
33
WriteLn('Accuracy test:');
36
nbr_points := 16; // Power of 2
37
GetMem(x, nbr_points * sizeof_flt);
38
GetMem(f, nbr_points * sizeof_flt);
39
fft := TFFTReal.Create(nbr_points); // FFT object initialized here
43
for i := 0 to nbr_points-1 do
45
x^[i] := -1 + sin (3*2*PI*i/nbr_points)
46
+ cos (5*2*PI*i/nbr_points) * 2
47
- sin (7*2*PI*i/nbr_points) * 3
48
+ cos (8*2*PI*i/nbr_points) * 5;
51
// Compute FFT and IFFT
58
for i := 0 to nbr_points div 2 do
61
if (i > 0) and (i < nbr_points div 2) then
62
img := f^[i + nbr_points div 2]
66
f_abs := Sqrt(areal * areal + img * img);
67
WriteLn(Format('%5d: %12.6f %12.6f (%12.6f)', [i, areal, img, f_abs]));
72
for i := 0 to nbr_points-1 do
73
WriteLn(Format('%5d: %f', [i, x^[i]]));
82
(*______________________________________________
85
*______________________________________________
88
WriteLn('Speed test:');
89
WriteLn('Please wait...');
92
nbr_points := 1024; // Power of 2
93
buffer_size := 256*nbr_points; // Number of flt_t (float or double)
96
assert(nbr_points <= buffer_size);
97
GetMem(x, buffer_size * sizeof_flt);
98
GetMem(f, buffer_size * sizeof_flt);
99
fft := TFFTReal.Create(nbr_points); // FFT object initialized here
101
// Test signal: noise
102
for i := 0 to nbr_points-1 do
103
x^[i] := Random($7fff) - ($7fff shr 1);
106
QueryPerformanceFrequency(timereso);
107
QueryPerformanceCounter(time0);
109
for i := 0 to nbr_tests-1 do
111
offset := (i * nbr_points) and (buffer_size - 1);
116
fft.do_fft(tempp1, tempp2);
119
QueryPerformanceCounter(time1);
121
for i := 0 to nbr_tests-1 do
123
offset := (i * nbr_points) and (buffer_size - 1);
128
fft.do_ifft(tempp1, tempp2);
132
QueryPerformanceCounter(time2);
134
t0 := ((time1-time0) / timereso) / nbr_tests;
135
t1 := ((time2-time1) / timereso) / nbr_tests;
137
WriteLn(Format('%d-points FFT : %.0f us.', [nbr_points, t0 * 1000000]));
138
WriteLn(Format('%d-points IFFT + scaling: %.0f us.', [nbr_points, t1 * 1000000]));
140
nbr_s_chn := Floor(nbr_points / ((t0 + t1) * 44100 * 2));
141
WriteLn(Format('Peak performance: FFT+IFFT on %d mono channels at 44.1 KHz (with overlapping)', [nbr_s_chn]));
148
WriteLn('Press [Return] key to terminate...');