Wie interpoliert Audacity bei der Spektrum-Analyse?

  • Hi,


    beim Export der Daten der Spektrum-Analyse ist mir aufgefallen, dass Audacity auch Frequenzen entdeckt, die mit der eingestellten Auflösung gar nicht gefunden werden können. Wie können diese Werte so genau interpoliert werden, würde mich brennend interessieren?!
    Ich sitze grade an meiner Diplomarbeit und entwickle eine Anwendung, die Töne in Echtzeit erkennen können soll, aber je genauer die Auflösung der FFT ist, desto weniger trifft die Eigenschaft "in Echtzeit verarbeitet" noch darauf zu. Eine Interpolationstechnik wie sie Audacity benutzt wäre da vielleicht genau das richtige für meine Zwecke.


    Ich habe diese Frage auch schon im Audacity-Wiki in der How Audacity works-Section gestellt, aber da es darauf bisher noch keine Reaktion gab, dachte ich mir, versuche ich auch nochmal hier.


    Vielen Dank im Voraus!

  • Ich weiß nicht genau, wie die Interpolation hier funktioniert (wahrscheinlich B-Splines oder ähnliches), aber da Audacity Open Source ist, kannst Du Dir ja einfach den Source-Code anschauen.


    Übrigens: zu dem von Dir formulierten Thema habe ich vor ewigen Zeiten mal eine Jugend-Forscht-Arbeit geschrieben :) Mein Programm konnte Töne und auch Dreiklänge in Echtzeit erkennen. Ich habe es damals so gemacht, dass ich auch die Obertöne mit einbezogen habe. Da diese von der Frequenz her höher liegen, hat man eine wesentlich bessere Auflösung. Wenn man dann so einen Oberton direkt lokalisiert hat, kann man durch Halbierung der Frequenz "nach unten schauen", um zu sehen, ob es sich um einen Oberton handelt oder einen Grundton. Das kann man auch von den Beträgen der einzelnen Frequenzen abhängig machen.


    Wenn Du möchtest, kann ich mal schauen, ob ich die Arbeit und/oder den Quellcode dazu noch finde.


    Ein Nachteil meines damaligen Ansatzes war, dass ich das Frequenzspektrum in statische Frequenzbänder aufgeteilt habe, die den entsprechenden Grundtönen entsprechen. Jetzt ist ja aber ein Ton nicht nur ein "Strich" im Frequenzspektrum, sondern eher ein "Berg" mit einem Bauch. Ein besserer Ansatz wäre, die "Berge" selbst zu interpolieren anhand einer Filterfunktion. Dabei muss man natürlich berücksichtigen, dass sich einzelne Berge evtl. überschneiden.


    Andere Frage: Kennst Du das schon: http://www.celemony.com/cms/index.php?id=dna Ich habe bis jetzt davon leider nur das Demo gesehen, aber so richtig glauben tu ich das erst, wenn ich die Software selbst benutzt habe. Ich glaube zwar nicht, dass das Demo selbst ein Fake ist, könnte mir aber vorstellen, dass es einen Grund hat, warum sie ausgerechnet ein Gitarrenstück verwenden. Stellt sich die Frage, ob das bei einem fertigen Mix mit verschiedenen Instrumenten mit viel Hall und Effekten etc. drauf noch genauso gut funktioniert...

  • Hi Markus,
    danke für deine schnelle Antwort. Ich hab mir nun den Sourcecode von Audacity besorgt.
    Allerdings ging das nur mit der Beta-Version 1.3.5 weil die Version 1.2.6 nicht downloadbar war (jedenfalls nicht gestern und heute).
    Naja, nun kämpfe ich mich durch dieses riesige Projekt, um zu finden was ich suche. Bisher ohne Erfolg, aber ich hatte auch nicht erwartet, dass es leicht sein würde.


    Ich wäre sehr interessiert an deiner Jugend-Forscht-Arbeit und würde mich freuen wenn du mir nen Blick gestatten würdest. Vielleicht bringt es mich ja auf neue Ideen. Mit der Qualität der Tonerkennung bin ich ja schon ganz zufrieden, aber es wäre natürlich toll, wenn ich die gleiche Qualität auch mit weniger Samples für die Analyse hinbekommen würde.


    Dieses Direct-Note-Access Video hab ich mir schon irgendwann mal angesehen. Sieht echt verdammt beeindruckend aus, was man damit alles machen kann.Auch vom Interface her scheint es sich recht intuitiv zu gestalten. Naja mal abwarten.


    Gruß,
    Christian

  • Also falls es irgendwann mal jemand ausser mir interessieren sollte:
    Audacity verwendet Cubic Interpolation. Genauer nachzulesen ist das Verfahren in der Datei Audacity/src/FreqWindow.cpp und zwar in den Funktionen
    - GetProcessedValue(float, float)
    - CubicInterpolate(float, float, float, float, float)
    - CubicMaximize(float, float, float, float)


    GetProcessedValue() ruft dabei CubicInterpolation() zur Bestimmung des
    interpolierten dB-Wertes auf und CubicMaximize() wird verwendet, um den
    Spitzen-Wert in x-Achsenrichtung zu interpolieren.