DEUTSCHE VERSION |
|
Links | | | Forums | | | Comments | | | Report news |
Chat | | | Polls | | | Newsticker | | | Archive |
amiga-news.de Forum > Programmierung > Tonerkennung | [ - Search - New posts - Register - Login - ] |
1 -2- 3 4 5 6 7 Last | [ - Post reply - ] |
2006-08-02, 13:04 h gni Posts: 1106 User |
[quote]DariusBrewka:C code:Nicht jeder C Compiler kann mit diesen Array-Definitionen umgehen, da die Größe erst zur Laufzeit ermittelt wird.void FFT(signed char *in, signed char *out, int m) { double x[(int) pow(2, m)]; double y[(int) pow(2, m)]; [ - Answer - Quote - Direct link - ] |
2006-08-02, 13:52 h bubblebobble Posts: 707 User |
@MaikG >>Hast Du Dir mal das Beispiel für die DTMF-Erkennung mittels >>Goertzel-Algorithmus angesehen? Der scheint für diesen Zweck >>deutlich effizienter zu sein, insb. wenn man das Programm in >>Basic für einen nicht-FPU ausgestatteten Amiga schreiben will. >Wo gibt es das? Wie der Goertzel Algo funktioniert, hat Holger doch oben als Link referenziert. Wenn dir aber bereits der FFT Algo zu kompliziert ist, obwohl hier C und Basic Code gepostet wurde, dann wird dir das auch nicht weiter helfen. Evtl. nimmst du dann besser die easyFFT lib, oder steigst auf Amiblitz2 um und nimmst die fft.inlcude, wie man die anwendet habe ich ja oben gepostet. Vielleicht wandle ich die auch mal in eine Library um, aber da ich alles in Amiblitz2 code brauche ich das für mich nicht. Ob der Goertzel Algo aber besser geeignet ist weiss ich nicht. Schliesslich kann man bei der FFT auch die Kenntniss der anderen Frequenzbänder ausnutzen, d.h. du akzeptierst den Piep Ton nur, wenn er einen Ausschlag verursacht an der gewünschten Frequenz, aber NUR wenn die anderen Frequenzen ruhig bleiben. Das geht beim Goertzel nicht. Da würdest du auch akzeptieren, wenn alle möglichen anderen Frequenzen zu hören sind, z.B. beim weissen Rauschen. -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ Dieser Beitrag wurde von bubblebobble am 02.08.2006 um 13:53 Uhr geändert. ] [ - Answer - Quote - Direct link - ] |
2006-08-02, 18:13 h MaikG Posts: 5172 User |
>Wie der Goertzel Algo funktioniert, hat Holger doch oben als Link >referenziert. Oh, hatte ich übersehen. Ich dachte jetzt sowas gibts auch in einer Library Form. >Evtl. nimmst du dann besser die easyFFT lib, oder steigst auf Ja, ich muss mir das mal ausdrucken und in ruhe gucken wie man die Library ansteuert. >Amiblitz2 um und nimmst die fft.inlcude, Nein Amiblitz2 ist nix für mich. [ - Answer - Quote - Direct link - ] |
2006-08-02, 23:33 h DariusBrewka Posts: 899 [Banned user] |
[quote] Original von gni: Zitat: Ja und manche können andere Sachen nicht, ich schreibe Programme so, daß ich die bei mir compilieren kann. Ich würde vermuten, das Daten dieser Art vom compiler sowieso auf den Stack verfrachtet werden, anders wäre es auch garnicht so "richtig" möglich. [ - Answer - Quote - Direct link - ] |
2006-08-03, 01:26 h Holger Posts: 8116 User |
Zitat:Aber jeder C99-konforme C-Compiler kann das. Und auf ältere Compiler Rücksicht nehmen, hilft einem nicht wirklich. Schließlich soll der Compiler dem Programmierer Arbeit abnehmen und nicht umgekehrt. Zitat:Natürlich landet jede Variable, deren Speicher nicht explizit durch den Programmierer vom heap angefordert wurde, auf dem Stack. Aber was hat das mit der Frage nach den arrays mit dynamischer Länge zu tun? mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
2006-08-03, 02:30 h DariusBrewka Posts: 899 [Banned user] |
Zitat: z.B. daß es wesentlich einfacher zu realisieren ist AUCH zur Laufzeit ein Array zu belegen. Man braucht da garnicht erst groß zu überlegen, was das an Aufwand ist ob man nun ein Array von 10 doubles auf'm Stack packt und dafür höchstens ein add #80,sp (auf 68k) braucht, oder das Ganze irgendwie versucht im Normalen Speicher zu hinterlegen. Gerade weil dieses Array im Stack landet sehe ich nicht das Problem warum es Schwierig sein sollte, wäre es nicht so, könnte ich gni's Einwand verstehen. [ - Answer - Quote - Direct link - ] |
2006-08-03, 13:02 h Holger Posts: 8116 User |
Zitat:Es geht nicht darum, ein array auf den stack zu packen, sondern ein array, dessen Größe beim Funktionsbeginn nicht bekannt ist. Die normale, bzw. althergebrachte Methode, code zu generieren, reserviert nämlich zu Beginn den Platz für alle Variablen der Funktion. Mal abgesehen davon, dass es eher lea -80(a7),a7 auf dem 68k wäre, steht es jedem natürlich frei, sich seine eigene Programmiersprache zu erschaffen, oder in Assembler zu programmieren, wo alles möglich ist. In C war es jedenfalls jahrzehntelang nicht möglich. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
2006-08-03, 14:17 h bubblebobble Posts: 707 User |
Ihr werdet langsam off-topic, zumal Maik das nicht in C coden will. MaikG: Die FFT wird dir sicher die besten Ergebnisse liefern. Du wirst am Ende eine Zahlenfolge bekommen, wie Darius sie gepostet hat, wo man leicht erkennen kann, ob die zwei Sinustöne drin sind oder nicht. Also sowas wie 1 2 1 4 1 3 20 1 3 2 1 2 24 1 2 1 1 Du musst dann nur gucken, ob "deine" Frequenzen stark verteten sind, und alle anderen recht niedrig sind. Bei Goertzel Algo bekomsmt du nur raus, dass deine Frequenzen drin sind, aber nicht ob noch andere Frequenzen drin sind. Dadruch könntest du Geräsuche positiv klassifizieren, die du nicht haben willst (false positives), z.B. weisses Rauschen, wo alle Freqeunzen stark vertreten sind, und das willst du ja auf jeden Fall vermeiden. -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Answer - Quote - Direct link - ] |
2006-08-03, 22:33 h Holger Posts: 8116 User |
Zitat:Das ist Unsinn. Beim DTMF dürfen nur zwei Frequenzen der acht zu analysierenden ein Signal ergeben und ihre Energielevel müssen in einem definierten Verhältnis mit einer genau spezifizierten maximalen Toleranz zueinander stehen, während natürlich die anderen sechs unterhalb einer Rauschschwelle liegen müssen. Das ist bei weissem Rauschen nicht gegeben und bei natürlichen Tönen treten diese Töne normalerweise nicht in diesem Verhältnis zueinander auf. Dazu wurden extra diese disharmonischen Frequenzen gewählt. Wenn doch, hilft Dir auch FFT nicht weiter. Der gepostetete Beispielcode enthält außerdem bereits die vollständige Analyse für die DTMF-Erkennung und ist dabei kompakter als der FFT-Code, der diese entsprechende Analyse noch gar nicht enthält. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
2006-08-04, 12:09 h bubblebobble Posts: 707 User |
Ok, Holger. Soll er Goertzel nehmen. -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Answer - Quote - Direct link - ] |
2006-08-07, 18:27 h MaikG Posts: 5172 User |
So hab mir die Library jetzt mal ganz in Ruhe angesehen, einfach ist das irgendwie auch nicht. Man kann da nicht einfach einen Sample hinschicken und man bekommt dann die Frequenzen. Da muss man irgendwie eine Funktion aufrufen, diese dann mit der nächsten einstellen und dann noch diese ganzen Tags wo dann von PI usw. die rede ist... [ - Answer - Quote - Direct link - ] |
2006-08-08, 11:04 h DariusBrewka Posts: 899 [Banned user] |
Zitat: Sorry, was erwartest du? Bubblebobble hat dach gesagt was zu tun ist und mit der lib sollte das Alles schon einfacher sein oder? oder willst du das Bubblebobble oder Ich dir eine Funktion schreiben, die nur für Deinen Zweck gedacht ist?. Nee irgendwas mußt du auch schon machen, sonst brauchst du garnicht erst Programmieren. [ - Answer - Quote - Direct link - ] |
2006-08-08, 12:00 h bubblebobble Posts: 707 User |
Zitat:... und zwar in Maxon Basic. In C und Blitzbasic haben wir dir ja schon den Code gepostet. Alles was du machen müsstest ist, das Input Format sicher zu stellen (bei meinem Code 32bit samples) und am Ende die Frequenzen auszuwerten. Zitat:Das stimmt. Ich wäre damals froh gewesen, wenn mir jemand die FFT (sogar mit Beispiel Code) erklärt hätte oder wenn es Wikipedia gegeben hätte. Nur gab es damals noch kein Internet und keine Foren, und ich musste Bücher welzen und von der Theorie auf den eigentlichen Code schliessen. Dafür hab ich es aber auch verstanden und dabei gelernt, mich durch zubeissen. P.S. Die API der easyFFT lib ist zugegebenermassen etwas verkorkst, aber sooooo kompliziert ist das auch wieder nicht. Vielleicht wäre es ja besser, dein Rahmenprogram in Amilbitz zu konvertieren und meine fft.inlcude zu benutzen. Dann liefe das mehr oder weniger hinaus auf: code:ffthandle.l = fft_init{order} If ffthandle fft_sethanning{ffthandle} ... ; so oft aufrufen wie du willst: fft_do_mono{ffthandle,sourcebuffer,destbuffer} ... fft_free{ffthandle) End If Einfacher gehts eigentlich nicht. Das erstellen eines ffthandle ist notwendig, weil man für die FFT einen Kontext vorbereiten muss. Das könnte man zwar implizit on-the-fly machen, aber dann könnte man nicht zwischen verschiedenen FFT Fenster größen wählen, ohne Overhead. -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Answer - Quote - Direct link - ] |
2006-08-08, 18:28 h MaikG Posts: 5172 User |
>... und zwar in Maxon Basic. In C und Blitzbasic haben wir dir ja >schon den Code gepostet. Alles was du machen müsstest ist, das >Input Format sicher zu stellen (bei meinem Code 32bit samples) und >am Ende die Frequenzen auszuwerten. Das kann ich nicht umwandeln, sowohl die beispiele und die Samples. Davon abgesehen nehme ich mal an das eine 8->32bit umwandlung zuviel rechenzeit in Anspruch nehmen würde. Mein zeugs in Amiblitz zu wandeln ist noch komplizerter, immerhin ist da Sprachausgabe(nicht Translator), Spracherkennung, Sensoranalysen, Abwehrsteuerung usw. drin. [ - Answer - Quote - Direct link - ] |
2006-08-08, 22:39 h DariusBrewka Posts: 899 [Banned user] |
Zitat: ???, eine 8->32 Bit Konvertierung ist etwas was nun wirklich keine CPU überfordert, selbst einen 68000/7.14MHz nicht. Ich wüßte auch nicht was da so viel Zeit brauchen sollte. Und wieso kannst du die nicht Umwandeln? Es gibt keine Sprache, welche ich kenne wo eine Umwandlung kein einfaches Zuweisen ist. In c(++) signed char buffer1[10] signed int buffer2[10] buffer2[1] = buffer1[1] oder in Basic DIM %buffer1[10] DIM &buffer2[10] buffer2[1] = buffer1[1] Ich habe mit Basic schon lange nichts mehr gemacht und kenne das Zeichen für BYTE und für LONG Nicht, darum % und &. Was macht eine 8->32 Bit Konvertierung?, Bits 0-7 vom 8 Bit Wert werden einfach in Bit 0-7 des Zielregisters geschrieben und die Bits 8-31 werden einfach mit Bit 7 des Quellwertes aufgefüllt. D.h. wenn der 8 Bit Wert von der Quelle in der Binärdarstellung 01110101 ist ist Ziel 0000000000000000000000000110101 ist die Quelle 11000011 (Bit 7=1 -> Zahl ist Negativ) dann ist das Ziel 11111111111111111111111111000011, d.h. selbst wenn die CPU das nicht selber könnte wäre es nicht allzu schwer das selber zu machen. [ - Answer - Quote - Direct link - ] |
2006-08-08, 22:44 h bubblebobble Posts: 707 User |
Im Vergleich zur FFT würde die Umwandlung von 8->32bit so gut wie nicht ins Gewicht fallen. Man muss sowieso früher oder später nach Float wandeln, oder man implementiert eine integer FFT, aber auch da wäre 32bit Int ratsam. -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Answer - Quote - Direct link - ] |
2006-08-09, 10:54 h MaikG Posts: 5172 User |
>oder in Basic >DIM %buffer1[10] >DIM &buffer2[10] >buffer2[1] = buffer1[1] buffer%(10) buffer&(10) buffer&=buffer% Man kann dann aber auch gleich die werte vom Sampler in einer Long Variabelen legen. Ich versuche mal eines der Beipiele umzuwandeln. [ - Answer - Quote - Direct link - ] |
2006-08-09, 22:56 h MaikG Posts: 5172 User |
Okay ich habs mal probiert: FUNCTION fft_makeptable&(order&) REM DO the dirty stuff (oh my god, I have headache!) npoints& = 1 LSL order& ptr& = AllocMem_(npoints&*4,MEMF_CLEAR&) IF ptr& FOR n& = npoints&-1 TO 0 STEP -1 ibit& = 0 in& = 0 FOR bit&=order&-1 TO 0 STEP -1 mask& = 1 LSL bit& IF (n& AND mask&) THEN in& = in& | (1 LSL ibit) ibit&+1 NEXT bit& POKEL ptr& + (n&*SizeOf&) , in& NEXT n& END IF fft_makeptable&=ptr& END FUNCTION Statement fft_create_win{*fft_handle.fft_handle,alpha!,beta!} If *fft_handle If wtable=0 AND ptable><0 wtable = AllocMem_(npoints&*SizeOf&,0) If wtable f! = npoints& temp! = 2.0 * Pi / (f-1) perptr& = ptable winptr& = wtable FOR i&=0 TO npoints&-1 f! = i& Poke.f winptr& + PEEKL(perptr&+i&*4)*4, alpha! - beta!*COS(temp!*f) NEXT i& END IF END IF END IF End Statement ; init a hamming window Statement fft_create_hamming{*fft_handle.fft_handle} fft_create_win {*fft_handle, 0.54 , 0.46} End Statement ; init a hanning window Statement fft_create_hanning{*fft_handle.fft_handle} fft_create_win {*fft_handle, 0.5 , 0.5} End Statement Statement fft_permutate_mono {*fft_handle.fft_handle,buffer_src&,buffer_dst&} If *fft_handle IF buffer_src& IF buffer_dst& perptr& = ptable winptr& = wtable If winptr FOR n&=0 TO npoints&-1 Poke.f buffer_dst& , PEEKL(buffer_src& + PEEKL(perptr&)*4) * Peek.f(winptr&) Poke.f buffer_dst&+4 , 0 buffer_dst=buffer_dst& + 8 winptr&=winptr& + 4 perptr&=perptr& + 4 NEXT n& ELSE FOR n&=0 TO npoints&-1 Poke.f buffer_dst& , PEEKL(buffer_src& + PEEKL(perptr&)*4) Poke.f buffer_dst&+4 , 0 buffer_dst&=buffer_dst& + 8 perptr&=perptr& + 4 NEXT n& END IF END IF END IF END IF END Statement Statement fft {*fft_handle.fft_handle,buffer_dst&,dir&} IF *fft_handle IF buffer_dst& *sinT.sinT = sintable *cosT.sinT = &sintablew[order&] le& = 0 le2& = 1 buffer_r& = buffer_dst& buffer_i& = buffer_dst& + 4 FOR k& = 0 TO order&-1 le& = le2& le2& LSL 1 le16& = (le2& LSL 3) le8& = (le& LSL 3) ur! = 1.0 ui! = 0.0 wr! = *cosTw[k] wi! = dir& * *sinTw[k] FOR j& = 0 TO le&-1 p1r& = buffer_r& + (j& LSL 3) p1i& = buffer_i& + (j& LSL 3) p2r& = p1r&+le8& p2i& = p1i&+le8& FOR i& = j& TO npoints&-1 STEP le2& tr! = Peek.f(p2r&) * ur! - Peek.f(p2i&) * ui! ti! = Peek.f(p2r&) * ui! + Peek.f(p2i&) * ur! Poke.f p2r&, Peek.f(p1r&) - tr Poke.f p2i&, Peek.f(p1i&) - ti Poke.f p1r&, Peek.f(p1r&) + tr Poke.f p1i&, Peek.f(p1i&) + ti p1r& + le16& : p1i& + le16& p2r& + le16& : p2i& + le16& NEXT i& tr = (ur!*wr! - ui!*wi!) ui = (ur!*wi! + ui!*wr!) ur! = tr NEXT j& NEXT k& END IF END IF End Statement In Maxon gibts aber kein Statement, Peek/Pook.f, SinT, CosT * [] und kein LSL [ - Answer - Quote - Direct link - ] |
2006-08-10, 00:19 h Holger Posts: 8116 User |
Zitat:Vielleicht solltest Du besser den C-Code als Ausgangsbasis nehmen. Dort ist LSL der Operator <<, genauso wie in MaxonBasic. Wenn Poke.l in MaxonBasic POKEL ist, müsste poke.f der Logik nach POKEF sein, gibt es aber wahrscheinlich gar nicht. Müsstest Du Dir selbst definieren, ala Basic code:Ich hoffe, die Syntax stimmt halbweg, Basic benutz ich wahrlich selten. Das da oben funktioniert allerdings nur, wenn MaxonBasic die Zahlen auch im IEEE...-Format ablegt, was vermutlich nur der Fall wäre, wenn es eine Version mit FPU-Unterstützung beim Compilieren unterstützt, andernfalls ist es höchstwahrscheinlich FFP, was man über die mathlibs konvertieren müsste, aber das sprengt jetzt den Rahmen.DEFINE FUNCTION PEEKF!(adr&) tmp!=0 POKEL VARPTR(tmp!),PEEKL(adr&) RETURN tmp! END FUNCTION DEFINE SUB POKEF(adr&,value!) POKEL adr&,PEEKL(VARPTR(value!)) END SUB Die eckigen Klammern sind wohl bei Dir runde, falls Du die tables mittels DIM nachbildest, das hast Du ja schon selbst gepostet. Und die Backslashes...sind eine Augenqual... mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
2006-08-10, 11:57 h bubblebobble Posts: 707 User |
@MaikG Um es 1:1 umzusetzen, fehlt dir noch der Rahmen. Hier findest du die fft.inlcude als BB2 code und als ASCII: http://www.hd-rec.de/Archive/fft_test.lha Zum Konvertieren: "Statement" ist in Blitzbasic eine Funktion ohne Rückgabewert. LSL ist der Bit-Schiebeoperator << in C. Poke.f macht das gleiche wie Poke.l, nur mit Floats statt mit 32bit Integern. SinT und CosT sind einfache Arrays, keine Funktionen. Die eckigen Klammern sind Arrays, die innerhalb eines Komplexen Datentyps definiert werden. Der * signalisiert, dass es eine komplexe Zeiger Variable handelt, also in dem Fall *ffthandle vom Typ ffthandle, der dessen Speicher mit AllocMem allociert wurde. Die Backslashes bedeuten, dass es sich um ein Element eines komplexen Typ handelt. Also z.B. *ffthandlesintable Wenn nichts davor steht, ist es immer das letzte "UsePath" gemeint, hier IMMER *ffthandle. Grundsätzlich ist der Code so aufgebaut, dass jede Funktion den "fft_handle" haben will, das ist eine Structur vom Typ fft_handle. Darin sind alle Variablen gespeichert, die mit angesprochen werden. Ich hoffe das hilft dir weiter. @Holger: Alles Gewöhnungssache. Für mich sehen die vielen "&" in Maxonbasic fuchtbar aus. -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ Dieser Beitrag wurde von bubblebobble am 10.08.2006 um 11:57 Uhr geändert. ] [ - Answer - Quote - Direct link - ] |
2006-08-13, 10:15 h MaikG Posts: 5172 User |
>Vielleicht solltest Du besser den C-Code als Ausgangsbasis nehmen. Ist der vollständig oder bräuchte ich da auch nochmehr drumrum? >Um es 1:1 umzusetzen, fehlt dir noch der Rahmen. >Hier findest du die fft.inlcude als BB2 code und als ASCII: >http://www.hd-rec.de/Archive/fft_test.lha Da ist ja noch viel mehr. [ - Answer - Quote - Direct link - ] |
2006-08-13, 13:29 h bubblebobble Posts: 707 User |
Zitat: Du brauchst nicht alles, nur die Funktionen die ich dir hier als Beispiel mini-Quellcode gepostet habe, und einige, die von diesen Funktioen aufgerufen wurden. Da sind halt noch andere Funktionen drin, z.B. für Stereo, für inverse FFT, Hamming window, cos/sin <=> magnitude/phase und ein build-in Demo, was dir ein paar Coeffizienten berechnet. Also wenn dich das aus der Bahn wirft, sorry, lass es lieber sein mit dem Programmieren. So wie du dich hier anstellst frage ich mich ernsthaft, wie du den Rest hinbekommen hast. Zitat:-- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Answer - Quote - Direct link - ] |
2006-08-13, 13:36 h Ralf27 Posts: 2779 User |
[quote] Original von bubblebobble: Zitat: Ich kann MaikG schon etwas verstehn, denn ich versteh BB noch weniger als C. Bzw. versteh ich da sogar die Beispiele in MBasic von denn MBasic-Disks weniger als Beispiele in C im Internet. Aber dennoch hab ich auch schon ein paar Programme geschrieben. -- http://www.alternativercomputerclub.de.vu [ - Answer - Quote - Direct link - ] |
2006-08-13, 15:00 h bubblebobble Posts: 707 User |
Der FFT Algorithmus ist fast pure Arithmetik. Der sieht in jeder Sprache gleich aus, alleine der Varialben Zugriff unterscheidet sich leicht, aber ich glaube jeder kann sich vborstellen, was z.B. Peek.f() macht, oder a = b + c, oder For n=0 to m ... Next. Das ist was anderes als z.B. eine Spiel oder eine App, wo man viele Sprachen-Spezifische Befehle nutzt, die ein "outsider" nicht kennt und im Handbuch nachschlagen müsste um zu verstehen, was da genau passiert. Aber vielleicht habe ich etwas überreagiert. Sorry MaikG. -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Answer - Quote - Direct link - ] |
2006-08-27, 23:35 h MaikG Posts: 5172 User |
Ja, hatte eine weile keine Zeit und war Krank. Nun habe ich mir nochmal easyFFT angesehen und glaube zumindest zu verstehen was ich der Library übergeben muss. Nur irgendwas läuft da schief im C Beispiel z.B. muss bei new nur ein Parameter übergeben werden, Basic sagt dann aber da Fehlt noch was. Da ich etwas von Tag gelesen habe, hab ich dann immer TAGEND& dahinter gesetzt. Wird jetzt zwar Compilert aber die Rückgabewerte sind nicht so wie sie sein müssten oder anders gesagt kein Ergebniss. Hier das Programm: '$INCLUDE easyFFT.bc '$INCLUDE exec.bh '$INCLUDE dos.bh LIBRARY "easyFFT.library" LIBRARY OPEN "exec.library" LIBRARY OPEN "dos.library" DECLARE FUNCTION eFFTnew& LIBRARY ' DECLARE FUNCTION eFFTcalc& LIBRARY ' DECLARE FUNCTION eFFTfree& LIBRARY ' DECLARE FUNCTION eFFTsetdat& LIBRARY ' DECLARE FUNCTION eFFTgetdat& LIBRARY ' POKEB &hBFE301,0 REM ParallelPort auf Eingang DIM temptag&(10) DIM sample%(10000) REM ParallelPort daten 128 entspricht 0 Linie 1 IF PEEKB(&hBFE101)>180 THEN PRINT "jetzt" 3 t!=TIMER 2 IF TIMER-t<.00012207 THEN 2 REM 8192 HZ INCR a%:sample%(a%)=PEEKB(&hBFE101):IF a%=10000 THEN GOSUB 4 GOTO 3 END IF GOTO 1 4 myhl&=eFFTnew&(150&,TAG_END&) x&=eFFTsetdat& (myhl&, eFFT_SIG&, VARPTR(sample%(0)),TAG_END&) PRINT x&;"setdat1" x&=eFFTsetdat& (myhl&, eFFT_DOPD&, TRUE&,TAG_END&) PRINT x&;"setdat2" x&=eFFTcalc&(myhl&,TAG_END&) PRINT x&;"calc" dptr&=eFFTgetdat&(myhl&, eFFT_ASP&,TAG_END&) IF dptr& THEN PRINT PEEKL(dptr&) PRINT PEEKL(dptr&+4) PRINT PEEKL(dptr&+8) PRINT PEEKL(dptr&+12) PRINT PEEKL(dptr&+16) END IF REM FFT a%=0 RETURN [ - Answer - Quote - Direct link - ] |
2006-08-28, 09:17 h Mad_Dog Posts: 1944 User |
Vielleicht hilft Dir dieser Artikel zum Thema FFT weiter: http://de.wikipedia.org/wiki/Schnelle_Fourier-Transformation Und hier noch was zum Thema: http://de.wikipedia.org/wiki/Frequenzbereich -- http://www.norman-interactive.com [ Dieser Beitrag wurde von Mad_Dog am 28.08.2006 um 09:20 Uhr geändert. ] [ - Answer - Quote - Direct link - ] |
2006-08-28, 09:39 h MaikG Posts: 5172 User |
Oh, Mathe war viele Jahre her. Ich möchte lieber die Library benutzen, dann brauche ich nicht Rechnen und FFT an sich nicht verstehen. [ - Answer - Quote - Direct link - ] |
2006-08-28, 12:37 h Mad_Dog Posts: 1944 User |
Zitat: Du solltest Dir aber erstmal das eigentliche Problem bewusst machen, bevor Du von irgendwoher wild Code umherkopierst. Du willst einen Ton erkennen - also eine bestimmte Frequenz. Das kannst Du anhand des Amplitudenspektrums herausfinden. Das Eingangssignal wird dabei nach seinen Frequenzbereichen aufgeschlüsselt. Wenn Du dann siehst, daß der Frequenzbereich, denn Du suchst einen besonders hohen Ausschlag hat, weißt Du, daß jetzt gerade Dein gesuchter Ton kommt. Um Mathe und vor allem Physik wirst Du bei diesem Problem nicht herumkommen... sehs mal positiv: Du lernst noch was dabei. -- http://www.norman-interactive.com [ - Answer - Quote - Direct link - ] |
2006-08-28, 15:13 h MaikG Posts: 5172 User |
>Du solltest Dir aber erstmal das eigentliche Problem bewusst machen, >bevor Du von irgendwoher wild Code umherkopierst. >Du willst einen Ton erkennen - also eine bestimmte Frequenz. Ähm, mit der Library werden keine kentnisse benötigt. Man gibt einen Sample und so dort hin und bekommt eine Frequenzliste. Welche Frequenzen z.B. DTMF 1 hat weiss ich. >Um Mathe und vor allem Physik wirst Du bei diesem Problem nicht >herumkommen... sehs mal positiv: Du lernst noch was dabei. Etwas Mathe kann ich ja hatte glaube ich eine 2 und Physik 1. Das leben ist kurz und man kann leider in der Zeit nicht alles lernen... [ - Answer - Quote - Direct link - ] |
2006-08-31, 14:34 h MaikG Posts: 5172 User |
Keiner eine Idee? Hab schon überlegt ob man ein Sample mit dem Basic Programm in die Ram Disk legt und dann mit einem C Programm das Sample auswertet. [ - Answer - Quote - Direct link - ] |
1 -2- 3 4 5 6 7 Last | [ - Post reply - ] |
amiga-news.de Forum > Programmierung > Tonerkennung | [ - Search - New posts - Register - Login - ] |
Masthead |
Privacy policy |
Netiquette |
Advertising |
Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved. |