Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: Mathematik und Physik ::  FMOD Fourier     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
xmf
Unregistrierter




Beitrag xmf Unregistrierter 18:32:53 17.01.2012   Titel:   FMOD Fourier            Zitieren

Hallo,

ich habe mir mithilfe der FMOD-Library ( in C++) das Spektrum mithilfe der FFT von einem Audiostream geholt.

Nun habe ich aber folgendes Problem:

Das Spektrum fällt exponentiell (?) ab von den Tiefen Frequenzen zu den hohen. (Ist ja soweit auch logisch, falls ich mich nicht täusche, da die Oberfrequenzen viel geringer in die Wichtung fallen)

Gibt es eine Möglichkeit das Spektrum zu linearisieren?



Grüße xmf
krümelkacker
Mitglied

Benutzerprofil
Anmeldungsdatum: 10.08.2010
Beiträge: 1581
Beitrag krümelkacker Mitglied 18:57:46 17.01.2012   Titel:              Zitieren

Was meinst Du denn damit? Ich kann mit dem Wort „liniarisieren“ in dem Kontext nichts anfangen…


Zuletzt bearbeitet von krümelkacker am 18:59:28 17.01.2012, insgesamt 1-mal bearbeitet
xmf
Unregistrierter




Beitrag xmf Unregistrierter 19:08:11 17.01.2012   Titel:              Zitieren

Ja, der Begriff ist hier sicherlich falsch in der Anwendung, ich probiere es mal andersherum:

Ich habe folgendes vor:

Mithilfe des Fourierspektrums möchte ich bestimmte Effekte in eienr graphsichen Anwendung auslösen.

Die Effekte sollen durch bestimmte Ton-Frequenzen getriggert werden

z.b. bei Bässen verwischt das Bild und bei hohen Tönen tritt eine Rotation ein.

Wie kann ich aus dem Fourier-Spektrum ablesen, was hohe und tiefe Töne sind?
drakon
Mitglied

Benutzerprofil
Anmeldungsdatum: 28.01.2008
Beiträge: 6824
Beitrag drakon Mitglied 19:17:07 17.01.2012   Titel:              Zitieren

Grundsätzlich bedeuten ja Werte, die weiter vom Mittelpunkt entfernt sind höhere Frequenzen und nähere bedeuten kleine Frequenzen. Ob da das mapping zu hoch/tiefen Tönen so direkt geht weiss ich jetzt nicht, aber ich denke das geht schon in etwa gut.
Kenne FT halt eher von der Bildbearbeitung.

_________________
Blog: www.drakon.ch
Tachyon
Mitglied

Benutzerprofil
Anmeldungsdatum: 03.12.2003
Beiträge: 3268
Beitrag Tachyon Mitglied 13:05:07 18.01.2012   Titel:              Zitieren

Das hängt etwas davon ab, wie die FFT den Output organisiert. Die meisten Algorithmen packen in die ersten FFT-Länge/2 Bins die positiven Frequenzen und danach dann (bei reellen Eingangsdaten) spiegelverkehrt die negativen Frequenzen.
Wenn z.B. Deine FFT-Länge 1024 beträgt und der Output ein Array aus komplexen Werten (!) ist, dann liegt das positive Spektrum im Indexbereich von 0..511.
Ob das bei der FMOD-Lib so gehandhabt wird, weiß ich nicht. Da müsstest Du mal in die Doku gucken.
Die Transformation an sich ist linear. Häufig muss man allerdings mit der FFT-Länge normieren. Das hängt aber wieder von der Implementierung ab.
Wenn das Ergebnis bei Dir in den hohen Frequenzen abfällt, dann ist evtl. der Input bereits irgendwie gefiltert.

_________________
タキオン
PhilippHToner
Mitglied

Benutzerprofil
Anmeldungsdatum: 12.01.2012
Beiträge: 109
Beitrag PhilippHToner Mitglied 14:25:34 18.01.2012   Titel:              Zitieren

Hallo,

fft bedeutet eigentlich nur "schnelle Transformation". Welche konkrete Implementierung genommen wurde hängt vom Entwickler ab. Eine mögliche (und wahrscheinliche) Implementierung ist der Cooley-Tukey FFT, basierend auf dem Radix-2 Algorithmus. Anzahl der Inputs = Anzahl der Outputs und nur vielfache von 2, also 2x.

Die Ausgabe hat folgende Eigenschaften:
- Imaginärwerte sind punktsymmetrisch zur Mitte
- Realwerte sind achsensymmetrisch zur Mitte

