Verlangsamen Sie die Musikwiedergabe unter Beibehaltung der Frequenz

10

Wenn Sie ein Musikstück mit einer langsameren Geschwindigkeit abspielen, wird die Tonhöhe (Frequenz) verringert. Gibt es ein Werkzeug und eine Theorie, um das Abspielen von Songs zu verlangsamen, während die Frequenz gleich bleibt? Ich nehme an, man kann eine Fourier-Transformation mit Fenster oder eine Wavelet-Transformation durchführen. Es scheint, dass man entweder die Fenstergröße vorab auswählen oder die Wavelet-Basis dynamisch auswählen muss. Gibt es dafür eine spezifische und detaillierte Theorie und Anwendung?

Hans
quelle
1
Weitere Informationen finden Sie zusätzlich zu der unten angegebenen Antwort unter diesem Link .
A_A

Antworten:

5

Ja, einige von uns können es tun, Sie können beschleunigen oder verlangsamen, ohne die Tonhöhe zu beeinflussen, einige Leute nennen diese Anwendungen von Time Stretch, es gibt verschiedene Möglichkeiten, dies zu tun, Sie können es im Frequenzbereich oder im Zeitbereich tun, Sie müssen wählen Was für Sie am besten ist, finden Sie einige Vor- und Nachteile von jedem.

Zeitbereich:

Im Zeitbereich können Sie einige Techniken ausprobieren wie:

  • TDHS (Time Domain Harmonic Sacaling)
  • SOLA (Synchronous Overlap Add)
  • PSOLA (Pitch Synchronous Overlap Add)
  • WSOLA (Wellenformähnlichkeitsüberlappung hinzufügen)

Vorteile: Ist schnell, einige Algorithmen sind leicht zu verstehen, gute Qualität in monophonen Klängen.

