7 Stimmen

Ein Vorkommen eines WAV-Samples innerhalb eines anderen WAV-Samples finden?

Ist es möglich, mit der FFT ein Vorkommen eines kleinen wav-Samples innerhalb einer längeren wav-Datei zu finden, wenn bekannt ist, dass genau dieses Sample irgendwo in der wav-Datei vorhanden ist (aber möglicherweise mit anderen Klängen vermischt ist)?

modifier

(nach Erhalt von zwei Antworten): Was ist, wenn ich eine Bibliothek mit allen bekannten Klängen habe, die in einer größeren WAV-Datei enthalten sein können, und ich möchte das Vorkommen jedes dieser Klänge in dieser WAV-Datei finden? Mit anderen Worten, ich weiß cada mögliche Geräusche, die in die große wav-Datei gemischt werden können, und möchten deren Vorkommen finden?

5voto

endolith Punkte 23212

Es kommt darauf an, was genau Sie suchen und wo Sie es finden wollen.

  • Wenn Sie nach einem Sample suchen, das Bit für Bit genau mit einem Teil einer größeren WAV-Datei übereinstimmt, können Sie direkt nach den Werten suchen.
  • Wenn es sich um genau denselben Sound handelt, der aber nicht samplegenau ist (z. B. beim Abgleich eines MP3-Clips mit einer WAV-Datei desselben Songs), können Sie ihn leicht mit Kreuzkorrelation . Die Kreuzkorrelation kann erheblich beschleunigt werden, wenn eine FFT-Methode anstelle einer "naiven" Methode verwendet wird, bei der die Stichproben explizit multipliziert und summiert werden.
  • Wenn Sie ein kurzes Sample suchen, das mit anderen Geräuschen gemischt wurde, kann die Kreuzkorrelation vielleicht trotzdem verwendet werden, aber es hängt davon ab, ob die anderen Geräusche die Übereinstimmung beeinflussen. Bei einem Digitalpiano mit einfachen Samples und ohne Effekte, das direkt in einen digitalen Rekorder eingespielt wird, könnte dies funktionieren.
  • Wenn der Klang jedoch in irgendeiner Weise gefiltert, umgepolt oder phasenverschoben wurde, funktioniert dies nicht sehr gut, da die Wellenformen verändert werden. Wenn das Klavier also über Lautsprecher gespielt und dann mit Mikrofonen aufgenommen wurde, ist dies keine brauchbare Lösung.

Was in diesem Fall besser funktionieren könnte, ist die Erstellung einer Spektrogramm der Aufzeichnung mit der Taste Kurzzeit-Fourier-Transformation (STFT) und ein Spektrogramm des gesuchten Objekts und führen dann eine zeitliche Kreuzkorrelation der beiden Bilder durch. Das Spektrogramm ist ein 2D-Bild der Amplitude des Klangspektrums über die Zeit, das Sie dann abgleichen können. (Das ist wahrscheinlich ein Umweg über etwas, für das es speziellere Algorithmen gibt, aber ich weiß nicht, wie sie heißen).

Können Sie irgendwo ein paar Soundclips hochladen?

3voto

Matthias Wandel Punkte 6183

Ich nehme an, dass Sie mit exakt nicht stichprobenwertgenau meinen. Wäre es stichprobenwertgenau, dann wäre es eine einfache Angelegenheit, nach den Stichprobenwerten zu suchen, was schnell und effizient ist.

Wenn Sie nach Klangteilen suchen, die einen Beitrag leisten, ist es am besten, einen mathematischen Prozess namens "Faltung" zu verwenden. Im Grunde genommen nehmen Sie das Sample, das Sie innerhalb des großen Samples finden wollen, stellen es neben das große Sample und korrelieren es. Tun Sie dies für jede Probenposition. Auf diese Weise erhalten Sie eine Kurve, die an den Stellen, an denen sich die Probe befindet, deutliche Ausschläge aufweist. Das ist recht rechenintensiv, aber die Computer sind inzwischen recht schnell, so dass es machbar ist.

Dabei wird jedoch davon ausgegangen, dass die Probe in beiden Fällen von derselben Aufnahme stammt. Wenn man einen Schlagzeugsound, selbst denselben, von zwei verschiedenen Orten aus aufnimmt, ergibt das keine sehr gute Korrelation.

Ich hoffe, das hilft.

0voto

Paul Sonier Punkte 37609

Nicht genau so, wie Sie es definiert haben, wenn es mit anderen Klängen gemischt wird, und hier ist der Grund: Betrachten Sie die Wirkung einer Welle, die genau mit ihrem Gegenteil gemischt wird; das Ergebnis ist eine flache Reaktion. Das Mischen von Wellen kann eine monotone Funktion haben, d.h. eine Welle mit einer anderen so zu maskieren, dass die erste nicht mehr wiederzuerkennen ist.

Abgesehen davon gibt es wahrscheinlich eine Möglichkeit, die "Signatur" einer Welle so zu charakterisieren, dass sie in einer resultierenden zusammengesetzten Wellendatei wahrscheinlich vorhanden ist, aber diese Signatur würde von der Länge der Wellendatei und bis zu einem gewissen Grad davon abhängen, welche Art von Kombinationen erwartet werden, um sie zu bearbeiten.

Ihre Frage hat wahrscheinlich etwas damit zu tun, ob Muster eines Werks in einem anderen, zusammengesetzten Werk vorhanden sind. Im Allgemeinen sind FFTs nützlich, um eine "Signatur" für eine bestimmte Welle zu bestimmen und diese "Signatur" aus einer anderen Welle zu extrahieren; sie sind gut für einige Dinge (z. B. Frequenzverschiebung; sie zeigt sich einfach als Verschiebung auf der FFT), aber nicht so gut für andere Dinge (z. B. variierende Frequenzmodulation; hohe (oder ungleichmäßige) Bandbreitenkompression des Originalsignals). Um es anders auszudrücken: FFTs sind eine gute Möglichkeit, die "naive" Verwendung von Samples zu erkennen, aber ein entschlossener Resampler kann das ursprüngliche Sample so verändern, dass es mit der FFT schwer zu erkennen ist, wenn er weiß, dass dies die verwendete Erkennungstechnik ist.

0voto

AAA Punkte 4858

Wenn Sie die genaue Beschaffenheit der Probe kennen (Länge in Bits usw.), ist es sehr gut möglich. Wenn es sich in irgendeiner Weise verändert, haben Sie zunächst eine Menge Arbeit zu erledigen.

Aufgrund der Art und Weise, wie WAV-Dateien kodiert werden (sequentiell nach Spuren - Sie erhalten also die erste Bitmenge der ersten Spur, dann die erste Bitmenge der zweiten Spur und dann die zweite Bitmenge der ersten Spur)

Dies kann natürlich für beliebig viele Spuren wiederholt werden. Wenn Sie wissen, dass die gesuchte WAV-Datei speziell in einer dieser Spuren kodiert ist, können Sie jede Spur isolieren und Operationen an ihnen durchführen.

Wenn sich Ihr Sample durch Geschwindigkeit, Tempo, Tonhöhe usw. unterscheidet, hat es natürlich auch eine andere Bitsignatur, so dass Sie die Spuren normalisieren müssen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X