amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Tonerkennung [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- 2 3 4 5 6 Letzte [ - Beitrag schreiben - ]

28.07.2006, 23:26 Uhr

MaikG
Posts: 5172
Nutzer
Ich hab mein Handy am Amiga angeschlossen, das Handy nimmt automatisch
ab. Das ist erstmal um die knappheit der Ein/Ausgänge zu umgehen.
Ich kann also meine Alarmanlage anrufen, meinen Namen als "Passwort"
sagen und Status etc. abfragen.
Nun habe ich die Spracherkennung über die voice.library gemacht,
diese ist nun nicht sehr genau. Per Handy wirds dann noch etwas
schlechter. Nun wollte ich zumindest das Passwort per DTMF machen,
weil im extremfall 5 mal in der Öffentlichkeit meinen Namen
zu sagen ist etwas doof. Ausserdem, rein Theoretisch wenn den
jemand nachspricht könnte den die voice.library ebenfalls durchlassen,
wie gesagt die genauigkeit ist begrenzt.

Ja, DTMF sind es jeweils 2 Sinustöne unterschiedlicher Frequenz.
Auf den Sampler kann ich Hardwaretechnisch zugreifen und eine
Wellenform "zeichnen". Aber wie man damit irgendwas sinnvolles
anstellt weiss ich nicht. Ein Bild kann ich da schon viel eher
analysieren.

[ - Antworten - Zitieren - Direktlink - ]

29.07.2006, 00:15 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Am einfachsten wäre es eine FFT (Fast Fourier Transformation) zu machen, die wandelt ein Amplituden in ein Frequenzspektrum um, dann hast du an genau den Stellen, die der Frequenz der beiden Sinus Schwingungen entsprechen einen Peak.

[ - Antworten - Zitieren - Direktlink - ]

29.07.2006, 09:32 Uhr

MaikG
Posts: 5172
Nutzer
>Am einfachsten wäre es eine FFT (Fast Fourier Transformation) zu
>machen, die wandelt ein Amplituden in ein Frequenzspektrum um,
>dann hast du an genau den Stellen, die der Frequenz der beiden
>Sinus Schwingungen entsprechen einen Peak.

Also wie ein Frequenzanzeiger mit so Balken.
Und für dumme, wie geht das Programmiertechnisch?

[ - Antworten - Zitieren - Direktlink - ]

29.07.2006, 10:47 Uhr

bubblebobble
Posts: 707
Nutzer
Für Dumme geht das programmtechnisch gar nicht.

Für alle anderen:

Die FFT wandelt ein sog. Zeitfenster (also z.B. 1024 Samples) in das dazugehörige Spektrum um, also 1024 complexe Werte, die die Amplitude und die Phase der Frequenzanteile darstellt. (bzw. Sinus und Cosinus Anteil bei der FFT, kann man aber hin- und her wandeln).
Was du brauchst ist das Leistungsspektrum, das dir die Energie von jedem Frequenzband gibt. Das erhält man durch
Leistung = Wurzel(sinusAnteil hoch 2 + cosinusAnteil hoch 2)

Wenn du jetzt ein Beep, bestehend aus zwei Frequenzen hinein gibst,
sind alle Frequenzen recht gering (Rauschen) und auf zwei Frequenzbändern würdest du einen hohen Ausschlag bekommen, daran kann man den Beep erkennen.
Welche das sind, hängt von den Frequenzen des Beeps ab, der Samplefrequenz und der FFT Länge.

Die FFT ist normalerweise so implementiert, dass die Eingabe eine Zweierpotenz ist, also 128, 256, 512, 1024, 2048 usw.
Das erste Band ist der Gleichstromanteil, für uns uninteressant.
Das zweite Band ist die Frequenz, deren Schwingung gerade einmal in das Zeitfenster passt. Das dritte Band representiert die Frequenz, die zweimal in das Zeitfenster passt usw. (lineare Scala).

Da die obere Hälfte des Spektrums sich in der Mitte quasi spiegelt, interessieren uns auch nur die unteren 257 Werte, wenn die FFT 512 "Punkte" gross war.

Implementationen für die FFT findest du an jeder Ecke im Internet, Onkel Googel hilft dir da sicher weiter, auch Tante Wikipedia hat einiges zum Thema FFT zu bieten.
Für Amiblitz2 findest du die fft.inlcude in meinem Sourcecodearchiv,
http://www.hd-rec.de/Archive/TK_AB2_Sources.lha

Als Verfeinerung sollte man das Zeitfenster zunächst mit einer Fensterfunktion versehen, für deine Zwecke wäre ein "Hanningfenster" am besten. Das verhindert, das der zu erwartende "Knacks" am Anfang und am Ende des hart herausgeschnittenen Zeitfensters gedämpft wird, und dadurch nicht das Spektrum verwäscht. (Leaking Effekt)
Auch das findest du in meiner fft.include.

Wenn du das ganze erstmal testen willst, schau dir doch in HD-Rec den Spektralizer an. Setze diesen DSP Effekt auf den Input Kanal, und schicke den Beep in die Soundkarte. Dann solltest du zwei sehr klare Peaks sehen. Mit einem einfachen Schwellwert könnte man das leicht erkennen.

Achso, was für ein Amiga denn ? Selbst ein 60er könnte an die Grenze kommen, die FFT in Echtzeit zu machen, da es relativ aufwendig ist.

Aber du brauchst ja nicht ständig analysieren, man kann auch jedes zweite Fenster verwerfen, das sollte für deine Zwecke auch noch dicke reichen.

--
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 29.07.2006 um 10:53 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

29.07.2006, 13:39 Uhr

Chritoph
Posts: 549
Nutzer
Zitat:
Original von bubblebobble:
Achso, was für ein Amiga denn ? Selbst ein 60er könnte an die Grenze kommen, die FFT in Echtzeit zu machen, da es relativ aufwendig ist.


Ernsthaft?
Wie mischt AHI dann die Kanäle?
(Ja, die Frage IST ernst gemeint.)
--
A4000T-128MB-233MHz 604e-50MHz 68060-SCSI Platten-Voodoo 3 3000/Mediator/SB4.1 digital/Highway/Norway/RLT8029/Arxon Scandoubler/interner Monitorswitch<-voll KRANK!

A1200-32MB-50MHz 68030&68882-IDE Platten-Fiberline Netzwerkkarte

[ - Antworten - Zitieren - Direktlink - ]

29.07.2006, 15:41 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Chritoph:
Wie mischt AHI dann die Kanäle?
(Ja, die Frage IST ernst gemeint.)


Jedenfalls nicht über FFT. Da werden einfach nur die Samplewerte addiert und meistens noch durch die Anzahl Kanäle geteilt, um innerhalb des zulässigen Wertebereichs zu bleiben. Das war's auch schon.

FFT kommt beim Mischen nur dann in's Spiel, wenn Du einen Equalizer hast, mit dem Du einzelne Frequenzbereiche verstärken/dämpfen kannst.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

29.07.2006, 16:12 Uhr

Chritoph
Posts: 549
Nutzer
@Holger:

Okay, ich kann das im moment zwar kaum glauben, nehme das aber mal so hin.
Ich hab eh vor nach meiner Diplomarbeit bissel 68k zu hacken, wirklich
schnelle FFT steht da mit auf dem Zettel, dann weiss ich mehr hierzu zu berichten.

--
A4000T-128MB-233MHz 604e-50MHz 68060-SCSI Platten-Voodoo 3 3000/Mediator/SB4.1 digital/Highway/Norway/RLT8029/Arxon Scandoubler/interner Monitorswitch<-voll KRANK!

A1200-32MB-50MHz 68030&68882-IDE Platten-Fiberline Netzwerkkarte

[ - Antworten - Zitieren - Direktlink - ]

29.07.2006, 18:11 Uhr

bubblebobble
Posts: 707
Nutzer
Kanäle mischen ist doch kinderleicht im Zeitbereich, einfach die Sample Werte addieren, oder was hast du gedacht ?
FFT ist da nirgneds im Spiel bei AHI. Das braucht man nur für DSP Effekte, die im Frequenzbereich arbeiten, da gibt es aber gar nicht mal so viele. Bei HD-Rec brauche ich das nur für den Spektralizer (Spektrometer). Ich arbeite gerade noch an einem Formant-erhaltenden Pitch shifter und an einem Denoiser, da kann man das auch gebrauchen. Viele Effekte berechnet man effizienter im Zeitbereich, auch Equalizer.

Ein 60er packt zwar eine FFT in Echtzeit, wenn es effizient implementiert ist, aber z.B. bei überlappenden Fenstern und/oder mit Rücktransformation wird es eng. Das siehst du am MP3 abspielen. Das ist im Prinzip nur eine inverse FFT (von dem entzippen mal abgesehen).
Und das braucht schon mehr als 50% CPU.

Wobei mir einfällt, für die Tonerkennung reicht ja 16 oder 8kHz Samplingrate und mono. Da kann man natürlich einiges einsparen im Vergleich zu 44.1kHz und stereo.

BTW, ich habe auch FFT Code, der mit Integer Werten rechnet, und trotzdem recht genau ist. Das wäre auf einem 60er in Assembler umgesetzt vermutlich das schnellste was möglich ist.

--
Thilo Köhler, Author von:
HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

29.07.2006, 18:24 Uhr

MaikG
Posts: 5172
Nutzer
>FFT wandelt ein sog. Zeitfenster (also z.B. 1024 Samples) in das
>dazugehörige Spektrum um, also 1024 complexe Werte, die die
>Amplitude und die Phase der Frequenzanteile darstellt.
>(bzw. Sinus und Cosinus Anteil bei der FFT, kann man aber hin- und
>her wandeln).
>Was du brauchst ist das Leistungsspektrum, das dir die Energie von
>jedem Frequenzband gibt. Das erhält man durch
>Leistung = Wurzel(sinusAnteil hoch 2 + cosinusAnteil hoch 2)

Ein bisschen hab ich verstanden, ich brauche ein Equlizier
Beispiel, wie z.B. in Amplifier oder Megalosound :-)

