mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Fast Fourier Transform


Autor: tuddel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi @ all

ich brauchte da mal etwas hilfe. ich will eine audioquelle auf ihre
frequenz hin untersuchen...
die fft methode (hab ich mir sagen lassen) ist hierfür ideal. nur...
ich habe keinen blassen schimmer, wie sie funktioniert. ich finde nur
immer irgend einen fortran code, den ich nicht lesen kann und so etwas
wie eine blanke "step by step" formel kann ich auch nicht (bei
google) finden :-(

kann mir da jemand helfen?

: Verschoben durch Admin
Autor: tobias hofer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo

grundsätzlich:

die fft ist ein effizienter algorithmus um die dft (diskrete fourier
transformation) schnell auszuführen. den fft algorithmus musst du
sicherlich nicht selbst "neu programmieren" das gibt es hunderte bsp.
auf dem netz. einfach mal nach radix2 + fft suchen.

-es wäre noch interessant zu wissen wo du die analyse machen willst,
auf einem pc oder mikroprozessor?
-was für einen auflösung hat dein audio signal?
-wie viele punkte möchtest du analysieren?
-muss das "echtzeit" sein
-welche programmiersprache?

wenn du einfach ein array mit den werten deiner audioquelle hast und
das ganze auf einem pc analysieren willst, brauchst du nicht unbedingt
die fft. da kannst du auch einfach die dft programmieren und das wäre
dann mit ca 8 zeilen code geschafft. einfach mal nach
"dft" suchen.

ich habe für mich eine fft und dft für den pc progbrammiert aber visual
basic.

gruss tobias

Autor: tuddel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, es soll...

...auf einen x86 ca 500Mhz (C3 prozessor) laufen
...eine linux applikation werden
...mit einer auflösung von cd-qualität klar kommen
...in echtzeit ablaufen
...c/c++ (gcc syntax)
...als quelle dient der "line in" einer soundkarte

Autor: tobias hofer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dann würde ich auf jeden fall die fft benutzen. suchst am besten mal
nach "fft radix2" algorithmus. da findest du sicherlich was.

als eingangsparamter für die fft hast du dann ein array mit den
zeit-diskreten samples als retour wert bekommst du dann ein array mit
den realen und ein array mit dem imaginärenteil. daraus kannst du dann
die frequenzwerte und deren phase berechnen.

tobias

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist zwar Code für Win32, aber das wesentliche solltest Du den
Sourcen dennoch entnehmen können:

http://www.codeproject.com/audio/waveInFFT.asp

Etliche weitere Links spuckt unser Freund google aus, wenn er mit
"win32 fft audio spectrum" gefüttert wird - statt win32 könnte man ja
auch "linux" eingeben und sich an noch mehr Links erfreuen.

Nu mach ma'

Autor: Sebastian S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da gibts schon was:
http://www.fftw.org

Das kann man benutzen und auch relativ sicher sien,d as was sinnvolles
raus kommt :)

Außerdem wird man es nie im Leben schneller hinbekommen. Ich zumindest
nicht -- die Jungs haben mehr drauf :)

Autor: juniorone (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo, das würde mich auch interessieren.

bitte an tobias hofer, kannst du mit dein prog mit VB schicken.wäre
sehr dankbar.
mfg
juniorone

Autor: tobias hofer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
falls dich nur die fft interessiert:

http://www.fullspectrum.com/deeth/programming/vb.html

ist nicht meine seite aber ein sehr gutes bsp. für einen audioanalyzer
in visual basic.

falls dich die dft interessiert musst dich halt nochmals melden.

gruss tobias

Autor: juniorone (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die dft würde mich auch interessieren.
mfg
juniorone

Autor: tobias hofer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hier die dft funktion in vb. die dft erledigt das selbe wie die fft halt
nur viel langsamer.

'dft
Function dft(RealIn() As Double, n As Long)

Dim m As Integer
Dim z As Integer
Dim rsum As Double
Dim isum As Double
Dim spect(4096) As Double

    rsum = 0
    isum = 0
    For m = 0 To n / 2 - 1 Step 1
        For z = 0 To n - 1
            rsum = RealIn(z) * Cos(2  Pi  m * z / n) + rsum
            isum = RealIn(z) * Sin(2  Pi  m * z / n) + isum
        Next
        spect(m) = Sqr(rsum ^ 2 + isum ^ 2) 'betrag berechnen
        rsum = 0
        isum = 0
    Next

End Function

gruss tobias

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.