Einzelnen Beitrag anzeigen

TomyN

Registriert seit: 8. Nov 2006
Ort: Bayreuth
252 Beiträge
 
Delphi 10.3 Rio
 
#1

Problem mit Geschwindigkeit

  Alt 30. Nov 2020, 10:14
Hallo,

Ich habe hier eine seltsames Phänomen, das ich nicht einsortieren kann.
Ich nutze Delphi 10.3
In meiner Software brauche ich oft eine FFT und da gerade etwas Zeit ist, habe ich mich seit Jahren wieder mal damit beschäftigt und ein kleines Testprogramm für die FFT Unit geschrieben. Das läuft soweit alles recht schön.
Aber: Da ich oft zwei FFTs mit der gleichen Auflösung gleichzeitig brauche, hab ich mir gedacht, ich erweitere die Procedure so, dass ich die Berechnung der Indexe sowie der Sin und Cos werter nur einmal mache und damit Zeit spare. Soweit so gut, nur dauert die neue Procedure deutlich länger als wenn ich zweimal die 'normale' FFT mache.

Ich habe nur den Code aus der 'Single FFT' kopiert und führe dann die Berechnungen anstelle mit einem Array mit zwei Arrays aus. Hier mal der Ausschnitt, auf den sich der 'Geschwindigkeitsverlust' reduzieren lässt.

Code:
a:= e;
       For j:=2 to n8 do begin
          Math.SinCos(a, ss1, cc1);
          Math.SinCos(3.0 * a, ss3, cc3);
           a:= j * e;
           i:= 0;
           id:= n2 shl 1;
           while i< Anzahl do begin
              While i < Anzahl do begin
                  i1:= i+j-1;
                  i2:= i1+n4;
                  i3:= i2+n4;
                  i4:= i3+n4;
                  i5:= i+n4-j+1;
                  i6:= i5+n4;
                  i7:= i6+n4;
                  i8:= i7+n4;
//Alter Teil
                  t1:= datenA[i3]*cc1+datenA[i7]*ss1;
                  t2:= datenA[i7]*cc1-datenA[i3]*ss1;
                  t3:= datenA[i4]*cc3+datenA[i8]*ss3;
                  t4:= datenA[i8]*cc3-datenA[i4]*ss3;
                  t5:= t1+t3;
                  t6:= t2+t4;
                  t3:= t1-t3;
                  t4:= t2-t4;
                  t2:= datenA[i6]+t6;
                  datenA[i3]:= t6-datenA[i6];
                  datenA[i8]:= t2;
                  t2:= datenA[i2]-t3;
                  datenA[i7]:= - datenA[i2]-T3;
                  datenA[i4]:= T2;
                  t1:= datenA[i1]+T5;
                  datenA[i6]:= datenA[i1]-t5;
                  datenA[i1]:= T1;
                  t1:= datenA[i5]+t4;
                  datenA[i5]:= datenA[i5]-t4;
                  datenA[i2]:= t1;
//Neuer Teil
                  t1:= datenB[i3] * cc1 + datenB[i7] * ss1;
                  t2:= datenB[i7] * cc1 - datenB[i3] * ss1;
                  t3:= datenB[i4] * cc3 + datenB[i8] * ss3;
                  t4:= datenB[i8] * cc3 - datenB[i4] * ss3;
                  t5:= t1+t3;
                  t6:= t2+t4;
                  t3:= t1-t3;
                  t4:= t2-t4;
                  t2:= datenB[i6]+t6;
                  datenB[i3]:= t6-datenB[i6];
                  datenB[i8]:= t2;
                  t2:= datenB[i2]-t3;
                  datenB[i7]:= - datenB[i2]-T3;
                  datenB[i4]:= T2;
                  t1:= datenB[i1]+T5;
                  datenB[i6]:= datenB[i1]-t5;
                  datenB[i1]:= T1;
                  t1:= datenB[i5]+t4;
                  datenB[i5]:= datenB[i5]-t4;
                  datenB[i2]:= t1;
//Ende Einschub
                  Inc(i, id);
              end;
              id:= id shl 1;
              i:= id-n2;
              id:= id shl 1;
           end;
       end;
       k:= k Shr 1;
Ich habe schon verschiedene FFT Größen und auch 32Bit oder 64Bit Kompilierung probiert, die 'Duale' Version ist immer um ca. 25% langsamer als zweimal die 'Single' Version. Und das kann ich mir einfach nicht erklären. Irgendwelche Ideen?
Thomas Neumann
Meine Projekte
www.satlive.audio
www.levelcheck.de
  Mit Zitat antworten Zitat