>http://www.hd-rec.de/Archive/TK_AB2_Sources.lha

Ich guck.

>Achso, was für ein Amiga denn ? Selbst ein 60er könnte an die
>Grenze kommen, die FFT in Echtzeit zu machen, da es relativ
>aufwendig ist.

Verstehe ich nicht Megalosound zeigt mir den Equi auf 68000.
Ist ein 030er.

[ - Antworten - Zitieren - Direktlink - ]

29.07.2006, 18:57 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Zitat:
Original von bubblebobble:
Ein 60er packt zwar eine FFT in Echtzeit, wenn es effizient implementiert ist, aber z.B. bei überlappenden Fenstern und/oder mit Rücktransformation wird es eng. Das siehst du am MP3 abspielen. Das ist im Prinzip nur eine inverse FFT (von dem entzippen mal abgesehen).
Und das braucht schon mehr als 50% CPU.


Es ist ja auch nicht so, daß Maik wirklich Realtime-Verhalten braucht, es reicht wohl ein paar Samples auszuschneiden und darauf die FFT anzuwenden.

[ - Antworten - Zitieren - Direktlink - ]

29.07.2006, 23:02 Uhr

MaikG
Posts: 5172
Nutzer
>Es ist ja auch nicht so, daß Maik wirklich Realtime-Verhalten
>braucht, es reicht wohl ein paar Samples auszuschneiden und darauf
>die FFT anzuwenden.

Wie schell solche DTMF töne sind ist ja bekannt und schnell
sollte es gehen. Ich überleg schon ob ich die DTMF erkennung
nicht über die Spracherkennung mache, die Töne sind ja immer
exakt. Nur es ist auch so eine frage wie schnell so kurze
sequenzen hintereinander weg verarbeitet werden können.
Das BB zeugs müsste ich erstmal umwandeln um überhaupt mal
ASCII zu sehen.

[ - Antworten - Zitieren - Direktlink - ]

30.07.2006, 14:30 Uhr

bubblebobble
Posts: 707
Nutzer
Hier sind mal die wichtigsten Funktionen.
Die FFT nimmt 32bit integer mono samples, and wandelt es in complexe floats um.
Wenn du willst, kann ich dir den kompletten Code als ASCII schicken.

Die FFT macht genau das, was du brauchst. So würde ich das machen.

