Spektrogramm/Sonagramm zu Audio

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
Zudomon
Establishment
Beiträge: 2257
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Spektrogramm/Sonagramm zu Audio

Beitrag von Zudomon »

Huhu,

ich bin hier wieder am verzweifeln...

Eigentlich würde das Thema eher in Soundprogrammierung (noch besser in Signalverarbeitung) passen, aber den Bereich gibs ja bei uns noch nicht... also Grafik. :lol: Zugrunde liegt ein Audiostream. Dieser wird in ein Spektrogramm/Sonagramm umgewandelt und angezeigt:
sona1.jpg
Um genau zu sein handelt es sich hier um eine Sprachdatei... die hellen Linien sind dabei die Ausprägungen in den einzelnen Frequenzen. Man erkennt ganz gut die einzelnen Buchstaben vom Muster her.

Nun zu meinem Problem. Wenn ich nun diese Darstellung wieder in ein Audiosignal verwandeln will, geht das schief. Ich habe das folgendermaßen gelöst... ich gehe jede Pixelspalte durch und addiere eine Sinuswelle, die mit der entsprechenden Frequenz abläuft. Das Ergebnis wird dann praktischerweise wieder in ein Spektrogramm zur Darstellung umgewandelt, so das Kenner vielleicht erahnen können, was da eventuell falsch läuft:
sona2.jpg
Wie man sehen kann, scheint es, als ob in regelmäßigen Abständen das Singal unterdrückt wird. Ich habe gestern und heute viel rumprobiert, aber kein Indiz gefunden, woran das liegen könnte. Ich dachte zunächst daran, das sich vielleicht die ganzen Sinuskurven ungünstig überlagern, aber es macht keinen Unterschied, in welcher Phase diese starten.

Gruß
Zudo

PS: Auch Linearinterpolation zwischen den Sampels bzw. einfach mal das Maximum der Ausprägung des letzten und nächsten Sampels ändert so gut wie nichts... es muss also ein anderes Phänomen sein.

