19_Raven_89 Geschrieben 9. Juni 2009 Geschrieben 9. Juni 2009 Hallo! Bin neu auf diesem Forum.... Habe folgendes Problem: Ich programmiere für die abschlussprüfung ein Stimmgerät mit JAva in eclipse. Den Sound aufzunehmen war ja noch ganz einfach, dank des Java Sound API's , doch die ermittlung der Frequenz macht mir zu schaffen...... Wie kann ich nun die Frequnez aus dem gerade aufgezeichneten gesamplten sound, berechnen???:confused: HAbe da mal etwas über FFt (FAST FOURIER TRANSFORMATION-> ich glaub so heißt es ) doch kapier das nicht..... :upps Bin über jeden beitrag dankbar! Toll wären Code-bsp. Zitieren
chollay Geschrieben 10. Juni 2009 Geschrieben 10. Juni 2009 Ich hab folgenden Code gefunden: import java.awt.*; double[][] fft_1d( double[][] array ) { double u_r,u_i, w_r,w_i, t_r,t_i; int ln, nv2, k, l, le, le1, j, ip, i, n; n = array.length; ln = (int)( Math.log( (double)n )/Math.log(2) + 0.5 ); nv2 = n / 2; j = 1; for (i = 1; i < n; i++ ) { if (i < j) { t_r = array[i - 1][0]; t_i = array[i - 1][1]; array[i - 1][0] = array[j - 1][0]; array[i - 1][1] = array[j - 1][1]; array[j - 1][0] = t_r; array[j - 1][1] = t_i; } k = nv2; while (k < j) { j = j - k; k = k / 2; } j = j + k; } for (l = 1; l <= ln; l++) /* loops thru stages */ { le = (int)(Math.exp( (double)l * Math.log(2) ) + 0.5 ); le1 = le / 2; u_r = 1.0; u_i = 0.0; w_r = Math.cos( Math.PI / (double)le1 ); w_i = -Math.sin( Math.PI / (double)le1 ); for (j = 1; j <= le1; j++) /* loops thru 1/2 twiddle values per stage */ { for (i = j; i <= n; i += le) /* loops thru points per 1/2 twiddle */ { ip = i + le1; t_r = array[ip - 1][0] * u_r - u_i * array[ip - 1][1]; t_i = array[ip - 1][1] * u_r + u_i * array[ip - 1][0]; array[ip - 1][0] = array[i - 1][0] - t_r; array[ip - 1][1] = array[i - 1][1] - t_i; array[i - 1][0] = array[i - 1][0] + t_r; array[i - 1][1] = array[i - 1][1] + t_i; } t_r = u_r * w_r - w_i * u_i; u_i = w_r * u_i + w_i * u_r; u_r = t_r; } } return array; Quelle: http://www.nauticom.net/www/jdtaft/JavaFFT.htm Author: Jeffrey D. Taft, PhD. Ich schaue mir das heute Abend mal an, da ich auch an einem digitalen Stimmgerät interssiert bin. Soll es ein ganz normaler Tuner werden? CDEFGAHC? Gruß Chollay Zitieren
19_Raven_89 Geschrieben 10. Juni 2009 Autor Geschrieben 10. Juni 2009 Danke für schnelle Anwort!!! :uli nein sollte hauptsächlich für die egitarre und e-bass gedacht sein die frequenzen wären evtl. falls es dich interessiert: E -> 82,4 Hz A -> 110 Hz D -> 146,83 Hz G -> 196 Hz H -> 246,94 Hz E -> 329,63 Hz Bass: E 41hz A 55 D 73,42 G 98 Zitieren
19_Raven_89 Geschrieben 10. Juni 2009 Autor Geschrieben 10. Juni 2009 Habe auch was gefunden.. soll sehr einfach sein laut autor (einfachere variante von FFt) Fun with Java, Understanding the Fast Fourier Transform (FFT) Algorithm funktioniert auch bekomme jedoch keine schöne periode aber ich probier dies mal mit meiner gitarre und direktanschluss(Line-IN),nicht mit mic und schau mal was dabei rauskommt. ich lass von mir hören wenns geklappt hat Zitieren
19_Raven_89 Geschrieben 12. Juni 2009 Autor Geschrieben 12. Juni 2009 Hallo! Habe es mit meinem FFT- algorithmus probiert jedoch ist dieser sehr langsam. Für 1sec Aufnahme mit 44700 samples brauch er ca. 7 min ...... auch wenn ichs auf threads auslagere....... also fürs stimmgerät nicht geeignet @Chollay Frage Wie verwende ich die double matrix? Ich habe nur ein byte Array das mein signal beinhaltet. :confused: Zitieren
flashpixx Geschrieben 12. Juni 2009 Geschrieben 12. Juni 2009 (bearbeitet) Wie verwende ich die double matrix? Ich habe nur ein byte Array das mein signal beinhaltet. :confused: Eine Matrix ist im Gegensatz zu einem Array 2-dimensional. Du kannst zwar Dein Byte Array in eine Matrix oder auch Array vom Typ float bringen, aber ich sehe davon nicht aktuell den Nutzen, bzw. zu Deinen Daten, denn Du hast ein zeitabhängiges Signal (somit 1D) Ich möchte Dir einmal den Hinweis zu dem Wikipedia Artikel geben Fourier-Transformation ? Wikipedia Generell solltest Du nicht irgendwas einsetzen, wovon Du denkst, dass es das ist, was Du benötigst. Die DFT (diskrete FT) kann Dir aus Deinen Daten, die entsprechenden Frequenzen abbilden, oder zu den Amplituden die Frequenzen. Die FT liefert Dir somit eine globale Sicht auf das Frequenzspektrum Deiner Funktion (analog dazu ein Wavelet für lokale). Es gibt verschiedene Implementierungen dazu z.B. für C/C++ GSL - GNU Scientific Library - GNU Project - Free Software Foundation (FSF) mit Hilfe anderer Libs kann man dann die passenden Datenstrukturen effizient implementieren Boost C++ Libraries Dir nützt aber die schnellste Implementierung nichts, wenn Du die zugrunde liegenden Mathematik nicht verstehst, denn einfach Daten in eine Library reinstecken und zu hoffen, dass das heraus kommt, was man will, wird nicht funktionieren. Du solltest Dich erst einmal mit der Mathematik auseinander setzen. Zusätzlich würde ich mir auch, wenn Du nur eine visuelle Darstellung Deiner Frequenzen brauchst auch über die Datenmenge und das Sampling (Stichwork Sampling Theorem) Gedanken machen. Phil Bearbeitet 12. Juni 2009 von flashpixx Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.