-- fft_time.adb with Fft16; with Ifft16; with Fft32; with Ifft32; with Fft64; with Ifft64; with Fft128; with Ifft128; with Fft256; with Ifft256; with Fft512; with Ifft512; with Fft1024; with Ifft1024; with Fft2048; with Ifft2048; with Fft4096; with Ifft4096; with Ada.Text_IO; use Ada.Text_IO; with Ada.Calendar; use Ada.Calendar; with Complex_Types; use Complex_Types; with Complex_Arrays; use Complex_Arrays; procedure Fft_Time is pragma Suppress(All_Checks); A : Complex_Vector(0..4095); B : Complex_Vector(0..4095); A1 : Complex_Vector(0..4095); T1 : Duration; T2 : Duration; N : Integer; M : Integer; Q : Float; begin Put_Line("fft_time.adb running"); N := 16; M := 100000; Q := 0.00001; for I in 0..N-1 loop A(I) := (Float(I)/Float(N), -Float(I)/Float(N)); B(I) := A(I); end loop; A(1) := (-0.25, 0.75); B(1) := A(1); A(3) := (0.875, 0.375); B(3) := A(3); Fft16(A); Ifft16(A); for I in 0..N-1 loop if abs(A(I)-B(I)) > Q then Put_Line("BAD " & Integer'Image(I) & " (" & Float'Image(A(I).Re) & ", " & Float'Image(A(I).Im) & ") (" & Float'Image(B(I).Re) & ", " & Float'Image(B(I).Im) & ")" ); end if; end loop; T1 := Seconds(Clock); for J in 1..M loop A := B; Fft16(A); end loop; T2 := Seconds(Clock); T2 := (T2-T1)/Duration(M); Put_Line("N=" & Integer'Image(N) & " FFT " & Duration'Image(T2)); A1 := A; T1 := Seconds(Clock); for J in 1..M loop A := A1; Ifft16(A); end loop; T2 := Seconds(Clock); T2 := (T2-T1)/Duration(M); Put_Line(" inverse " & Duration'Image(T2)); T1 := Seconds(Clock); for J in 1..M loop A := B; Fft16(A); Ifft16(A); end loop; T2 := Seconds(Clock); T2 := (T2-T1)/Duration(M); Put_Line(" Both " & Duration'Image(T2)); New_Line; N := 32; M := 20000; Q := 0.00001; for I in 0..N-1 loop A(I) := (Float(I)/Float(N), -Float(I)/Float(N)); B(I) := A(I); end loop; A(1) := (-0.25, 0.75); B(1) := A(1); A(3) := (0.875, 0.375); B(3) := A(3); Fft32(A); Ifft32(A); for I in 0..N-1 loop if abs(A(I)-B(I)) > Q then Put_Line("BAD " & Integer'Image(I) & " (" & Float'Image(A(I).Re) & ", " & Float'Image(A(I).Im) & ") (" & Float'Image(B(I).Re) & ", " & Float'Image(B(I).Im) & ")" ); end if; end loop; T1 := Seconds(Clock); for J in 1..M loop A := B; Fft32(A); end loop; T2 := Seconds(Clock); T2 := (T2-T1)/Duration(M); Put_Line("N=" & Integer'Image(N) & " FFT " & Duration'Image(T2)); A1 := A; T1 := Seconds(Clock); for J in 1..M loop A := A1; Ifft32(A); end loop; T2 := Seconds(Clock); T2 := (T2-T1)/Duration(M); Put_Line(" inverse " & Duration'Image(T2)); T1 := Seconds(Clock); for J in 1..M loop A := B; Fft32(A); Ifft32(A); end loop; T2 := Seconds(Clock); T2 := (T2-T1)/Duration(M); Put_Line(" Both " & Duration'Image(T2)); New_Line; N := 64; M := 10000; Q := 0.0001; for I in 0..N-1 loop A(I) := (Float(I)/Float(N), -Float(I)/Float(N)); B(I) := A(I); end loop; A(1) := (-0.25, 0.75); B(1) := A(1); A(3) := (0.875, 0.375); B(3) := A(3); Fft64(A); Ifft64(A); for I in 0..N-1 loop if abs(A(I)-B(I)) > Q then Put_Line("BAD " & Integer'Image(I) & " (" & Float'Image(A(I).Re) & ", " & Float'Image(A(I).Im) & ") (" & Float'Image(B(I).Re) & ", " & Float'Image(B(I).Im) & ")" ); end if; end loop; T1 := Seconds(Clock); for J in 1..M loop A := B; Fft64(A); end loop; T2 := Seconds(Clock); T2 := (T2-T1)/Duration(M); Put_Line("N=" & Integer'Image(N) & " FFT " & Duration'Image(T2)); A1 := A; T1 := Seconds(Clock); for J in 1..M loop A := A1; Ifft64(A); end loop; T2 := Seconds(Clock); T2 := (T2-T1)/Duration(M); Put_Line(" inverse " & Duration'Image(T2)); T1 := Seconds(Clock); for J in 1..M loop A := B; Fft64(A); Ifft64(A); end loop; T2 := Seconds(Clock); T2 := (T2-T1)/Duration(M); Put_Line(" Both " & Duration'Image(T2)); New_Line; N := 128; M := 5000; Q := 0.0001; for I in 0..N-1 loop A(I) := (Float(I)/Float(N), -Float(I)/Float(N)); B(I) := A(I); end loop; A(1) := (-0.25, 0.75); B(1) := A(1); A(3) := (0.875, 0.375); B(3) := A(3); Fft128(A); Ifft128(A); for I in 0..N-1 loop if abs(A(I)-B(I)) > Q then Put_Line("BAD " & Integer'Image(I) & " (" & Float'Image(A(I).Re) & ", " & Float'Image(A(I).Im) & ") (" & Float'Image(B(I).Re) & ", " & Float'Image(B(I).Im) & ")" ); end if; end loop; T1 := Seconds(Clock); for J in 1..M loop A := B; Fft128(A); end loop; T2 := Seconds(Clock); T2 := (T2-T1)/Duration(M); Put_Line("N=" & Integer'Image(N) & " FFT " & Duration'Image(T2)); A1 := A; T1 := Seconds(Clock); for J in 1..M loop A := A1; Ifft128(A); end loop; T2 := Seconds(Clock); T2 := (T2-T1)/Duration(M); Put_Line(" inverse " & Duration'Image(T2)); T1 := Seconds(Clock); for J in 1..M loop A := B; Fft128(A); Ifft128(A); end loop; T2 := Seconds(Clock); T2 := (T2-T1)/Duration(M); Put_Line(" Both " & Duration'Image(T2)); New_Line; N := 256; M := 2000; Q := 0.0001; for I in 0..N-1 loop A(I) := (Float(I)/Float(N), -Float(I)/Float(N)); B(I) := A(I); end loop; A(1) := (-0.25, 0.75); B(1) := A(1); A(3) := (0.875, 0.375); B(3) := A(3); Fft256(A); Ifft256(A); for I in 0..N-1 loop if abs(A(I)-B(I)) > Q then Put_Line("BAD " & Integer'Image(I) & " (" & Float'Image(A(I).Re) & ", " & Float'Image(A(I).Im) & ") (" & Float'Image(B(I).Re) & ", " & Float'Image(B(I).Im) & ")" ); end if; end loop; T1 := Seconds(Clock); for J in 1..M loop A := B; Fft256(A); end loop; T2 := Seconds(Clock); T2 := (T2-T1)/Duration(M); Put_Line("N=" & Integer'Image(N) & " FFT " & Duration'Image(T2)); A1 := A; T1 := Seconds(Clock); for J in 1..M loop A := A1; Ifft256(A); end loop; T2 := Seconds(Clock); T2 := (T2-T1)/Duration(M); Put_Line(" inverse " & Duration'Image(T2)); T1 := Seconds(Clock); for J in 1..M loop A := B; Fft256(A); Ifft256(A); end loop; T2 := Seconds(Clock); T2 := (T2-T1)/Duration(M); Put_Line(" Both " & Duration'Image(T2)); new_line; N := 512; M := 1000; Q := 0.0002; for I in 0..N-1 loop A(I) := (Float(I)/Float(N), -Float(I)/Float(N)); B(I) := A(I); end loop; A(1) := (-0.25, 0.75); B(1) := A(1); A(3) := (0.875, 0.375); B(3) := A(3); Fft512(A); Ifft512(A); for I in 0..N-1 loop if abs(A(I)-B(I)) > Q then Put_Line("BAD " & Integer'Image(I) & " (" & Float'Image(A(I).Re) & ", " & Float'Image(A(I).Im) & ") (" & Float'Image(B(I).Re) & ", " & Float'Image(B(I).Im) & ")" ); end if; end loop; T1 := Seconds(Clock); for J in 1..M loop A := B; Fft512(A); end loop; T2 := Seconds(Clock); T2 := (T2-T1)/Duration(M); Put_Line("N=" & Integer'Image(N) & " FFT " & Duration'Image(T2)); A1 := A; T1 := Seconds(Clock); for J in 1..M loop A := A1; Ifft512(A); end loop; T2 := Seconds(Clock); T2 := (T2-T1)/Duration(M); Put_Line(" inverse " & Duration'Image(T2)); T1 := Seconds(Clock); for J in 1..M loop A := B; Fft512(A); Ifft512(A); end loop; T2 := Seconds(Clock); T2 := (T2-T1)/Duration(M); Put_Line(" Both " & Duration'Image(T2)); New_Line; N := 1024; M := 1000; Q := 0.0001; for I in 0..N-1 loop A(I) := (Float(I)/Float(N), -Float(I)/Float(N)); B(I) := A(I); end loop; A(1) := (-0.25, 0.75); B(1) := A(1); A(3) := (0.875, 0.375); B(3) := A(3); Fft1024(A); Ifft1024(A); for I in 0..N-1 loop if abs(A(I)-B(I)) > Q then Put_Line("BAD " & Integer'Image(I) & " (" & Float'Image(A(I).Re) & ", " & Float'Image(A(I).Im) & ") (" & Float'Image(B(I).Re) & ", " & Float'Image(B(I).Im) & ")" ); end if; end loop; T1 := Seconds(Clock); for J in 1..M loop A := B; Fft1024(A); end loop; T2 := Seconds(Clock); T2 := (T2-T1)/Duration(M); Put_Line("N=" & Integer'Image(N) & " FFT " & Duration'Image(T2)); A1 := A; T1 := Seconds(Clock); for J in 1..M loop A := A1; Ifft1024(A); end loop; T2 := Seconds(Clock); T2 := (T2-T1)/Duration(M); Put_Line(" inverse " & Duration'Image(T2)); T1 := Seconds(Clock); for J in 1..M loop A := B; Fft1024(A); Ifft1024(A); end loop; T2 := Seconds(Clock); T2 := (T2-T1)/Duration(M); Put_Line(" Both " & Duration'Image(T2)); New_Line; N := 2048; M := 500; Q := 0.0005; for I in 0..N-1 loop A(I) := (Float(I)/Float(N), -Float(I)/Float(N)); B(I) := A(I); end loop; A(1) := (-0.25, 0.75); B(1) := A(1); A(3) := (0.875, 0.375); B(3) := A(3); Fft2048(A); Ifft2048(A); for I in 0..N-1 loop if abs(A(I)-B(I)) > Q then Put_Line("BAD " & Integer'Image(I) & " (" & Float'Image(A(I).Re) & ", " & Float'Image(A(I).Im) & ") (" & Float'Image(B(I).Re) & ", " & Float'Image(B(I).Im) & ")" ); end if; end loop; T1 := Seconds(Clock); for J in 1..M loop A := B; Fft2048(A); end loop; T2 := Seconds(Clock); T2 := (T2-T1)/Duration(M); Put_Line("N=" & Integer'Image(N) & " FFT " & Duration'Image(T2)); A1 := A; T1 := Seconds(Clock); for J in 1..M loop A := A1; Ifft2048(A); end loop; T2 := Seconds(Clock); T2 := (T2-T1)/Duration(M); Put_Line(" inverse " & Duration'Image(T2)); T1 := Seconds(Clock); for J in 1..M loop A := B; Fft2048(A); Ifft2048(A); end loop; T2 := Seconds(Clock); T2 := (T2-T1)/Duration(M); Put_Line(" Both " & Duration'Image(T2)); New_Line; N := 4096; M := 500; Q := 0.001; for I in 0..N-1 loop A(I) := (Float(I)/Float(N), -Float(I)/Float(N)); B(I) := A(I); end loop; A(1) := (-0.25, 0.75); B(1) := A(1); A(3) := (0.875, 0.375); B(3) := A(3); Fft4096(A); Ifft4096(A); for I in 0..N-1 loop if abs(A(I)-B(I)) > Q then Put_Line("BAD " & Integer'Image(I) & " (" & Float'Image(A(I).Re) & ", " & Float'Image(A(I).Im) & ") (" & Float'Image(B(I).Re) & ", " & Float'Image(B(I).Im) & ")" ); end if; end loop; T1 := Seconds(Clock); for J in 1..M loop A := B; Fft4096(A); end loop; T2 := Seconds(Clock); T2 := (T2-T1)/Duration(M); Put_Line("N=" & Integer'Image(N) & " FFT " & Duration'Image(T2)); A1 := A; T1 := Seconds(Clock); for J in 1..M loop A := A1; Ifft4096(A); end loop; T2 := Seconds(Clock); T2 := (T2-T1)/Duration(M); Put_Line(" inverse " & Duration'Image(T2)); T1 := Seconds(Clock); for J in 1..M loop A := B; Fft4096(A); Ifft4096(A); end loop; T2 := Seconds(Clock); T2 := (T2-T1)/Duration(M); Put_Line(" Both " & Duration'Image(T2)); New_Line; Put_Line("end fft_time"); end Fft_Time;