Ob du nun diesen Code verwendest oder eine andere aus dem Netz ist egal. Vielleicht kommst du mit einem C Beispiel besser klar.
Dieser hier ist auch schon etwas optimiert, und deshalb aufwendiger als nötig, z.B. werden Tables vorberechnet.


code:
Function.l fft_makeptable{order.l} ; do the dirty stuff (oh my god, I have headache!)
npoints.l = 1 LSL order
ptr.l = AllocMem_(npoints*4,#MEMF_CLEAR)
If ptr
  For n.l = npoints-1 To 0 Step -1
    ibit.l = 0
    in.l   = 0
    For bit.l=order-1 To 0 Step -1
      mask.l = 1 LSL bit
      If (n & mask) Then in = in | (1 LSL ibit)
      ibit+1
    Next
    Poke.l ptr + (n*SizeOf.l) , in
  Next
End If
Function Return ptr
End Function

Statement fft_create_win{*fft_handle.fft_handle,alpha.f,beta.f}
If *fft_handle
  If \wtable=0  AND \ptable><0
    \wtable = AllocMem_(\npoints*SizeOf.f,0)
    If \wtable
      f.f = \npoints
      temp.f = 2.0 * Pi / (f-1)
      perptr.l = \ptable
      winptr.l = \wtable
      For i.l=0 To \npoints-1
        f.f = i
        Poke.f winptr + Peek.l(perptr+i*4)*4, alpha - beta*Cos(temp*f)
      Next
    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.l,buffer_dst.l}
If *fft_handle
  If buffer_src
    If buffer_dst
      perptr.l = \ptable
      winptr.l = \wtable
      If winptr
        For n.l=0 To \npoints-1
          Poke.f buffer_dst   , Peek.l(buffer_src + Peek.l(perptr)*4)   * Peek.f(winptr)
          Poke.f buffer_dst+4 , 0
          buffer_dst + 8
          winptr+4
          perptr + 4
        Next
      Else
        For n.l=0 To \npoints-1
          Poke.f buffer_dst   , Peek.l(buffer_src + Peek.l(perptr)*4)
          Poke.f buffer_dst+4 , 0
          buffer_dst + 8
          perptr + 4
        Next
      End If
    End If
  End If
End If
End Statement

Statement fft {*fft_handle.fft_handle,buffer_dst.l,dir.l}
If *fft_handle
  If buffer_dst
    *sinT.sinT = \sintable
    *cosT.sinT = &\sintable\w[\order]

    le.l = 0
    le2.l = 1
    buffer_r.l = buffer_dst
    buffer_i.l = buffer_dst + 4

    For k.l = 0 To \order-1
      le = le2
      le2 LSL 1
      le16.l = (le2 LSL 3)
      le8.l  = (le  LSL 3)
      ur.f = 1.0
      ui.f = 0.0
      wr.f = *cosT\w[k]
      wi.f = dir * *sinT\w[k]
      For j.l = 0 To le-1
        p1r.l = buffer_r + (j LSL 3)
        p1i.l = buffer_i + (j LSL 3)
        p2r.l = p1r+le8
        p2i.l = p1i+le8
        For i.l = j To \npoints-1 Step le2
          tr.f = Peek.f(p2r) * ur - Peek.f(p2i) * ui
          ti.f = 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
        tr = (ur*wr - ui*wi)
        ui = (ur*wi + ui*wr)
        ur = tr
      Next
    Next
  End If
End If
End Statement


--
Thilo Köhler, Author von:
HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

30.07.2006, 18:15 Uhr

MaikG
Posts: 5172
Nutzer
>Die FFT nimmt 32bit integer mono samples, and wandelt es in
>complexe floats um.


Dann müsste ich ja den z.B. 8000 HZ 8 Bit Sample erst in 32 Bit
wandeln? Ist ein eigenartiger Basic dialekt, aber schlimmer als
C wird der auch nicht sein.

[ - Antworten - Zitieren - Direktlink - ]

30.07.2006, 22:55 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Hier eine hoffentlich leicht verständlichere Version, langsam und mit Floatingpoints aber eigentlich genau für deinen Anwendungszweck bestimmt.
C code:
#include <stdio.h>
#include <math.h>

#define PI 3.14159265

void FFT(signed char *in, signed char *out, int m) {
    double x[(int) pow(2, m)];
    double y[(int) pow(2, m)];
    double xdum, ydum;
    double angle, argument, c, s;
    int   i, j, k, l, n1, n2, n;
    
    n = (int) pow(2, m);

    /* initialize buffers */
   
    for (k = 0; k < n; k++) {
        x[k] = ((double) in[k]) / 128.0;
        y[k] = 0.0;
    }

    /* transformate samples */
    n2 = n;
    for (k = 1; k <= m; k++) {
        n1 = n2;
        n2 = n2 / 2;
        angle = 0.0;
        argument = 2.0 * PI / ((double) n1);
        for (j = 0; j < n2; j++) {
            c = cos(angle);
            s = -sin(angle);
            for (i = j; i < n; i = i + n1) {
                l = i + n2;
                xdum = x[i] - x[l];
                x[i] = x[i] + x[l];
                ydum = y[i] - y[l];
                y[i] = y[i] + y[l];
                x[l] = xdum * c - ydum * s;
                y[l] = ydum * c + xdum * s;
            }
            angle = (j + 1) * argument;
        }
    }
    j = 0;
    for (i = 0; i < (n-1); i++) {
        if (i < j) {
            xdum = x[j];
            x[j] = x[i];
            x[i] = xdum;
            ydum = y[j];
            y[j] = y[i];
            y[i] = ydum;
        }
        k = n / 2;
        while (k < (j + 1)) {
            j = j - k;
            k = k / 2;
        }
        j = j + k;
    }
    for (i = 0; i < n; i++) {
        x[i] = x[i] / n;
        y[i] = y[i] / n;
        out[i] = (signed char) (sqrt((x[i] * x[i] + y[i] * y[i])) * 128.0);
    }
}


