Vor einiger Zeit habe ich verschiedene Möglichkeiten ausprobiert , um digitale Wellenformen zu zeichnen , und eines der Dinge, die ich versucht habe, war, sie anstelle der Standard-Silhouette der Amplitudenhüllkurve eher wie ein Oszilloskop anzuzeigen. So sehen Sinus und Rechteck auf einem Oszilloskop aus:
Der naive Weg dazu ist:
- Teilen Sie die Audiodatei im Ausgabebild in einen Teil pro horizontalem Pixel auf
- Berechnen Sie das Histogramm der Probenamplituden für jeden Block
- Zeichnen Sie das Histogramm nach Helligkeit als Pixelspalte
Es erzeugt so etwas:
Dies funktioniert gut, wenn es viele Samples pro Chunk gibt und die Frequenz des Signals nicht mit der Sampling-Frequenz zusammenhängt, aber nicht anders. Wenn die Signalfrequenz beispielsweise ein genaues Submultiple der Abtastfrequenz ist, treten die Abtastungen in jedem Zyklus immer mit genau den gleichen Amplituden auf, und das Histogramm besteht nur aus wenigen Punkten, obwohl das tatsächlich rekonstruierte Signal zwischen diesen Punkten vorhanden ist. Dieser Sinuspuls sollte so glatt sein wie der obige, aber nicht, weil er genau 1 kHz beträgt und die Abtastungen immer um die gleichen Punkte erfolgen:
Ich habe Upsampling versucht, um die Anzahl der Punkte zu erhöhen, aber es behebt das Problem nicht, sondern hilft nur, die Situation in einigen Fällen zu glätten.
Was ich also wirklich möchte, ist eine Möglichkeit, die wahre PDF (Wahrscheinlichkeit gegen Amplitude) des kontinuierlich rekonstruierten Signals aus seinen digitalen Abtastwerten (Amplitude gegen Zeit) zu berechnen . Ich weiß nicht, welchen Algorithmus ich dafür verwenden soll. Im Allgemeinen ist das PDF einer Funktion die Ableitung ihrer Umkehrfunktion .
PDF von sin (x):
Aber ich weiß nicht, wie ich das für Wellen berechnen soll, bei denen die Inverse eine mehrwertige Funktion ist , oder wie ich es schnell machen soll. Brechen Sie es in Zweige auf und berechnen Sie die Umkehrung von jedem, nehmen Sie die Ableitungen und addieren Sie sie alle zusammen? Aber das ist ziemlich kompliziert und es gibt wahrscheinlich einen einfacheren Weg.
Dieses "PDF mit interpolierten Daten" ist auch auf einen Versuch anwendbar, eine Schätzung der Kerndichte einer GPS-Spur durchzuführen. Es hätte ringförmig sein sollen, aber da es nur die Samples betrachtete und die interpolierten Punkte zwischen den Samples nicht berücksichtigte, sah das KDE eher wie ein Buckel als wie ein Ring aus. Wenn wir nur die Proben kennen, ist dies das Beste, was wir tun können. Aber die Proben sind nicht alles, was wir wissen. Wir wissen auch, dass es einen Pfad zwischen den Samples gibt. Für GPS gibt es keine perfekte Nyquist-Rekonstruktion wie für bandbegrenztes Audio, aber die Grundidee gilt weiterhin, mit einigen Vermutungen in der Interpolationsfunktion.
quelle
Antworten:
Interpolieren Sie auf ein Mehrfaches der ursprünglichen Rate (z. B. 8x überabgetastet). Dadurch können Sie ein stückweise lineares Signal annehmen. Dieses Signal weist verglichen mit der kontinuierlichen sin (x) / x-Interpolation der Wellenform mit unendlicher Auflösung einen sehr geringen Fehler auf.
Angenommen, jedes Paar überabgetasteter Werte weist eine durchgehende Linie von einem Wert zum nächsten auf. Verwenden Sie alle Werte zwischen. Auf diese Weise erhalten Sie eine dünne horizontale Schicht von y1 bis y2, die in einer PDF-Datei mit beliebiger Auflösung akkumuliert werden kann. Jede rechteckige Wahrscheinlichkeitsscheibe muss auf einen Bereich von 1 / nsamples skaliert werden.
Die Verwendung der Linie zwischen Samples anstelle des Samples selbst verhindert ein "spitzes" PDF, selbst wenn eine grundlegende Beziehung zwischen der Sampling-Periode und der Wellenform besteht.
quelle
Was ich mitmachen würde, ist im Wesentlichen Jason Rs "Random Resampler", der wiederum eine vorab abgetastete signalbasierte Implementierung von Yodas stochastischem Sampling ist.
Ich habe eine einfache kubische Interpolation auf einen zufälligen Punkt zwischen zwei Samples angewendet. Für einen primitiven Synth-Sound (der von einem gesättigten, nicht bandbegrenzten, quadratischen Signal + geraden Harmonischen zu einem Sinus abfällt) sieht das so aus:
Vergleichen wir es mit einer höher abgetasteten Version,
und der seltsame mit der gleichen Abtastrate, aber ohne Interpolation.
Bemerkenswertes Artefakt dieser Methode ist das Überschwingen im quadratischen Bereich, aber so würde auch das PDF des sinc-gefilterten Signals (wie gesagt, mein Signal ist nicht bandbegrenzt) aussehen und die wahrgenommene Lautstärke viel besser wiedergeben als die Spitzen, wenn dies ein Audiosignal wäre.
Code (Haskell):
rand list
ist eine Liste von Zufallsvariablen im Bereich [0,1].quelle
stochasticAntiAlias
Davon sind die oberen gelben Punkte . Aber die Version mit der höheren Stichprobe ist in beiden Fällen in der Tat eine einheitliche Rate.Während Ihr Ansatz theoretisch korrekt ist (und für nicht-monotone Funktionen leicht modifiziert werden muss), ist es äußerst schwierig, die Inverse einer generischen Funktion zu berechnen. Wie Sie sagen, müssen Sie sich mit Verzweigungspunkten und Verzweigungsschnitten befassen, was machbar ist, aber Sie würden es ernsthaft nicht wollen.
Wie Sie bereits erwähnt haben, werden bei der regelmäßigen Stichprobenerhebung die gleichen Punkte erfasst. Daher kann es in Regionen, in denen keine Stichprobenerfassung durchgeführt wird, zu schlechten Schätzungen kommen (auch wenn das Nyquist-Kriterium erfüllt ist). In diesem Fall hilft auch die Probenahme über einen längeren Zeitraum nicht.
Wenn Sie sich mit Wahrscheinlichkeitsdichtefunktionen und Histogrammen befassen, ist es im Allgemeinen eine viel bessere Idee, in Bezug auf stochastische Stichproben zu denken als in Bezug auf reguläre Stichproben (siehe die verknüpfte Antwort für eine Einführung). Durch stochastisches Abtasten können Sie sicherstellen, dass jeder Punkt die gleiche Wahrscheinlichkeit hat, "getroffen" zu werden, und eine viel bessere Methode zum Schätzen des PDFs darstellt.
Sie können leicht erkennen, dass es, obwohl es verrauscht ist, eine viel bessere Annäherung an die tatsächliche PDF-Datei darstellt als die auf der rechten Seite, die in mehreren Intervallen Nullen und in mehreren anderen große Fehler anzeigt. Wenn Sie eine längere Beobachtungszeit haben, können Sie die Varianz in der rechten verringern und schließlich an der Grenze großer Beobachtungen zur exakten PDF-Datei (gestrichelte schwarze Linie) konvergieren.
quelle
Kernel-Dichteschätzung
Eine Möglichkeit, das PDF einer Wellenform zu schätzen, besteht in der Verwendung eines Kernel-Dichteschätzers .
Update: Interessante Zusatzinformationen.
So eine Vermutung an , was Sie aftermight alle die PDF - Dateien der einzelnen Fourier - Komponente zusammen zu falten sein:
Es sind jedoch weitere Überlegungen erforderlich!
quelle
Wie Sie in einem Ihrer Kommentare angedeutet haben, wäre es attraktiv, das Histogramm des rekonstruierten Signals nur mit den Samples und dem PDF der sinc-Funktion zu berechnen, die bandbegrenzte Signale interpoliert. Leider glaube ich nicht, dass dies möglich ist, da das Histogramm des Sinc nicht alle Informationen enthält, die das Signal selbst enthält. Alle Informationen zu den Zeitbereichspositionen, an denen jeder Wert angetroffen wird, gehen verloren. Dies macht es unmöglich zu modellieren, wie sich die skalierte und die zeitverzögerte Version des sinc summieren würden, was Sie wünschen würden, um das Histogramm der "kontinuierlichen" oder der aufwärts abgetasteten Version des Signals zu berechnen, ohne dies tatsächlich zu tun Upsampling.
Ich denke, Sie haben die Interpolation als beste Option. Sie haben einige Probleme angedeutet, die Sie daran gehindert haben, dies zu tun. Ich denke, sie können behoben werden:
Rechenaufwand: Dies ist natürlich immer ein relatives Problem, abhängig von der spezifischen Anwendung, für die Sie dies verwenden möchten. Basierend auf dem Link, den Sie zur Galerie der von Ihnen gesammelten Renderings gepostet haben, gehe ich davon aus, dass Sie dies für die Visualisierung von Audiosignalen tun möchten. Unabhängig davon, ob Sie sich für eine Echtzeit- oder eine Offline-Anwendung interessieren, möchte ich Sie ermutigen, einen Prototyp eines effizienten Interpolators zu erstellen und zu prüfen, ob dieser wirklich zu kostspielig ist. Polyphasen-Resampling ist eine gute Methode, die flexibel ist (Sie können jeden rationalen Faktor verwenden).
quelle
Sie müssen das Histogramm glätten (dies führt zu ähnlichen Ergebnissen wie mit einer Kernelmethode). Wie genau die Glättung durchgeführt werden muss, muss experimentiert werden. Möglicherweise könnte dies auch durch Interpolation erfolgen. Neben der Glättung werden Sie meiner Meinung nach auch bessere Ergebnisse erzielen, wenn Sie Ihre Wellenform so upsamplen, dass die Sampling-Frequenz „erheblich höher“ ist als die höchste Frequenz in Ihrem Eingang. Dies sollte in dem "schwierigen" Fall helfen, in dem eine Sinuswelle so mit der Abtastfrequenz zusammenhängt, dass nur wenige Bins im Histogramm gefüllt werden. Im Extremfall sollte eine ausreichend hohe Abtastrate zu schönen Plots ohne Glättung führen. Daher sollte Upsampling in Kombination mit einer Art Glättung zu besseren Plots führen.
Sie geben ein Beispiel für einen 1-kHz-Ton an, bei dem die Darstellung nicht Ihren Erwartungen entspricht. Hier ist mein Vorschlag (Matlab / Octave-Code)
Für Ihren 1000Hz-Ton erhalten Sie dies
Sie müssen lediglich den Ausdruck upsampling_factor nach Ihren Wünschen anpassen.
Immer noch nicht 100% sicher, was genau Ihre Anforderungen sind. Bei Verwendung des oben beschriebenen Prinzips des Upsamplings und der Glättung erhalten Sie dies für den 1-kHz-Ton (mit Matlab erstellt). Beachten Sie, dass das Rohhistogramm viele Bins mit Null Treffern enthält.
quelle