Vielen Dank für die guten Ratschläge!
Mein FFT-Problem habe ich inzwischen gelöst und ich komme ohne den rekursiven Aufruf der Procedur aus. Es wird innerhalb der Procedur so lange gerechnet, bis das Ergebnis fertig ist. Dazu war es notwendig, das Ganze noch einmal zu durchdenken. In der ELV-Dokumentation zur digitalen Signalverarbeitung habe ich dann endlich die Lösung zum zusammenbasteln gefunden.
Code: Alles auswählen
OpenConsole("Schleifenkonstruktion FFT")
EnableGraphicalConsole(1)
Global Dim z.f(1024,1)
Global Dim xIn.f(1024) ;Real-Teil
Global Dim yIn.f(1024) ;Imag-Teil
Global e.l
Procedure Beispiel1(e.l)
n.l=Pow(2,e)
PrintN("")
PrintN("Eingangssignal FFT nach DecimationInFrequency-Methode")
For i=0 To n-1
xIn(i)=Sin(3*2*i*#PI/n)+Cos(5*2*i*#PI/n)
yIn(i)=0
PrintN(Str(i)+" : "+ StrF(xIn(i),5)+ " + i* "+StrF(yIn(i),5))
Next
EndProcedure
Procedure Schleife(m.i)
Beginn= ElapsedMilliseconds()
;bei n=8 ist seq= 8/2=4. i muss nacheinander die Werte 0, 1, 2, 3 & 0, 1 + 4, 5 & schließlich 0 + 2 + 4 + 6 annehmen
; |__________| |___________| |_____________|
;das entspricht den Sequenzen: 1 2 3
;Bei seq=4 entspricht das den Faktoren 1*4=4 2*2=4 4*1=4
n=Pow(2,m)
Dim w.f(n,1)
For i=0 To n-1 ;Eingangswerte in das Array z(x,y) transferieren
z(i,0)=xIn(i) ;x(i)=xIn(i)
z(i,1)=yIn(i) ;y(i)=yIn(i)
Next
For j=0 To n-1 ;Drehfaktor
w(j,0)= Cos(j*2*#PI/n)
w(j,1)=-Sin(j*2*#PI/n)
Next
lauf=n
seq=lauf/2
wx=0
wi=1
For d=0 To m-1 ;Anzahl der Sequenzen, Auflösung, übergebene Variable m
For i=0 To lauf-1
j=i+seq
tr.f=z(i,0)+z(j,0) ;Summe real
ti.f=z(i,1)+z(j,1) ;Summe imag
sr.f=(z(i,0)-z(j,0)) ;Differenz real
si.f=(z(i,1)-z(j,1)) ;Differenz imag
z(i,0)=tr
z(i,1)=ti
If wx<>0
z(j,0)=(sr * w(wx,0)-si * w(wx,1)) ;Differenz * Drehfaktor real
z(j,1)=(sr * w(wx,1)+si * w(wx,0)) ;Differenz * Drehfaktor imag
Else
z(j,0)=sr
z(j,1)=si
EndIf
wx=(wx+wi)%(n/2)
If ((i+1)/seq)%2=1
i=i+seq
EndIf
Next
seq=seq/2
wx=0
wi=wi*2
Next
nv2=n/2
nm1=n-1
j=1
For i=1 To nm1 ;Ausgängsbreite sortieren 0,4,2,6,1,5,3,7 wird zu 0,1,2,3,4,5,6,7
If i<j
tr=z(j-1,0)
ti=z(j-1,1)
z(j-1,0)=z(i-1,0)
z(j-1,1)=z(i-1,1)
z(i-1,0)=tr
z(i-1,1)=ti
EndIf
k=nv2
While k<j
j=j-k
k=k/2
Wend
j=j+k
Next
Zeit=ElapsedMilliseconds()-Beginn
For i=0 To n-1
Next
PrintN("")
PrintN("Durchlaufzeit folgender FFT-Schleife: "+Str(Zeit)+" Millisekunden")
EndProcedure
Procedure Lauf()
Print("Exponent e der Stützstellenzahl n=2^e, e= ")
e$=Input(): e=Val(e$)
Beispiel1(e)
Schleife(e)
EndProcedure
Eingabe:
Lauf()
n=Pow(2,e)
PrintN("Ausgangssignal FFT")
For i=0 To n-1
a$=StrD(z(i,0)/n,5)
b$=StrD(z(i,1)/n,5)
PrintN(Str(i)+" : "+a$ +" +i* "+b$)
Next
For i=0 To n-1
xIn(i)=z(i,1)
yIn(i)=z(i,0)
Next
Schleife(e)
PrintN("Ausgangssignal iFFT (Real- und Imag-Ein- und Ausgang vertauscht)")
For i=0 To n-1
a$=StrD(z(i,1)/n,5)
b$=StrD(z(i,0)/n,5)
PrintN(Str(i)+" : "+a$ +" +i* "+b$)
Next
Print("Ein weiterer Durchlauf? [j]+[Enter]: ")
a$=Input()
If a$="j"
ClearConsole()
Else
End
EndIf
Goto Eingabe:
Sicher gibt es im Code noch Verbesserungsmöglichkeiten, aber zu ersten Ausprobieren reicht dies kleine Konsolenprogramm! Vielleicht kann jemand das ja gebrauchen.
P.S.: Wie kann ich eigentlich kennzeichnen, dass das Problem gelöst ist?