void addsine(signed int *inout, int numbytes, int abtastfrequenz, int frequenz, int amplitude, int devide) {
    int i;
    float d, df = 2.0f *  PI * (float) frequenz / (float) abtastfrequenz;
    d = 0.0;
    for (i = 0; i < numbytes; i ++) {
        inout[i] = (inout[i] + (signed int) (((float) amplitude) * sin(d)));
        if (devide > 0) inout[i] = inout[i] / devide;
        d = d + df;
    }
}

void hanning(signed char *inout, int numbytes) {
    int i, m;
    double f;
    m = numbytes / 2;
    for (i = 0; i < numbytes; i++) {
        f = 0.5 * (1.0 + cos(PI * ((double) (i - m)) / (double) m));
        inout[i] = (signed char) ((double) inout[i] * f);
    }
}

#define mlog2 8
#define abtast 44100

int main() {
    int i, f;
    signed char in[(int) pow(2, mlog2)], out[(int) pow(2, mlog2)];
    signed int test[(int) pow(2, mlog2)];
    
    /* test puffer loeschen, in diesem puffer wird eine test(sinus) welle erzeugt */

    for (i = 0; i < (int) pow(2, mlog2); i++) {
        test[i] = 0;
    }

    /* fügt zu einem testpuffer eine sinuswelle hinzu, parameter sind zeiger auf den bereich des puffers, die anzahl der samples, die abtastfrequenz und die frequenz der welle
       der letzte parameter muß 0 sein, wenn jedoch mehrere wellen hinzugefügt werden muß die letzte addsine() funktion die anzahl der addsine() aufrufe haben.
    */
    
    addsine(test, (int) pow(2, mlog2), abtast, 5000, 127, 0);
    addsine(test, (int) pow(2, mlog2), abtast, 700, 127, 0);
    addsine(test, (int) pow(2, mlog2), abtast, 11000, 127, 3);

    /* kopieren der testwelle in den input FFT puffer */
    
    for (i = 0; i < (int) pow(2, mlog2); i++) {
        in[i] = (signed char) test[i];
    }

    /* auf eingangswellenform einen hanning funktion anwenden, dient dazu die ränder zu begradigen, sollte auf jeden fall angewandt werden */
    
    hanning(in, (int) pow(2, mlog2));

    /* zeige die wellenfunktion an, nach anwendung des hanning filters */
    
    for (i = 0; i < (int) (pow(2, mlog2) ); i++) {
        printf("    Band %d, Amplitude %d\n", i, (int) in[i]);
    }

    printf("fft values (%d values): \n", (int) pow(2, mlog2));

    /* der wichtigste teil, führe die FFT aus */
    
    FFT(in, out, mlog2);

    /* Anzeige der Frequenzbänder */
    
    for (i = 0; i < (int) (pow(2, mlog2) / 2); i++) {
        f = abtast * i / ((int) pow(2, mlog2));
        printf("    Band %d, Frequenz %d, Leistung %d\n", i, f, (int) out[i]);
    }
    printf("\n");
    
    return 0;
}


das Wichtigste ist die Funktion FFT(), diese habe ich für 8BIT signed Werte ausgelegt genau für die damaligen Amiga Paralellport Sampler.

die Funktion pow(n,m) liefert den Wert n ^ m zurück.

der erste Parameter von FFT() gibt den Eingangspuffer d.h. die gesampleten Werte, dieser Puffer ist 2^mlog2 Bytes gross, d.h. wenn du 512 Samples hast muß mlog2=9 sein, denn 2^9 = 512.

der OutPuffer (zweiter Parameter) muß die gleiche größe die der Eingangspuffer haben dieser enthält dann die Leistungen der einzelnen Frequenzbänder, dieser ist jedoch Spiegelsymetrisch, d.h. es sind nur die Werte bis zur hälfte interessant, der linke Wert enthält dann die Leistung des kleinsten Frequenz der mittlere die der höchstens Frequenz (= halbe Abtastfrequenz, die für die FFT jedoch nicht benötigt wird).

Das Beispiel mischt drei Sinuswellen unterschiedlicher Frequenz zusammen und zeigt dann das Frequenzspektrum dieser Welle an, wie du an der Ausgabe erkennen kannst haben genau die drei Bänder die höchste Leistung, die den Frequenzen der gemischten Wellen entsprechen.

100% kannst du die Frequenz kaum herausfinden, da du (2^mlog2 / 2) Bänder nach der FFT erhälst, d.h. wenn die Samples mit der Abtsatfrequenz von 44100Hz gesamplet worden, die maximale Frequenz dann 22050 ist, die Möglich ist. Damit ist der Abstand zwischen den einzelnen Bändern 22050 / (2^mlog2 / 2).

Damit ist die Auflösung umso besser je größer mlog2 ist.

Also:

erstelle z.B. zwei Puffer mit 1024 Bytes, damit ist nlog2=10

kopiere in den ersten Puffer die Samples aus dem Sampler und führe auf diesen Puffer die hanningfunktion aus, führe dann auf den gleichen puffer FFT(inpuffer, outpuffer, 10) aus.

[ - Antworten - Zitieren - Direktlink - ]

31.07.2006, 12:33 Uhr

bubblebobble
Posts: 707
Nutzer
@Daruis
Normalerweise muss man doch erst permutieren, und dann transformieren.
In deinem Code ist das andersherum. Ich glaube nicht dass das funktioniert.


--
Thilo Köhler, Author von:
HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

31.07.2006, 15:16 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von DariusBrewka:
C code:
(int) pow(2, ...);



Ich bin ja nu wirklich kein Optimierungs-Fanatiker, aber hier bietet sich definitiv an, (int)pow(2, x) durch 1<<x zu ersetzen, weil es doch mehrfach vorkommt, und teilweise in compile-time Konstanten resultiert, aber eben nur, wenn man keine externen Funktionen aufruft.

Gerade alte Amigs werden es danken, wenn man für einfache Integer-Operationen nicht die FPU bemüht.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

31.07.2006, 17:58 Uhr

MaikG
Posts: 5172
Nutzer
Oh, man das sieht so kompliziert aus. Kann man nicht die ca.
6 zu erwartenden Frequenzen über das Sample legen und wenn die
Amplitude dann fast 0 ist hat man die richtigen Frequenzen(Frequenzauslöschung).


Ich hab übrigens keine FPU.

[ - Antworten - Zitieren - Direktlink - ]