Interpretation (linken N/2 Werte für x <=N/2)
- x-Wert ist die normierte Frequenz
- Betrag der komplexen Zahl (sqrt(Re*Re+Im*Im)) ist die Amplitude (Radius des erzeugenden Kreises)
- Argument ist die Phaseverschiebung

Dass nur die linken Werte interpretiert werden können liegt an dem Nyquist-Theorem, dass du mit N Samples nur die Frequenzen 0...N/2 bestimmen kannst. Ein Frequenz f könnte nämlich genauso eine falsch-interpretierte Frequen N-f sein, deshalb die symmetrischen Eigenschaften.


Beispiel:
N=64 Anzahl der Samples
s[N] Samplewerte

w(n) = 2π * n / N
s[i] = sin(w(i)*1.0) + sin(w(i)*2.0) + sin(w(i)*4.0) + sin(w(i)*8.0) + sin(w(i)*16.0)

Also eine Überlagerung mit einer Schwingung mit Periodenlänge 64 Samples, eine Schwingung mit 32 Samples Periodenlänge, also zwei Perioden, usw... bis zur Schwingung mit Periodenlänge 4 Samples und 16 Perioden.

Die fft mit cooley-tukey bringt mir dann einen Ausschlag bei Sample 1,2,4,8,16 und symmetrisch bei N-1, N-2, N-4, N-8, N-16. Letztere sind die "falschen" Frequenzen, die wir hier ignorieren.

Hier sieht man dann auch, dass man keine Frequenzen mit einer Periodendauer unter zwei Samples darstellen kann, weil sonst keine Schwingung erkennbar ist.

Also:
|X[i]| ist die Amplitude, Im{X[i]} die Phasenverschiebung der normierten Frequenz die i Perioden hat.

Willst also bei einem Lied die Bässe z.B. bis 100Hz haben, 44,1kHz Abtastung,
Dann mach eine FFT mit einer Länge, sodass der erste Bin für die Freqenzen bis 100Hz zuständig ist. D.h. du brauchst insgesamt 44100 / 100 Balken, also 441 Samples. Bei Cooley-tukey dann also 512 Samples, also hat dein erster Bin 44100Hz/512 Bandbreite = 0-86Hz, oder du nimmst halb so viel, dann hat dein erster Bin 44100Hz/256 Bandbreite = 176 Hz.

Viel Spass damit, ich hoffe ich konnte helfen.
gruß Philipp
Tachyon
Mitglied

Benutzerprofil
Anmeldungsdatum: 03.12.2003
Beiträge: 3268
Beitrag Tachyon Mitglied 15:07:30 18.01.2012   Titel:              Zitieren

PhilippHToner schrieb:
...

Einiges ist richtig, vieles ist aber auch falsch.
Warum ich auf der Implementierung rumreite hat folgenden Grund:
Manche Bibliotheken ordenen das Ergebnis neu an. Zum Beispiel ist es recht üblich, dass ein sogenannter fft-shift durchgeführt hat, bei dem die negativen Frequenzen gespiegelt und vorne angefügt werden. Manche Bibliotheken bieten hierfür auch extra Funktionen an. Außerdem gibt es Unterschiede in der Normierung. Wenn es Dir auf den Pegel des Signals ankommt, dann brauchst Du diese Information.

Falsche Frequenzen gibt es nicht. Das ein reelles Spektrum spiegelsymetrisch um 0 ist liegt nicht an falsch interpretierten Frequenzen. Es liegt daran, dass nicht bestimmbar ist, in welche richtung die Phase läuft. Betrachtest Du das ganze in der komplexen Ebene kannst Du also, von einem bestimmten Observationszeitpunkt ausgehend, für ein reelles Signal nicht sagen, ob der Drehzeiger im oder gegen den Urzeiger läuft. Nichtsdesotrotz sind weder die negativen Frequenzen noch die positiven Frequenzen falsch. Es ist sogar so, dass sich die Energie des Signals gleichmäßig auf den positiven Anteil und den negativen Anteil verteilt. Ohne den negativen Teil würde Dir bei einer Rücktransformation die Häfte der ursprünglich im Signal vorhandenen Energie flöten gehen.

_________________
タキオン


Zuletzt bearbeitet von Tachyon am 09:53:52 19.01.2012, insgesamt 3-mal bearbeitet
PhilippHToner
Mitglied

Benutzerprofil
Anmeldungsdatum: 12.01.2012
Beiträge: 109
Beitrag PhilippHToner Mitglied 16:18:08 18.01.2012   Titel:              Zitieren

Das ist genau das, was ich irgendwie in den online-Dokumenten (wikipedia oder math. Skripten von Hochschule) vermisse. Jeder rechnet und toll ist alles, aber irgendwie mal das Ergebnis deuten oder analysieren tut keiner. Zudem wissen wir hier irgendwie immernoch nicht, wie die Reihenfolge im Ergebnis ist.

