Matlab Fouriertransformation < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Hallo,
ich beschäftige mich gerade mit einer Studienarbeit zur absorptionsgradmessung. Dabei habe ich in Matlab ein Sinussweep eingelesen. Diesen möchte ich nun mit einem gleitenden Fenster fenstern und auf die Fenster jeweils eine FFT ausführen. anschließend sollen alle "Fenster" wieder zu einem Signal zusammengefügt werden. Hat vielleicht jemand eine Idee, wie man das lösen könnte?
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
|
|
|
|
Hallo danlaurence,
kannst du genauer beschreiben, was du vorhast? Mir ist nicht ganz klar, was du willst. Möchtest du eine FFT von Teilmengen deiner Daten vornehmen.
Was bedeutet 'Sinussweep einlesen' ? Heisst das, dass du ein 'Sample' einer Sinusschwingung mit steigender Frequenz als Vektor vorliegen hast?
Hugo
|
|
|
|
|
Hallo Hugo,
vielen Dank für deine Antwort. Prinzipiell geht es mir darum:
Es geht um Absorptionsgradmessung. Von einem Lautsprecher wird ein Signal ausgesendet, das sich an der Wand reflektiert und von einem Messmikro wieder "eingefangen" wird. Dabei beinhaltet dieses Ausgangssignal einen Sweep, dass ist, wie du vermutest ein 10 Sekunden langes Sample mit konstanter Amplitude, das von 50Hz bos 20kHz durchläuft (manche bezeichnen das auch als chirpsignal).
Mittels FFT kann man nun aus dem bekannten Ausgangssignal und dem vom Messmikro aufgezeichneten Signal den Reflexionsfaktor und damit Absorptionsgrad errechnen. Das Matlabprogramm dazu habe ich fast fertig. Es wird dabei eine Fensterfunktion über das Signal gelegt, womit jeweils 1024 Abtastpunkte in einem Fenster liegen , fouriertransformiert werden und in einen neuen Vektor geschrieben werden. Das habe ich schon so weit gelöst. Das hauptproblem besteht nun in der Aufnahme.
Ich arbeite bei den Signalen mit Wavedateien, d.h. sowohl original, alsauch aufgezeichnete Mikroantwort liegen als 16Bit wav vor. wenn ich aber von diesen Signalen die fouriertransformierte anschau entstehen Nullstellen im Frequenzband, die da eigentlich nicht sein dürfen, weil der Sweep alle Frequenzen beinhaltet. Nun weiß ich nicht woran das liegt. Ich vermute das Problem liegt in der wav-codierung, die Matlab nicht richtig erkennt oder wie auch immer. Durch die Nullstellen verzerrt sich der Reflexionsgrad dermaßen, das eigentlich nichts genaues mehr dabei raus kommt.
verwende ich einen mit Matlab generierten Sweep und nicht mein normales Signal, dann erhalte ich in der Fouriertransformierten ein klares Spektrum ohne Nullstellen.
Hast du da vielleicht eine Idee, woher die Nullstellen kommen könnten??
schönen gruß
dan
|
|
|
|
|
Hallo Dan,
danke dass du mir das mit dem Matlab-Sweep geschrieben hast. Damit ist nahezu ausgeschlossen, dass es z.B. an deiner Fenstergröße liegt. Du solltest dennoch in Erwägung ziehen, die Dauer des Sweeps zu verdoppeln und gleichzeitig auch die Fenstergröße. 1024 Samples sind ja nur 23,2 Millisekunden lang, was einer Frequenz von 43 Hz entspricht.
Natürlich braucht du keine volle Schwingung zur Fourier-Analyse, aber für hohe Frequenzen gehen die meiner naiven Ansicht nach einfach die Samples aus. (Ich bin aber leider kein Experte in Signalverarbeitung, bin nur Musiker, der ab und zu mal mit Wavelab gearbeitet hat.)
Andererseits spricht gegen diese Theorie wie schon eingangs erwähnt, dass der Matlab-Sweep korrekt bearbeitet wird.
Wahrscheinlicher ist, dass eine physikalische Ursache für dieses Phänomen vorliegt. Auch hier empfehle ich einen langsameren Sweep, denn in 10 Sekunden durchläufst du immerhin 8,6 Oktaven, d.h. fast eine Oktave pro Sekunde. Ein langsamerer Sweep grenzt die Nullstellen evtl. besser ein.
Versuche die Position des Mikros einmal sehr wenig und einmal ein bisschen mehr zu verändern und schau nach, ob das Problem immer noch besteht, bzw ob sich die kritischen Frequenzen verschieben. Vielleicht liegt es an Reflexionen, die zu Interferenz führen.
Du kannst evtl. vorhandene Interferenzmuster stören, indem du den Versuch durch einen geeignet dimensionierten Gegenstand störst. Je nach Größe deines Versuchsaufbaus kann das ein Taschentuch, eine Jacke oder ein anderes Objekt sein, das du seitlich in die Verbindungslinie Lautsprecher-Wand-Mikro bringst.
Vielleicht kannst du eine Skizze deines Versuchsaufbaues online stellen und auch deine 'unerwünschten' Resultate präsentieren.
Nimmst du übrigens Stereo auf oder kannst du Stereo aufnehmen?
Dann könntest du zwei Signale gleichzeitig aufnehmen und sie getrennt auf ihr Spektrum untersuchen. Damit kannst du den Einfluss der Mikro-Position besser untersuchen.
Das waren so meine Ideen zu der Sache. Probier doch mal an deinem Versuch rum, vielleicht sind diese Nullstellen ja sogar physikalisch sinnvoll.
Hugo
|
|
|
|
|
Hallo Hugo,
danke für deine Antwort.
Also aufgenommen habe ich noch gar nichts. Ich versuche zunächst anhand von Computergenerierten sweeps das Programm zu erstellen mit dem ich dann später messen kann. Ich glaube ich habe auch die Ursache gefunden, die zu den komischen Ergebnissen führt.
Und zwar scheint die FFT in Matlab nicht richtig zu arbeiten. Ich lese das Signal in Matlab ein und führe dann mit dem Befehl fft (signal) die Transformation durch.
Eigentlich sollten doch in der Fouriertransformierten alle Frequenzen von 0-20000Hz mit der gleichen Amplitude vorhanden sein (weil ich ja einen sweep verwende, der eben diese Frequenzen in gleicher Amplitude enthält).
Schaue ich mir aber nun die Fouriertransformierte in Matlab an zeigt sich, das einige Frequenzen eine Amplitude nahe Null aufweisen, was aber eigentlich nicht sein darf (denk ich zumindest). Diese Minima treten manchmal regelmäßig (und zwar in den Abständen der Fenstergröße), meist aber ohne bestimmtes Muster auf.
GLaubst du, dass der Fehler mit einem längeren sweep gelöst werden kann, oder gibt es in Matlab andere Möglichkeiten eine "genauere" FFT durchzuführen, bzw. mache ich da bei der Transformation schon etwas falsch?
|
|
|
|
|
Hallo danlaurence,
Wie Hugo schon geschrieben hat muss deine Fensterung zu den gesuchten Frequenzen passen. Die höchste Frequenz ergibt sich aus der Größe des Fensters und die niedrigste aus dem Abtastabstand. Das Signal sollte außerdem über das gesamte Fenster "da" sein. Verwendest Du die Beträge der (komplexen) Fouriertransformierten(auch PSD) so ist das Ganze gegen Verschiebung des Signals invariant. Die reellen (komplexen) Anteile sind dies nicht. Die Ursache könnte also daran liegen das die Frequenzen deines sweeps nicht durch die verwendete Fouriertransformation dargestellt werden können. Das die FFT von Matlab nicht exakt arbeitet würde ich mal ausschließen.
gruß
mathemaduenn
|
|
|
|
|
Hallo,
danke für eure Hilfe. Die Lösung des Problems war zum einen ein gleitendes Fenster, dass aber beim "Gleitvorgang" zu den hohen Frequenzen hin kleiner wird und zwar so, das immer die richtige Frequenz getroffen wird.
Theoretisch klappt das alles recht gut, leider nur mit idealen Signalen, die ich mir mit wavelab zusammengebaut habe.
Gestern war ich im Studio und habe erste Messungen durchgeführt und da kommt wie nicht anders zu erwarten nur sch*** raus. Ich habe zunächst festgestellt, das die Entfernung des Messmikros zur Wand egal ist und erst bei Entfernung >30cm erkennbare Fehler auftreten.
Zur Messung: Ich führe im Raum eine Pseudofreifeldmessung durch (Mikro in die Raummitte, Lautsprecher 2m Abstand - nur so zum Testen).
Danach gehe ich mit dem Mikro an die Wand (10cm Abstand, Lautsprecher 2m von der Wand weg), das ergibt meine 2. Messung.
Anschließend wird das Signal aus der 1. Messung vom 2.Signal abgezogen, um den Dirketschall zu elleminieren. Dadurch hab ich die erste Reflexion und die Diffusschalle. Letztere sollten durch meine Fensterung eleminiert werden.
Nun werden beide Signale fouriertransformiert und dividiert. Dadurch erhalte ich den Absorptionsgrad.
Problem: im Messfall war dieser bei den meisten Messungen unter 0 was ja nich sein darf.
Ich führe das darauf zurück, das der Direktschall in den Aufnahmen der 1. und 2. Messung eine unterschiedliche Amplitude hat, was aber eigentlich nach meiner Messmethode nicht sein darf.
Ich werde heut nochmal ins Studio gehen und versuchen herauszufinden wo die genauen Ursachen liegen.
Hat vorab vielleicht schon jemand eine Idee woran das liegen kann?
danke
dan
|
|
|
|
|
Hallo Dan,
für mich hört sich ein negativer Absorptionsgrad nach kostruktiver Interferenz an.
Du musst sicherstellen, dass du mit deinem Mikrofon ausschließlich den reflektierten Schall aufnimmst. Wenn du den Direktschall mit aufnimmst, kannst du die Messung vergessen.
Schall ist ja bekanntlich ein Schwingungsphänomen, d.h. es gibt nicht nur die Amplitude, die du Messung willst, sondern auch noch eine Phase.
Ich vermute, dass du bei den Frequenzen zu den negativen Werten jetzt einfach konstruktive Interferenz zwischen Direkt- und Reflexions-Schall bei der zweiten Messung hattest.
Umgekehrt gibt es bestimmt auch Frequenzen mit besonders hohem Absorptionsgrad, die müssten ungefähr mittig dazwischen liegen.
Hugo
|
|
|
|
|
Hallo Hugo,
ist es überhaupt möglich ne Messung zu machen ohne das ich den Direktschall drin habe?
Ich habe glaub ich auch npch eine Möglichkeit gefunden woher die Inteferenzen kommen. Um den Dirketschall rauszufiltern verwende ich ne einfache Subtraktion, heißt gemessene Wandantwort minus Originalsignal. Problem: da ich das bei der Aufnahme der Messsignale nich exakt schaffe die beiden Signale zu synchronisieren, muss ich dies dann in Wavelab/Samplitude tun. Allerdings reicht da schon 1 Abtastwert Abweichung aus, so das die Subtraktion nicht mehr funktioniert und dadurch die negativen Absorptionsgrade entstehen.
Ich habe kürzlich etwas über die Autokorrelation und deren Möglichkeiten gelesen Echos, bzw überlagerte Signale in einem Summensignal zu erkennen (es wird dann glaub ich die zeitl. Differenz der Signale angezeigt, anhand derer sich ja dann eine Synchronisation durchführen lässt).
Geht das?
schönen Gruß
dan
|
|
|
|
|
Hallo Dan,
dieses Verfahren ist mir nicht bekannt, deswegen kann ich dir über dessen Verwendbarkeit keine Auskunft geben.
Ich habe aber eine andere Idee:
Du verwendest ja immer noch diesen Sweep. Das ist zwar ne gute Idee, aber so langsam denke ich, dass dieses Vorgehen (mit Verlaub) ziemlich bescheuert ist.
Musst du das so machen?
Wenn nein, dann greif dir lieber einige Frequenzen raus, sagen wir von 50Hz bis 20kHz immer um den Faktor [mm] \sqrt[3]{2}\approx1,26 [/mm] gesteigert.
Damit hast du 27 Messfrequenzen, für die du das Reflexionsverhalten untersuchen kannst.
Für jede Frequenz führst du an sagen wir 10 verschiedenen Positionen deine Messung durch und zwar einmal nur die Direktschallamplitude und anschließend die Direkt+Reflexionsamplitude.
Durch die verschiedenen Positionen kannst du die Interferenzeffekte herausmitteln z.B. indem du den Mittelwert oder den Median deiner zehn Messamplituden nimmst. Die Variation der Amplitude um diesen Mittelwert ist ja (hoffentlich) gerade die Amplitude des reflektierten Signals.
Kannst du mir folgen?
Wenn du so vorgehen darfst, dann vergiss mal deinen Sweep und konzentrier dich mal auf eine solche Messung bei 500Hz (ist eine nicht allzu unangenehme Frequenz). Wenn es klappt, dass du die Amplitude des reflektierten Signals bestimmen kannst, dann kannst du es ja für alle Frequenzen machen.
Du kannst diesen Versuch außerdem noch auf eine andere Art testen:
ersetze die reflektierende Wand durch eine zweite Schallquelle, die dasselbe Signal aussendet wie deine eigentliche Quelle. Die zweite Quelle sollte natürlich leiser als die ursprüngliche sein und spiegelbildlich zur ersten bezüglich der nichtvorhandenen Wand stehen, so als wäre sie eine imaginäre Schallquelle.
Es läuft analog dazu, dass bei der Reflexion von Licht imaginäre Lichtquellen vorkommen! Die Amplituden von Quelle und vorgetäuschtem Echo kannst du ja leicht bestimmen (achte darauf, dass das Anschließen eines zweiten Lautsprechers nicht die Lautstärke des ersten mindert; evtl lass immer beide laufen und steck den unerwünschten Lautsprecher in eine relativ schallundurchlässige Verpackung)
Da du beide Ampituden kennst, muss bei dem von mir vorgeschlagenen Versuch dann ja als Reflexionsschallamlpitude die vom künstlichen Echo herauskommen.
Hugo
|
|
|
|