31.07.2006, 19:29 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von MaikG:
Oh, man das sieht so kompliziert aus. Kann man nicht die ca.
6 zu erwartenden Frequenzen über das Sample legen und wenn die
Amplitude dann fast 0 ist hat man die richtigen Frequenzen(Frequenzauslöschung).


Nein, denn da Du nicht die Phasenverschiebung kennst, kannst Du auch das Gegenteil erreichen -> Amplitudenverdoppelung. Oder, was am wahrscheinlichsten ist, irgendetwas dazwischen, was Dir überhaupt nicht weiterhilft.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

31.07.2006, 19:43 Uhr

bubblebobble
Posts: 707
Nutzer
So kompliziert ist das nicht. Du musst ja den FFT loop nicht unbedingt verstehen, reicht wenn du die Funktion aufrufst.
Im Aminet gibts es übrigends die easyFFT library, falls du das nicht selbst coden willst.
Ich könnte auch meine FFT.inlcude mal in eine Lib packen.
Dann sieht das so aus:

ffthandle = fft_init(order)
if (ffthandle) {
fft_sethanning(ffthandle)
fft_do_mono(ffthandle,sourcebuffer,destbuffer)
fft_free(ffthandle)
}

Wobei dann order=10 für ein Fenster von 1024 samples ist.

--
Thilo Köhler, Author von:
HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

31.07.2006, 21:25 Uhr

Holger
Posts: 8116
Nutzer
Offenbar ist der Goertzel Algorithmus für die Aufgabe besser geeignet. Auf der englischen Wikipediaseite zu dem Algorithmus gibt's auch gleich einen passenden Quellcode:
wiki:Goertzel algorithm#Sample code DTMF

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

31.07.2006, 22:07 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Zitat:
Original von bubblebobble:
@Daruis
Normalerweise muss man doch erst permutieren, und dann transformieren.
In deinem Code ist das andersherum. Ich glaube nicht dass das funktioniert.


??? ich weiß nicht was nicht Funktionieren soll, den Code habe ich schon vor 15 Jahren in 68k ASM benutzt um aus gesampleten Samples Frequenzbänder anzuzeigen und das hat auch 1000000% geklappt.

Der Algorithmus ist von Sande und Tukey, stammt aus dem Mathematischen Taschenbuch von Stöcker, ich denke das dürfte so OK sein.