Also ich habe nochmal meine fft Implementierung getestet und die zeigt Folgendes (N=64 Samples):
w(i)=2*pi*i/N

1. x[i]=sin(w(i)*31.0), gerade noch machbar => Ausschlag bei X[31] = (0.0, 0.5) (analog dazu bei X[33]=(0.0,-0.5) )
2. x[i]=sin(w(i)*48.0), außerhalb des möglichen Frequenzbereichs => X[15] = (0.0, 0.5), X[47] = (0.0, -0.5) )

Ich verstehe ehrlich gesagt nicht, wieso es keine Realteile gibt, obwohl es lauter "nicht-phasenverschobene" Schwingungen sind, hmmm.

gruß Philipp
Tachyon
Mitglied

Benutzerprofil
Anmeldungsdatum: 03.12.2003
Beiträge: 3268
Beitrag Tachyon Mitglied 16:46:50 18.01.2012   Titel:              Zitieren

Erzeugst Du zufällig ein analytisches (complexes) Signal? In manchen Mathematikprogrammen (Matlab z.B.) darfst Du i und j nicht als Variable benutzen, weil diese die imaginäre Einheit repräsentieren. Bei analytischen Signalen ist die Phasenbeziehung immer eindeutig, weshalb Du rein positive oder rein negative Spektren bekommst, je nach Vorzeichen der Phase.

_________________
タキオン


Zuletzt bearbeitet von Tachyon am 09:54:09 19.01.2012, insgesamt 4-mal bearbeitet
pumuckl
Moderator

Benutzerprofil
Anmeldungsdatum: 21.06.2005
Beiträge: 6577
Beitrag pumuckl Moderator 10:00:10 19.01.2012   Titel:              Zitieren

Da es hier offenbar eher um die mathematischen Details als um die Programmiertechnik geht seid ihr hoffentlich einverstanden, wenn ich die Diskussion ins Matheforum verfrachte ;)

_________________
Du brauchst Hilfe? - Kleines Einmaleins der Forenregeln.
When your hammer is C++, everything begins to look like a thumb. (Steve Haflich)
C++ Forumbot
Forumbot

Benutzerprofil
Anmeldungsdatum: 29.02.2004
Beiträge: 16160
Beitrag C++ Forumbot Forumbot 10:00:21 19.01.2012   Titel:              Zitieren

Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ (auch C++0x, bzw. C++11) in das Forum Mathematik und Physik verschoben.

Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?


Dieses Posting wurde automatisch erzeugt.

_________________
Besuchen Sie unsere Bücherecke.
http://www.c-plusplus.de/bucher.php
Mit jeder Bestellung unterstützen Sie das Forum.
PhilippHToner
Mitglied

Benutzerprofil
Anmeldungsdatum: 12.01.2012
Beiträge: 109
Beitrag PhilippHToner Mitglied 10:30:55 19.01.2012   Titel:              Zitieren

Nöö, also ich rede hier nur C++ Code, den ich halt mathematisch dargestellt hab, aber die fft wird ja richtig gefüttert. Komplexes Eingangssignal ohne Imaginärteil.

Ich habe jetzt mal hier ein Bilderalbum angelegt, weil dieses "ins Leere Gerede" ohne Bild glaube ich nichts nützt. Hier mal die ffts:
http://www.funpic.de/fotos/philipphtoner/1/80397

gruß Philipp
Tachyon
Mitglied

Benutzerprofil
Anmeldungsdatum: 03.12.2003
Beiträge: 3268
Beitrag Tachyon Mitglied 11:01:54 19.01.2012   Titel:              Zitieren

PhilippHToner schrieb:
Nöö, also ich rede hier nur C++ Code, den ich halt mathematisch dargestellt hab, aber die fft wird ja richtig gefüttert. Komplexes Eingangssignal ohne Imaginärteil.

Ich habe jetzt mal hier ein Bilderalbum angelegt, weil dieses "ins Leere Gerede" ohne Bild glaube ich nichts nützt. Hier mal die ffts:
http://www.funpic.de/fotos/philipphtoner/1/80397

gruß Philipp

Und wo fehlen da jetzt die positiven Frequenzen? Ist doch alles in Butter. Oder verstehst Du nicht, wieso der Realteil fehlt? Erzeuge mal das Signal mit cos anstatt sin. Dann fehlt plötzlich Der Imaginärteil. Erzeuge mal ein Signal, und lass die Phase bei w/4 starten. Dann hast Du plätzlich sowohl Re als auch Im.
Und nun guck Dir mal den Transformationskern der DFT an und überlege, wo das her kommt. Außerdem nochmal zum Recherchieren: Was gibt die Beziehung zwischen Re und Im wieder?