Nachteile: Im Allgemeinen benötigen Sie eine sehr schöne Tonhöhenspur, um an der richtigen Position zu spleißen. Dies ist schwierig :-( Wenn Ihre Tonhöhenspur in Poliphonic-Sounds ausfällt oder nicht funktioniert, verursachen diese Algorithmen viele Störungen / Artefakte im Ausgangston.

Frequenzbereich:

Alle Zeitspannen, die ich im Frequenzbereich kenne, basieren auf Phasenvocodertechniken .

Vorteile: Funktioniert in polyphonen oder monophonen Klängen.

Nachteile: Kann schmerzhaft sein, die ganze Mathematik zu verstehen, die Implementierung ist ein bisschen schwierig, ist nicht so schnell wie Zeitbereichscodes, für Sprache bevorzuge ich Zeitbereichsergebnisse, einige Tricks zur Verbesserung des Ergebnisses des Standardphasen-Vocoders werden nicht geteilt.

Ich kann sagen, dass das Fenster und die Hopfengröße einer der Schlüssel für die Qualität des Phasenvocoders sind. Im Allgemeinen wählen wir eine 4xÜberlappung zur Resynthese. Ein Hann-Fenster 4096reicht für meine Ohren aus (natürlich, wenn Sie Rechenleistung für diese Größen haben). Der Standard-Phasenvocoder kann einige Nachhalleffekte hinzufügen. Um diese Art von Problemen zu vermeiden, müssen Sie möglicherweise die Phase sperren.

Daten finden Sie in der Zeitung Miller Puckette and Portnoff

ederwander
quelle
Vielen Dank für Ihre Antwort. Was ist das Problem bei den naivsten Ansätzen: Erweitern Sie das Zeitsignal insgesamt als Funktion des gesamten Zeitintervalls ohne Fenster in Fourier-Reihen und multiplizieren Sie alle Frequenzen mit einer Konstanten. Ich verstehe, dass jeder lokale Fehler im Zeitbereich alle Fourier-Koeffizienten beeinflussen würde. Abgesehen davon, was sind die Gefahren dieses naiven, nicht lokalisierten Ansatzes?
Hans
Ich habe so etwas noch nie ausprobiert, es könnte funktionieren, das offensichtliche Problem ist, dass dies ziemlich kostspielig sein kann. Es ist sicherlich kein effizienter Weg. Stellen Sie sich vor, Sie haben ein Stück Audio (1 Minute) mit 44100 Hz abgetastet tun , was Sie vorschlagen , müssen Sie fourier bei Anwendung 44100 * 60 = 2646000vergessen Punkte auf einmal und zu verarbeiten, wenn man so jeden Versuch der Echtzeit - Verarbeitung , wie dieses ,
ederwander
1
Ich glaube nicht, dass das, was ich vorher vorgeschlagen habe, im rein mathematischen Sinne funktionieren würde (ohne Berücksichtigung der Kosten und der Fehlerempfindlichkeit).
Hans
3

Das Werkzeug / die Theorie, die Sie beschreiben, ist wirklich ein großes Forschungsgebiet in der Musiktechnologie, das allgemein als Audio-Zeitskalenmodifikation bezeichnet wird. Eine große Komponente dieses Feldes besteht darin, wie Sie hörbare Änderungen der Frequenz nach dem Dehnen der Zeit verhindern können. Dies kann je nach den Einschränkungen oder Zielen Ihrer Anwendung sowohl mit Frequenz- als auch mit Zeitbereichsmethoden angegangen werden. Der Wikipedia-Eintrag für Audio-Zeitskalen- / Tonhöhenänderung ist ein guter Ausgangspunkt.

Wenn Sie einen Ansatz auf Frequenz- / Wavelet-Basis verfolgen möchten, wirken sich Ihre Fenstergröße und die Wahl der Basis darauf aus, wie gut Sie das Signal lokalisieren können. Um die STFT als Beispiel zu verwenden, funktioniert ein langes Fenster gut für stationäre Sinuskurven, zerstört jedoch Ihre Transienten. Ein kürzeres Fenster bietet ein bevorzugtes Einschwingverhalten auf Kosten der Lokalisierung im Frequenzbereich. Die Leistung anderer Wavelet-Basen hängt von der Art der Projektion Ihres Signals auf die Basis ab.

Schnell
quelle
Vielen Dank für die Antwort. Haben Sie Hinweise zur Anwendung von Wavelet auf dieses Problem?
Hans
Bitte beachten Sie auch meinen Kommentar unter der Antwort von ederwander. Vielen Dank.
Hans
2

Unten finden Sie einen Link zu einer einfachen und wertvollen Tutorial-Funktion in C ++ (smbPitchShift.cpp) von Stephan M. Bernsee, mit der Sie Musik verlangsamen oder beschleunigen können, ohne ihre Tonhöhe zu ändern.

Er hat diesen Code unter der The Wide Open License (WOL) veröffentlicht. In meiner Anwendung konnte ich seine Funktion anpassen, um Musik in Echtzeit zu verlangsamen - das heißt, während ich eine MP3-Datei abspielte und gleichzeitig die Tonhöhenerkennung für dieses MP3-Signal durchführte.

Ich habe auch einen Link zu Bernsees Website eingefügt, der seine detaillierten Beschreibungen zum Time-Stretching und Pitch-Shifting von Audiosignalen wie Musik enthält.

https://github.com/AndyA/BatPhone/blob/master/pitchshift.c

http://blogs.zynaptiq.com/bernsee/time-pitch-overview/

James Paul Millard
quelle
Der ursprüngliche Code gilt nicht time stretch, der ursprüngliche Code gilt Pitch Shift. In diesem Fall müssen Sie die Zeitskalenänderung anwenden, die Sie kombinieren Pitch Shifit + Resample (interpolation)müssen. Der Bernsee-Code funktioniert gut mit einem Fenster mit einer Größe, mit der 4096Sie eine Oktave (oben oder unten) verschieben können. Dies bedeutet, dass Sie dementsprechend nur mit Faktoren zwischen 2,0x und 0,5x eine Zeitskala mit einer guten Qualität erstellen können. Ein gut gebauter Phasenvocoder kann bei gleicher Fenstergröße bessere Ergebnisse erzielen und diese extrapolieren Faktoren mit besserer Qualität
ederwander
Hoppla, jetzt erinnere ich mich daran, dass ich Re-Sampling anwenden musste, um die Zeitspanne zu vervollständigen, damit die ursprüngliche Tonhöhe nicht verändert wurde. Es sieht so aus, als hätte Bernsee seit der bei GitHub verlinkten Version einige Änderungen an seinem Code vorgenommen. Sein neuerer Code für steht auf seiner Website zum Download zur Verfügung - dies kann den Bereich der Verschiebung von seiner ursprünglichen Spezifikation erhöhen. Ich habe seinen ursprünglichen Code so angepasst, dass ich die Tonhöhe um das 8-fache erhöhen kann.
James Paul Millard
Es gibt keine Unterschiede zwischen Ihrem Code und der Bernsee-Seite. Die Hauptmathematik ist immer noch dieselbe. Der starke Unterschied, den ich sehen kann, ist die Fenstergröße = 8192in den Codes von der Download-Seite. Sie müssen also 4x mehr Punkte für die Verarbeitung tun Ich komme zurück, um zu sagen, dass Sie mit einer halben Fenstergröße 8192/2=4096dasselbe mit einigen Geheimnissen des Phasenvocoders tun können. Der Punkt hier ist, dass Sie die Qualität mit viel weniger Verarbeitung beibehalten können.
Federwander
Obwohl ich den GitHub-Link zu BatPhone bereitgestellt habe, ist dies NICHT mein Code. Ich habe es gerade aus einer Internetsuche gezogen, um smbPitchShift () anzuzeigen. Mein Code wurde stark von Bernsees Version geändert und befand sich in dieser Datei: github.com/CreativeDetectors/PitchScope_Player/blob/master/Src/…
James Paul Millard
Ja, jetzt kann ich sehen, es ist wirklich ein Resample. Vielleicht sind Sie daran interessiert, meinen Phasenvocoder in Aktion zu sehen / zu hören .
Federwander