PPS: Vielleicht würde es auch helfen, wenn man statt Sinuskurven zu addieren, direkt IFFT einsetzt, aber da ist mir noch unklarer, wie das gehen soll. :(
Benutzeravatar
dv
Beiträge: 51
Registriert: 15.09.2002, 17:46
Benutzertext: Ugauga.
Alter Benutzername: dv
Wohnort: Südamerikanischer Dschungel
Kontaktdaten:

Re: Spektrogramm/Sonagramm zu Audio

Beitrag von dv »

Wie erstellst du das Spektrogramm? Mit der FFT? Entspricht hier eine Pixelspalte einer FFT-Ausgabe? Von wo bis wo geht das Frequenzband? Zeigt das Spektrogramm die Betragswerte, Phase, oder irgendwas anderes an? Wird das Nyquist-Kriterium beachtet? Nimmst du für N Samples im angezeigten Frequenzraum N Samples im Ortsraum?

Zusätzlich würd ich mal hier fragen: [url]ttp://www.matheplanet.at/matheplanet/nuke/html/viewforum.php[/url] aber dort bitte schon im ersten Posting obige Fragen beantworten.
hagbard
Beiträge: 66
Registriert: 05.08.2010, 23:54

Re: Spektrogramm/Sonagramm zu Audio

Beitrag von hagbard »

Hallo,

ich nehme einfach mal an dass jede Spalte ein Leistungsdichtespektrum für ein bestimmtes Zeitfenster darstellt?
Wenn du den Code nicht gerade selber geschrieben hast wirst du dieses ja erhalten in dem du irgendeine Bibliothek benutzt welche deine zeitlichen Segmente mittels FFT in den Frequenzraum transformiert und dann dass Betragsquadrat berechnet.
Willst du das Zeitsignal wieder korrekt rekonstruieren (abzüglich numerisch Rundungsfehler), so musst du die IFFT von dem komplexen Spektrogramm (also vor der Betragsquadratsbildung) berechnen und die zeitlichen Segmente wieder richtig überlappen (das ist zumindestens die einfachste Methode). Ich verstehe allerdings nicht ganz für was du dass überhaupt brauchst, willst du im Frequenzbereich filtern?
Benutzeravatar
Zudomon
Establishment
Beiträge: 2257
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Spektrogramm/Sonagramm zu Audio

Beitrag von Zudomon »

Das Spektogramm wird mit FFT erstellt. Dafür werden immer 1024 Sampels benutzt. In der Abbildung war es noch so, dass dann immer um ein paar Sampels verschoben wurde. Das Audiosampel selbst hat 44100 Sampels pro Sekunde. Genauere Angaben kann ich leider nicht machen, weil da einfach die Mathematische kompetenz fehlt.

Habe zum Test jetzt aber 1024 Sampels für die FFT benutzt und wandel die wieder zu 1024 Sampels im Ortsraum um. Wenn ich das über Inverse FFT mache, klappt das auch perfekt. FFT und IFFT sind auch nicht von mir... außerdem hatte ich die Unit schonmal mit einer anderen ausgetauscht, weil ich dachte, sie wäre falsch, aber die andere hatte dann genau das gleiche Spektralbild erzeugt, also bin ich mir sehr sicher, das da alles richtig ist.

Die Grundfrequenz, soweit sollte bei 44100 Sampels und 1024 Sampels für die FFT dann eigentlich bei etwa 43 Hz liegen. Bei dem Versuch, mehrere Sinuswellen einfach übereinanderzulegen erhalte ich folgende ergebnisse:
sona3.jpg
Hier wurden nun Sinuslinien mit 43 Hz, 86 Hz, 129 Hz usw. überlagert, also immer ein Vielfaches von der Grundfrequenz... insgesamt 32 Sinuswellen. Da erhalte ich dann das gleiche seltsame Muster... dieses auf und ab ist auch im Geräusch zu hören, also liegt es auf keinen Fall nur an der Spektrogrammdarstellung.
sona4.jpg
Hier habe ich die Sinuslinien einfach mal um etwa 5000 KHz nach oben geschoben und bei jeder Sinusline eine zufällig Startphase eingefügt. Man erkennt, dass das Fehlerhafte Muster immer noch existiert, nur ebend in jeder Zeile verschoben ist.
sona5.jpg
Hier hab ich dann die Phase wieder entfernt und nur den untersten und obersten Sinus addiert... dadurch entstehen im Spektrogramm zwei Linien, die diese Sinusartefakte nicht aufweisen. So sollte das auch aussehen.
sona6.jpg
Hier nochmal das gleiche wie ebend, nur das 8 der 32 Sinuslinien addiert wurden... auch hier sind noch die Linien Artefaktfrei. Nach etwas rumprobieren bin ich noch zu dem Ergebnis gekommen, dass bei dem Abstand von 43 Hz die Artefakte extrem sind, wenn man 86 Hz nimmt, dann sind die Artefakte kaum vorhanden, und bei 172 Hz nicht mehr existent.
Es ist mir allerdings schleierhaft, wie überlagerte Sinuslinien derlei Artefakte hervorbringen können...

@hagbard
hagbard hat geschrieben:ich nehme einfach mal an dass jede Spalte ein Leistungsdichtespektrum für ein bestimmtes Zeitfenster darstellt?
Wenn du den Code nicht gerade selber geschrieben hast wirst du dieses ja erhalten in dem du irgendeine Bibliothek benutzt welche deine zeitlichen Segmente mittels FFT in den Frequenzraum transformiert und dann dass Betragsquadrat berechnet.
Deine Annahmen sind alle zutreffend :D
Bei der IFFT hab ich das Problem, dass ich zu jedem Wert dann noch ne Phase habe und mir bis jetzt nicht klar ist, wie die dann berechnet würde.
Ziel ist, wie du schon gesagt hast, Filterungen im Frequenzbereich vorzunehmen, aber auch Manipulationen. Außerdem möchte ich Sounds synthetisch erzeugen und vielleicht sogar TTS realisieren. Hinterher kann man es ja auch für STT oder so einsetzen. Naja, aber im Moment scheitere ich schon am ersten Level... dabei dachte ich, gerade aus den Frequenzbändern wieder ein Ausgabesignal zu machen, wäre einfach... :(
Benutzeravatar
Zudomon
Establishment
Beiträge: 2257
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Spektrogramm/Sonagramm zu Audio

Beitrag von Zudomon »

Nach weiteren versuchen stellt sich heraus, dass diese Artefakte wohl doch durch die Fenstergröße im zusammenhang mit der Frequenz entstehen. Allerdings bin ich nun zu der Erkenntnis gekommen, dass man ein solches Spektrogramm nicht einfach durch eine Reihe von Sinusüberlagerungen zurückführen kann.
sona8.jpg
In diesem Bild sieht man die Sinuskurve eindeutig...
sona9.jpg
Nachdem das Spektrogramm wieder zurücktransformiert wird, ensteht ein ganzes gemisch von Sinuskurven, was ja nicht richtig sein kann.
Irgendwo kann ich das nachvollziehen... die Linie im Spektrogramm ist größer als ein Pixel, somit werden auch gleich für andere Frequenzen Sinuswellen erzeugt. Hmmm... man sollte wirklich dieses IFFT verwenden. Aber ich weiß nicht, wie. Wichtig wäre mir ja, dass ich keine Phaseninformation habe, wenn das möglich ist.
hagbard
Beiträge: 66
Registriert: 05.08.2010, 23:54

Re: Spektrogramm/Sonagramm zu Audio

Beitrag von hagbard »

Zudomon hat geschrieben: Hmmm... man sollte wirklich dieses IFFT verwenden. Aber ich weiß nicht, wie. Wichtig wäre mir ja, dass ich keine Phaseninformation habe, wenn das möglich ist.
Das ist die einzig saubere Lösung.
Warum willst/kanst du keine Phaseninformation verwenden? Wenn du dass Signal synthetisch im Zeitbereich erzeugt hast müsstest du die Information eigentlich in irgendeinen Zwischenschritt der Berechnung vorliegen haben. Hast du eine Betrags- und Phasen darstellung so kannst du das komplexe Spektrum erzeugen durch S = Betrag*(exp(j*Phase)). Dabei ist zu beachten, dass das Zweiseitenbetragsspektrum verwendet werden muss (zur Darstellung wird immer nur die vordere Hälfte (0...Nfft/2) angezeigt, weil die hintere Hälfte einfach eine Spiegelung der vorderen ist und keine zusätzlichen Betragsinformationen enthält).

Wenn du Synthese betreibst (ich gehe mal davon aus du nimmst cosinus-Schwingungen dass rechnet sich einfacher) legst tu die Phase phi selber fest.
Für diese gilt phi = 2*pi*f*t0, wobei t0 der Verschiebung des Signals im Zeitbereich entspricht, die du erreichen willst.

Nimme es mir nicht übel aber ich glaube du solltest dich nochmal ein wenig mit den Grundlagen der Signalverarbeitung beschäftigen bevor du weiter versuchst im Trial-und_Error-Verfahren dir dass zu erschliessen.
Benutzeravatar
dv
Beiträge: 51
Registriert: 15.09.2002, 17:46
Benutzertext: Ugauga.
Alter Benutzername: dv
Wohnort: Südamerikanischer Dschungel
Kontaktdaten:

Re: Spektrogramm/Sonagramm zu Audio

Beitrag von dv »

Moment kurz. Überlappende Intervalle hat man doch bei der STFT, nicht bei der FFT? Oder ist gemeint, dass die STFT mittels der FFT umgesetzt worden ist?

EDIT: meine Frage liegt darin begründet, dass 1024 Samples doch nicht alle Frequenzen aus einem 44100Hz-Sampling darstellen können, d.h. ganz tiefe Frequenzen sieht man dann nicht im Spektrogramm, denn die Schwingungen dieser Harmonischen "passen" doch gar nicht in die 1024 Samples, dh eine Periode dieser geht sich darin nicht aus? Ich dachte immer, dass es aus diesen Gründen die STFT gibt?
hagbard
Beiträge: 66
Registriert: 05.08.2010, 23:54

Re: Spektrogramm/Sonagramm zu Audio

Beitrag von hagbard »

Naja er hat ja gesagt dass jede Spalte eine FFT beschreibt und bei der Rücktransformation und anschliessender Rekonstruktion des Zeitsignals muss ich die Segmente wieder genauso überlappen wie ich dass bei der Hintransformation gemacht habe. Im einfachsten Fall gab es weder eine Überlappung noch ein Fenster bei der Hintransformation dann muss man die Samples nur alle hintereinanderhängen.
Es ist richtig dass für tiefe Frequenzen die Harmonischen sich kaum von der Grundwelle separieren lassen da Freq_Zellbreite = Samplingfrequenz / FFT_Länge. Die STFT gibt es aber aus genau den gegenteiligen Grund weil man ein Signal welches seinen Frequenzinhalt ändert darstellen will. Würde man eine lange FFT Anwenden wäre die Information über den zeitlichen Verlauf verloren. Macht man die Segmente sehr kurz wird die Frequenzauflösung sehr schlecht man muss also immer einen Kompromiss eingehen. (Heisenberg lässt grüßen)
Benutzeravatar
dv
Beiträge: 51
Registriert: 15.09.2002, 17:46
Benutzertext: Ugauga.
Alter Benutzername: dv
Wohnort: Südamerikanischer Dschungel
Kontaktdaten:

Re: Spektrogramm/Sonagramm zu Audio

Beitrag von dv »

Ah richtig, es wird die Auflösung geringer. Ich habs falsch in Erinnerung gehabt - nämlich, dass in so einem 1024er-Block Frequenzen unterhalb einer gewissen Schwelle gar nicht dargestellt werden.
Ein weiteres Problem mit der langen FFT sehe ich auch in der Dauer, die es braucht, um eine zu kriegen. Will ich eine komplette Darstellung des Frequenzraumes, muss ich Samples für die Dauer von einer Sekunde im Ortsraum aufnehmen. Das ist für ein Spektrumanalyzer, der quasi ne "Spur" hinterlässt, vielleicht nicht SO schlimm, aber für einen Analyzer wie bei Stereoanlagen ists fatal - die Balken würden sich nur 1x pro Sekunde ändern. Unschön. Nehm ich halt breitere Balken (-> Samples im Frequenzraum decken mehr Frequenzen ab), die Anzeige ist ungenauer, dafür aktualisiert sie sich schneller.
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4263
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Spektrogramm/Sonagramm zu Audio

Beitrag von Chromanoid »

btw soweit ich mich an unser letztes chatgespräch erinnere willst du damit doch text to speech machen oder?
in diesem zusammenhang könnte
http://de.wikipedia.org/wiki/Vocaloid
was sein...
Eindrucksvolle Demos der Technologie:
http://www.zero-g.co.uk/media/mp3/q/e/V ... Gounod.mp3
http://www.zero-g.co.uk/media/mp3/l/7/T ... grima1.mp3
http://www.zero-g.co.uk/media/mp3/e/9/Sonika_Says.mp3

Die berechnen soweit ich das verstanden habe aus den Sonogrammen erst mal Ausgabe-Funktionen...
Benutzeravatar
Zudomon
Establishment
Beiträge: 2257
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Spektrogramm/Sonagramm zu Audio

Beitrag von Zudomon »

Leider kann ich nicht viel mitreden, weil ich keinen Plan habe. :(

@Hagbard
hagbard hat geschrieben:Nimme es mir nicht übel aber ich glaube du solltest dich nochmal ein wenig mit den Grundlagen der Signalverarbeitung beschäftigen bevor du weiter versuchst im Trial-und_Error-Verfahren dir dass zu erschliessen.
Eigentlich hast du recht. Bisher habe ich nur kleine Fetzen aus dem Bereich aufgeschnappt. Erst als ich den Thread erstellt habe, hatte ich aufgeschnappt, dass es sich dabei um Singalverarbeitung handelt. Also für mich ist das alles absolutes Neuland.
Übrigens hast du ne PN :D

@Chromanoid
Die Beispiele sind super! Ich hätte nicht gedacht, dass sich das schon so authentisch anhören kann, aber ich bezweifle, dass ich erkennen würde, dass es synthetisch ist. Aber vielleicht liegt es auch an der Sprache, dass mir feine fehlerhafte Nuance nicht auffallen würden.
Das mit dem Text To Speech stimmt... ich würde das gerne irgendwann realisieren, in der Hoffnung, das einigermaßen hinzubekommen. Sonst müssen wohl doch Synchronsprecher herhalten. :lol:
Antworten