_________________
タキオン


Zuletzt bearbeitet von Tachyon am 11:25:05 19.01.2012, insgesamt 4-mal bearbeitet
PhilippHToner
Mitglied

Benutzerprofil
Anmeldungsdatum: 12.01.2012
Beiträge: 109
Beitrag PhilippHToner Mitglied 11:24:26 19.01.2012   Titel:              Zitieren

Ich weiß nicht, was die Beziehung zwischen Re und Im wiedergibt. Ich dachte, der Im-Teil gibt die Phase an, wo der sin startet, deshalb verstehe ich nicht, wieso ein stinknormaler sin( w(i) * f + 0.0*π) ohne Phase in der Spektralansicht bei Im=0.5 hat.
Tachyon
Mitglied

Benutzerprofil
Anmeldungsdatum: 03.12.2003
Beiträge: 3268
Beitrag Tachyon Mitglied 11:34:57 19.01.2012   Titel:              Zitieren

PhilippHToner schrieb:
Ich weiß nicht, was die Beziehung zwischen Re und Im wiedergibt. Ich dachte, der Im-Teil gibt die Phase an, wo der sin startet, deshalb verstehe ich nicht, wieso ein stinknormaler sin( w(i) * f + 0.0*π) ohne Phase in der Spektralansicht bei Im=0.5 hat.

Die DFT ist eine reversible Transformation. Das heisst, alle Infos, welche Du im Zeitbereich hast, müssen sich auch im Frequenzbereich irgendwo verstecken.
Im Zeitbereich hast Du Amplitude, Frequenz und Phase. Im Frequenzbereich hast Du direkt Sichtbar erstmal nur Frequenz und Amplitude. Aber irgendwo muss sich auch noch die Phaseninformation verstecken. Sonst könnest Du keine volständige phasenkorrekte Rücktransformation machen (solche Sachen wie Overlap-Add/Safe wären dann nicht möglich). Die Phaseninformation steckt also Im Verhätnis von Re und Im (die Phaseninformation kann man in der komplexen Ebene daher auch sehr schön am Winkel ablesen).

_________________
タキオン


Zuletzt bearbeitet von Tachyon am 11:36:22 19.01.2012, insgesamt 1-mal bearbeitet
PhilippHToner
Mitglied

Benutzerprofil
Anmeldungsdatum: 12.01.2012
Beiträge: 109
Beitrag PhilippHToner Mitglied 13:46:14 19.01.2012   Titel:              Zitieren

Okay, ich glaub ich hab es jetzt soweit gecheckt. Ich brauch lediglich die Polarform der komplexen Zahlen. Das einzige, was mich verwirrt hat, war, dass durch den Winkel jetzt das Fließkommazahlen-Flimmern zum Vorschein kommt, weil sowas wie atan2(Im, Re) dann interessante Werte geben. Aber ich sollte das glaub ich nicht hernehmen, weil atan2(0.0, 0.0) eigentlich schon wieder nicht mehr definiert ist.
Gregor
Moderator

Benutzerprofil
Anmeldungsdatum: 16.01.2002
Beiträge: 7514
Beitrag Gregor Moderator 03:21:38 20.01.2012   Titel:              Zitieren

xmf schrieb:

Ich habe folgendes vor:

Mithilfe des Fourierspektrums möchte ich bestimmte Effekte in eienr graphsichen Anwendung auslösen.

Die Effekte sollen durch bestimmte Ton-Frequenzen getriggert werden

z.b. bei Bässen verwischt das Bild und bei hohen Tönen tritt eine Rotation ein.

Wie kann ich aus dem Fourier-Spektrum ablesen, was hohe und tiefe Töne sind?

Jenseits davon, dass Du Dir natürlich frequenzabhängige Schwellwerte suchen kannst, solltest Du glaube ich generell mit Wavelets arbeiten, um so das zeitliche Auftreten der jeweiligen Frequenzen am besten bestimmen zu können.

_________________
"The problem with quotes on the Internet is that it is hard to verify their authenticity" - Abraham Lincoln


Zuletzt bearbeitet von Gregor am 03:21:54 20.01.2012, insgesamt 1-mal bearbeitet
c2010
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.06.2010
Beiträge: 5
Beitrag c2010 Mitglied 11:07:41 29.01.2012   Titel:              Zitieren

schau dir diesen beispiel an: http://www.codeproject.com/Articles/14873/Simple-Audio-Out-Oscilloscope-and-Spectrum-Analyze
C/C++ Forum :: Mathematik und Physik ::  FMOD Fourier   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.