[ Dieser Beitrag wurde von DariusBrewka am 31.07.2006 um 22:15 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

31.07.2006, 22:14 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Zitat:
Original von Holger:
Ich bin ja nu wirklich kein Optimierungs-Fanatiker, aber hier bietet sich definitiv an, (int)pow(2, x) durch 1<<x zu ersetzen, weil es doch mehrfach vorkommt, und teilweise in compile-time Konstanten resultiert, aber eben nur, wenn man keine externen Funktionen aufruft.


Das war mir schon klar, eigentlich wollte ich ja 2^m benutzen bis ich gemerkt habe das das in C nicht geht, da Maik AFAIK nicht C programmiert habe ich gedacht pow() wäre eindeutiger als 1<<m.

Der code war definitiv nicht dazu gedacht Geschwindigkeitsrekorde aufzustellen, er läuft auch ohne doubles nur sind dann die Ergebnisse nicht so exakt. Außerdem habe ich lieber auf 1 normierte Samples.
Habe halt nur schnell was geschrieben, was Maik's Anwendungsgebiet genau abdeckt.

Aber wie dem auch sei, die sagen wir auch wenns 100 pows() sein sollten die dürften selbst auf einem c64er nicht ins Gewicht fallen.


[ - Antworten - Zitieren - Direktlink - ]

31.07.2006, 22:25 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Nunja für eine 128 Punkt fft, mlog2 = 7 und drei Sinuswellen mit den Frequenzen von 700Hz, 5000Hz und 19000Hz bekomme ich die folgende Ausgabe

code:
fft values (128 values):
    Band 0, Frequenz 0, Leistung 0
    Band 1, Frequenz 344, Leistung 5
    Band 2, Frequenz 689, Leistung 10
    Band 3, Frequenz 1033, Leistung 5
    Band 4, Frequenz 1378, Leistung 0
    Band 5, Frequenz 1722, Leistung 0
    Band 6, Frequenz 2067, Leistung 0
    Band 7, Frequenz 2411, Leistung 0
    Band 8, Frequenz 2756, Leistung 0
    Band 9, Frequenz 3100, Leistung 0
    Band 10, Frequenz 3445, Leistung 0
    Band 11, Frequenz 3789, Leistung 0
    Band 12, Frequenz 4134, Leistung 0
    Band 13, Frequenz 4478, Leistung 1
    Band 14, Frequenz 4823, Leistung 8
    Band 15, Frequenz 5167, Leistung 8
    Band 16, Frequenz 5512, Leistung 1
    Band 17, Frequenz 5857, Leistung 0
    Band 18, Frequenz 6201, Leistung 0
    Band 19, Frequenz 6546, Leistung 0
    Band 20, Frequenz 6890, Leistung 0
    Band 21, Frequenz 7235, Leistung 0
    Band 22, Frequenz 7579, Leistung 0
    Band 23, Frequenz 7924, Leistung 0
    Band 24, Frequenz 8268, Leistung 0
    Band 25, Frequenz 8613, Leistung 0
    Band 26, Frequenz 8957, Leistung 0
    Band 27, Frequenz 9302, Leistung 0
    Band 28, Frequenz 9646, Leistung 0
    Band 29, Frequenz 9991, Leistung 0
    Band 30, Frequenz 10335, Leistung 0
    Band 31, Frequenz 10680, Leistung 0
    Band 32, Frequenz 11025, Leistung 0
    Band 33, Frequenz 11369, Leistung 0
    Band 34, Frequenz 11714, Leistung 0
    Band 35, Frequenz 12058, Leistung 0
    Band 36, Frequenz 12403, Leistung 0
    Band 37, Frequenz 12747, Leistung 0
    Band 38, Frequenz 13092, Leistung 0
    Band 39, Frequenz 13436, Leistung 0
    Band 40, Frequenz 13781, Leistung 0
    Band 41, Frequenz 14125, Leistung 0
    Band 42, Frequenz 14470, Leistung 0
    Band 43, Frequenz 14814, Leistung 0
    Band 44, Frequenz 15159, Leistung 0
    Band 45, Frequenz 15503, Leistung 0
    Band 46, Frequenz 15848, Leistung 0
    Band 47, Frequenz 16192, Leistung 0
    Band 48, Frequenz 16537, Leistung 0
    Band 49, Frequenz 16882, Leistung 0
    Band 50, Frequenz 17226, Leistung 0
    Band 51, Frequenz 17571, Leistung 0
    Band 52, Frequenz 17915, Leistung 0
    Band 53, Frequenz 18260, Leistung 0
    Band 54, Frequenz 18604, Leistung 4
    Band 55, Frequenz 18949, Leistung 10
    Band 56, Frequenz 19293, Leistung 6
    Band 57, Frequenz 19638, Leistung 0
    Band 58, Frequenz 19982, Leistung 0
    Band 59, Frequenz 20327, Leistung 0
    Band 60, Frequenz 20671, Leistung 0
    Band 61, Frequenz 21016, Leistung 0
    Band 62, Frequenz 21360, Leistung 0
    Band 63, Frequenz 21705, Leistung 0


ohne Hanningfenster ist die Ausgabe aber besser, ich weiß nicht ob die Hanningfunktion bei mir Richtig ist, ggf. ist hier etwas nicht korrekt.

oder mit den Wellen von 50Hz, 70Hz und 190Hz und mlog2 = 9 und abtast=512Hz

code:
fft values (512 values):
    Band 0, Frequenz 0, Leistung 0
    Band 1, Frequenz 1, Leistung 0
    Band 2, Frequenz 2, Leistung 0
    Band 3, Frequenz 3, Leistung 0
    Band 4, Frequenz 4, Leistung 0
    Band 5, Frequenz 5, Leistung 0
    Band 6, Frequenz 6, Leistung 0
    Band 7, Frequenz 7, Leistung 0
    Band 8, Frequenz 8, Leistung 0
    Band 9, Frequenz 9, Leistung 0
    Band 10, Frequenz 10, Leistung 0
    Band 11, Frequenz 11, Leistung 0
    Band 12, Frequenz 12, Leistung 0
    Band 13, Frequenz 13, Leistung 0
    Band 14, Frequenz 14, Leistung 0
    Band 15, Frequenz 15, Leistung 0
    Band 16, Frequenz 16, Leistung 0
    Band 17, Frequenz 17, Leistung 0
    Band 18, Frequenz 18, Leistung 0
    Band 19, Frequenz 19, Leistung 0
    Band 20, Frequenz 20, Leistung 0
    Band 21, Frequenz 21, Leistung 0
    Band 22, Frequenz 22, Leistung 0
    Band 23, Frequenz 23, Leistung 0
    Band 24, Frequenz 24, Leistung 0
    Band 25, Frequenz 25, Leistung 0
    Band 26, Frequenz 26, Leistung 0
    Band 27, Frequenz 27, Leistung 0
    Band 28, Frequenz 28, Leistung 0
    Band 29, Frequenz 29, Leistung 0
    Band 30, Frequenz 30, Leistung 0
    Band 31, Frequenz 31, Leistung 0
    Band 32, Frequenz 32, Leistung 0
    Band 33, Frequenz 33, Leistung 0
    Band 34, Frequenz 34, Leistung 0
    Band 35, Frequenz 35, Leistung 0
    Band 36, Frequenz 36, Leistung 0
    Band 37, Frequenz 37, Leistung 0
    Band 38, Frequenz 38, Leistung 0
    Band 39, Frequenz 39, Leistung 0
    Band 40, Frequenz 40, Leistung 0
    Band 41, Frequenz 41, Leistung 0
    Band 42, Frequenz 42, Leistung 0
    Band 43, Frequenz 43, Leistung 0
    Band 44, Frequenz 44, Leistung 0
    Band 45, Frequenz 45, Leistung 0
    Band 46, Frequenz 46, Leistung 0
    Band 47, Frequenz 47, Leistung 0
    Band 48, Frequenz 48, Leistung 0
    Band 49, Frequenz 49, Leistung 0
    Band 50, Frequenz 50, Leistung 20
    Band 51, Frequenz 51, Leistung 0
    Band 52, Frequenz 52, Leistung 0
    Band 53, Frequenz 53, Leistung 0
    Band 54, Frequenz 54, Leistung 0
    Band 55, Frequenz 55, Leistung 0
    Band 56, Frequenz 56, Leistung 0
    Band 57, Frequenz 57, Leistung 0
    Band 58, Frequenz 58, Leistung 0
    Band 59, Frequenz 59, Leistung 0
    Band 60, Frequenz 60, Leistung 0
    Band 61, Frequenz 61, Leistung 0
    Band 62, Frequenz 62, Leistung 0
    Band 63, Frequenz 63, Leistung 0
    Band 64, Frequenz 64, Leistung 0
    Band 65, Frequenz 65, Leistung 0
    Band 66, Frequenz 66, Leistung 0
    Band 67, Frequenz 67, Leistung 0
    Band 68, Frequenz 68, Leistung 0
    Band 69, Frequenz 69, Leistung 0
    Band 70, Frequenz 70, Leistung 20
    Band 71, Frequenz 71, Leistung 0
    Band 72, Frequenz 72, Leistung 0
    Band 73, Frequenz 73, Leistung 0
    Band 74, Frequenz 74, Leistung 0
    Band 75, Frequenz 75, Leistung 0
    Band 76, Frequenz 76, Leistung 0
    Band 77, Frequenz 77, Leistung 0
    Band 78, Frequenz 78, Leistung 0
    Band 79, Frequenz 79, Leistung 0
    Band 80, Frequenz 80, Leistung 0
    Band 81, Frequenz 81, Leistung 0
    Band 82, Frequenz 82, Leistung 0
    Band 83, Frequenz 83, Leistung 0
    Band 84, Frequenz 84, Leistung 0
    Band 85, Frequenz 85, Leistung 0
    Band 86, Frequenz 86, Leistung 0
    Band 87, Frequenz 87, Leistung 0
    Band 88, Frequenz 88, Leistung 0
    Band 89, Frequenz 89, Leistung 0
    Band 90, Frequenz 90, Leistung 0
    Band 91, Frequenz 91, Leistung 0
    Band 92, Frequenz 92, Leistung 0
    Band 93, Frequenz 93, Leistung 0
    Band 94, Frequenz 94, Leistung 0
    Band 95, Frequenz 95, Leistung 0
    Band 96, Frequenz 96, Leistung 0
    Band 97, Frequenz 97, Leistung 0
    Band 98, Frequenz 98, Leistung 0
    Band 99, Frequenz 99, Leistung 0
    Band 100, Frequenz 100, Leistung 0
    Band 101, Frequenz 101, Leistung 0
    Band 102, Frequenz 102, Leistung 0
    Band 103, Frequenz 103, Leistung 0
    Band 104, Frequenz 104, Leistung 0
    Band 105, Frequenz 105, Leistung 0
    Band 106, Frequenz 106, Leistung 0
    Band 107, Frequenz 107, Leistung 0
    Band 108, Frequenz 108, Leistung 0
    Band 109, Frequenz 109, Leistung 0
    Band 110, Frequenz 110, Leistung 0
    Band 111, Frequenz 111, Leistung 0
    Band 112, Frequenz 112, Leistung 0
    Band 113, Frequenz 113, Leistung 0
    Band 114, Frequenz 114, Leistung 0
    Band 115, Frequenz 115, Leistung 0
    Band 116, Frequenz 116, Leistung 0
    Band 117, Frequenz 117, Leistung 0
    Band 118, Frequenz 118, Leistung 0
    Band 119, Frequenz 119, Leistung 0
    Band 120, Frequenz 120, Leistung 0
    Band 121, Frequenz 121, Leistung 0
    Band 122, Frequenz 122, Leistung 0
    Band 123, Frequenz 123, Leistung 0
    Band 124, Frequenz 124, Leistung 0
    Band 125, Frequenz 125, Leistung 0
    Band 126, Frequenz 126, Leistung 0
    Band 127, Frequenz 127, Leistung 0
    Band 128, Frequenz 128, Leistung 0
    Band 129, Frequenz 129, Leistung 0
    Band 130, Frequenz 130, Leistung 0
    Band 131, Frequenz 131, Leistung 0
    Band 132, Frequenz 132, Leistung 0
    Band 133, Frequenz 133, Leistung 0
    Band 134, Frequenz 134, Leistung 0
    Band 135, Frequenz 135, Leistung 0
    Band 136, Frequenz 136, Leistung 0
    Band 137, Frequenz 137, Leistung 0
    Band 138, Frequenz 138, Leistung 0
    Band 139, Frequenz 139, Leistung 0
    Band 140, Frequenz 140, Leistung 0
    Band 141, Frequenz 141, Leistung 0
    Band 142, Frequenz 142, Leistung 0
    Band 143, Frequenz 143, Leistung 0
    Band 144, Frequenz 144, Leistung 0
    Band 145, Frequenz 145, Leistung 0
    Band 146, Frequenz 146, Leistung 0
    Band 147, Frequenz 147, Leistung 0
    Band 148, Frequenz 148, Leistung 0
    Band 149, Frequenz 149, Leistung 0
    Band 150, Frequenz 150, Leistung 0
    Band 151, Frequenz 151, Leistung 0
    Band 152, Frequenz 152, Leistung 0
    Band 153, Frequenz 153, Leistung 0
    Band 154, Frequenz 154, Leistung 0
    Band 155, Frequenz 155, Leistung 0
    Band 156, Frequenz 156, Leistung 0
    Band 157, Frequenz 157, Leistung 0
    Band 158, Frequenz 158, Leistung 0
    Band 159, Frequenz 159, Leistung 0
    Band 160, Frequenz 160, Leistung 0
    Band 161, Frequenz 161, Leistung 0
    Band 162, Frequenz 162, Leistung 0
    Band 163, Frequenz 163, Leistung 0
    Band 164, Frequenz 164, Leistung 0
    Band 165, Frequenz 165, Leistung 0
    Band 166, Frequenz 166, Leistung 0
    Band 167, Frequenz 167, Leistung 0
    Band 168, Frequenz 168, Leistung 0
    Band 169, Frequenz 169, Leistung 0
    Band 170, Frequenz 170, Leistung 0
    Band 171, Frequenz 171, Leistung 0
    Band 172, Frequenz 172, Leistung 0
    Band 173, Frequenz 173, Leistung 0
    Band 174, Frequenz 174, Leistung 0
    Band 175, Frequenz 175, Leistung 0
    Band 176, Frequenz 176, Leistung 0
    Band 177, Frequenz 177, Leistung 0
    Band 178, Frequenz 178, Leistung 0
    Band 179, Frequenz 179, Leistung 0
    Band 180, Frequenz 180, Leistung 0
    Band 181, Frequenz 181, Leistung 0
    Band 182, Frequenz 182, Leistung 0
    Band 183, Frequenz 183, Leistung 0
    Band 184, Frequenz 184, Leistung 0
    Band 185, Frequenz 185, Leistung 0
    Band 186, Frequenz 186, Leistung 0
    Band 187, Frequenz 187, Leistung 0
    Band 188, Frequenz 188, Leistung 0
    Band 189, Frequenz 189, Leistung 0
    Band 190, Frequenz 190, Leistung 20
    Band 191, Frequenz 191, Leistung 0
    Band 192, Frequenz 192, Leistung 0
    Band 193, Frequenz 193, Leistung 0
    Band 194, Frequenz 194, Leistung 0
    Band 195, Frequenz 195, Leistung 0
    Band 196, Frequenz 196, Leistung 0
    Band 197, Frequenz 197, Leistung 0
    Band 198, Frequenz 198, Leistung 0
    Band 199, Frequenz 199, Leistung 0
    Band 200, Frequenz 200, Leistung 0
    Band 201, Frequenz 201, Leistung 0
    Band 202, Frequenz 202, Leistung 0
    Band 203, Frequenz 203, Leistung 0
    Band 204, Frequenz 204, Leistung 0
    Band 205, Frequenz 205, Leistung 0
    Band 206, Frequenz 206, Leistung 0
    Band 207, Frequenz 207, Leistung 0
    Band 208, Frequenz 208, Leistung 0
    Band 209, Frequenz 209, Leistung 0
    Band 210, Frequenz 210, Leistung 0
    Band 211, Frequenz 211, Leistung 0
    Band 212, Frequenz 212, Leistung 0
    Band 213, Frequenz 213, Leistung 0
    Band 214, Frequenz 214, Leistung 0
    Band 215, Frequenz 215, Leistung 0
    Band 216, Frequenz 216, Leistung 0
    Band 217, Frequenz 217, Leistung 0
    Band 218, Frequenz 218, Leistung 0
    Band 219, Frequenz 219, Leistung 0
    Band 220, Frequenz 220, Leistung 0
    Band 221, Frequenz 221, Leistung 0
    Band 222, Frequenz 222, Leistung 0
    Band 223, Frequenz 223, Leistung 0
    Band 224, Frequenz 224, Leistung 0
    Band 225, Frequenz 225, Leistung 0
    Band 226, Frequenz 226, Leistung 0
    Band 227, Frequenz 227, Leistung 0
    Band 228, Frequenz 228, Leistung 0
    Band 229, Frequenz 229, Leistung 0
    Band 230, Frequenz 230, Leistung 0
    Band 231, Frequenz 231, Leistung 0
    Band 232, Frequenz 232, Leistung 0
    Band 233, Frequenz 233, Leistung 0
    Band 234, Frequenz 234, Leistung 0
    Band 235, Frequenz 235, Leistung 0
    Band 236, Frequenz 236, Leistung 0
    Band 237, Frequenz 237, Leistung 0
    Band 238, Frequenz 238, Leistung 0
    Band 239, Frequenz 239, Leistung 0
    Band 240, Frequenz 240, Leistung 0
    Band 241, Frequenz 241, Leistung 0
    Band 242, Frequenz 242, Leistung 0
    Band 243, Frequenz 243, Leistung 0
    Band 244, Frequenz 244, Leistung 0
    Band 245, Frequenz 245, Leistung 0
    Band 246, Frequenz 246, Leistung 0
    Band 247, Frequenz 247, Leistung 0
    Band 248, Frequenz 248, Leistung 0
    Band 249, Frequenz 249, Leistung 0
    Band 250, Frequenz 250, Leistung 0
    Band 251, Frequenz 251, Leistung 0
    Band 252, Frequenz 252, Leistung 0
    Band 253, Frequenz 253, Leistung 0
    Band 254, Frequenz 254, Leistung 0
    Band 255, Frequenz 255, Leistung 0


also ohne hanning 100% exakt

[ Dieser Beitrag wurde von DariusBrewka am 31.07.2006 um 22:36 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

31.07.2006, 23:01 Uhr

MaikG
Posts: 5172
Nutzer
>Im Aminet gibts es übrigends die easyFFT library, falls du das
>nicht selbst coden willst.

Ist wohl einfacher als den BB oder C code umzusetzten.
Guck ich mir morgen mal an, muss ja auch schnell genug
sein, weil ich tippe ja schnell :-)

[ - Antworten - Zitieren - Direktlink - ]

01.08.2006, 11:16 Uhr

bubblebobble
Posts: 707
Nutzer
@Maik

In welcher Sprache willst du das denn coden ?

@Darius
Das Hanning Fenster bringt nur was, wenn deine Sinus Schwingungen nicht bei 0 anfangen. Wenn du die künstlich berechnet hast, und z.B. bei Sin(0) angefangen hast, dann sind sie schon quasi perfekt, und das Hanning Fenster stört nur. In der Realität bekommst du dein Fenster aber mittenheraus, und dann ist ein Knacks im Fenster der die hohen Frequenzen verwäscht.
128 Punkt FFT ist auch noch sehr ungenau, wobei das in deinem Beispiel schon reichen würde. Es geht ja nur darum, das Signal von anderen Signalen zu unterscheiden.

BTW, wenn das aus dem Stöcker ist wirds schon stimmen. Wundert mich aber. Normalerweise sortiert man die Samples zuerst um, und wendet dann den Butterfly Algorithmus an. Dass es auch umgekehrt geht ist mir neu.


--
Thilo Köhler, Author von:
HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

01.08.2006, 12:10 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Zitat:
Original von bubblebobble:
128 Punkt FFT ist auch noch sehr ungenau, wobei das in deinem Beispiel schon reichen würde. Es geht ja nur darum, das Signal von anderen Signalen zu unterscheiden.


Das mit 128 ist mir schon klar, ich hätte auch mlog2=13 machen können, dann wäre Petra sicherlich nicht so glücklich über die 8192 Zeilen die ich hier hätte angeben müssen.

Zitat:
BTW, wenn das aus dem Stöcker ist wirds schon stimmen. Wundert mich aber. Normalerweise sortiert man die Samples zuerst um, und wendet dann den Butterfly Algorithmus an. Dass es auch umgekehrt geht ist mir neu.

Naja, ich denke das kommt auf den Algorithmus an, wie gesagt beim Stöcker ists Sande-Tukey, aber so genau habe ich mir das nie angeschaut, war nur am Ergebnis interessiert.

[ - Antworten - Zitieren - Direktlink - ]

01.08.2006, 14:55 Uhr

Solar
Posts: 3680
Nutzer
Zitat:
Original von DariusBrewka:

Aber wie dem auch sei, die sagen wir auch wenns 100 pows() sein sollten die dürften selbst auf einem c64er nicht ins Gewicht fallen.


100 double-pow()s gegenüber der gleichen Anzahl Integer-Shifts? Du würdest Dich wundern...


[ - Antworten - Zitieren - Direktlink - ]

01.08.2006, 18:00 Uhr

MaikG
Posts: 5172
Nutzer
>In welcher Sprache willst du das denn coden ?

Maxon Basic, darin läuft ja auch der Rest des Alarmsystems.

[ - Antworten - Zitieren - Direktlink - ]

02.08.2006, 00:02 Uhr

Holger
Posts: 8116
Nutzer
@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.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

02.08.2006, 09:55 Uhr

MaikG
Posts: 5172
Nutzer
>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?


[ - Antworten - Zitieren - Direktlink - ]


-1- 2 3 4 5 6 Letzte [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Tonerkennung [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.