Zwolnij odtwarzanie muzyki przy zachowaniu częstotliwości

10

Odtwarzanie utworu muzycznego z mniejszą prędkością obniżyłoby jego wysokość (częstotliwość). Czy istnieje narzędzie i teoria spowalniająca odtwarzanie utworu, przy jednoczesnym utrzymaniu tej samej częstotliwości? Podejrzewam, że można wykonać okienkową transformatę Fouriera lub falkę. Wydaje się, że trzeba albo wstępnie wybrać rozmiar okna, albo dynamicznie wybrać podstawę falki. Czy istnieje jakaś konkretna i szczegółowa teoria i zastosowanie do tego?

Hans
źródło
1
Oprócz odpowiedzi podanej poniżej, zobacz ten link, aby uzyskać więcej informacji.
A_A

Odpowiedzi:

5

Tak, niektórzy z nas mogą to zrobić, możesz przyspieszyć lub zwolnić bez wpływu na wysokość, niektórzy nazywają to aplikacjami Time Stretch, istnieją różne sposoby, możesz to zrobić w dziedzinie częstotliwości lub dziedzinie czasu, będziesz musiał wybrać co jest dla Ciebie najlepsze, znajdziesz wady i zalety każdego z nich.

Domena czasu:

W domenie czasu możesz wypróbować kilka technik, takich jak:

  • TDHS (Sacaling harmoniczne w dziedzinie czasu)
  • SOLA (synchroniczne dodawanie nakładek)
  • PSOLA (Pitch Synchronous Overlap Add)
  • WSOLA (Dodanie podobieństwa kształtu fali)

Plusy: Jest szybki, niektóre algorytmy są łatwe do zrozumienia, dobra jakość w dźwiękach monofonicznych.

Minusy: Ogólnie rzecz biorąc, potrzebujesz bardzo dobrej ścieżki do łączenia w odpowiedniej pozycji, trudno to zrobić :-(, więc jeśli twoja ścieżka nie działa lub nie działa w dźwiękach polifonicznych, algorytmy te dają wiele błędów / artefaktów w dźwięku wyjściowym.

Domena częstotliwości:

Cały odcinek czasu, który znam w dziedzinie częstotliwości, oparty jest na wokoderze fazowym technikach .

Plusy: będą działać przy dźwiękach polifonicznych lub monofonicznych.

Minusy: Może być bolesne zrozumienie całej matematyki, implementacja jest nieco trudna, nie jest tak szybka jak kody w dziedzinie czasu, dla głosu wolę wyniki w dziedzinie czasu, niektóre sztuczki w celu poprawy wyniku standardowego wokodera fazy nie są wspólne.

Mogę powiedzieć, że rozmiar okna i przeskoku jest jednym z kluczowych parametrów jakości wokodera fazowego, generalnie wybieramy 4xnakładanie się na resyntezę, jedno okno wielkości hann 4096jest wystarczające dla moich uszu (oczywiście jeśli masz moc przetwarzania dla tych rozmiarów) , standardowy wokoder fazy może dodać efekty pogłosu, aby uniknąć tego rodzaju problemów, które mogą być potrzebne do zablokowania fazy.

Dla datailed spojrzeć w Miller Puckette i Portnoff papieru

Ederwander
źródło
Dziękuję za Twoją odpowiedź. Na czym polega problem z najbardziej naiwnym podejściem: rozszerz sygnał czasu jako funkcję w całym przedziale czasowym bez okienkowania w szereg Fouriera i pomnóż wszystkie częstotliwości przez stałą. Rozumiem, że każdy lokalny błąd w dziedzinie czasu wpłynąłby na wszystkie współczynniki Fouriera. Poza tym, co jest pułapką tego naiwnego niezlokalizowanego podejścia?
Hans
Nigdy czegoś takiego nie próbowałem, może działać, oczywistym problemem jest to, że może to być dość kosztowne. Z pewnością nie jest to skuteczny sposób, wyobraź sobie, że masz kawałek dźwięku (1 minuta) próbkowany przy częstotliwości 44100 Hz, teraz rób to, co proponujesz, będziesz musiał zastosować fourier w 44100 * 60 = 2646000punktach na raz i przetworzyć, więc zapomnij o wszelkich próbach przetwarzania takich informacji w czasie rzeczywistym ,
ederwander
1
Nie sądzę, że to, co zasugerowałem wcześniej, działałoby w czystym matematycznym sensie (nie uwzględniając wrażliwości na koszty i błędy).
Hans
3

Narzędzie / teoria, którą opisujesz, to tak naprawdę duży obszar badań w dziedzinie technologii muzycznej, szeroko nazywany dźwiękową modyfikacją skali czasu. Dużym elementem tego pola jest sposób zapobiegania słyszalnym zmianom częstotliwości po rozciągnięciu czasu. Można do tego podejść zarówno metodami w dziedzinie częstotliwości, jak i w dziedzinie czasu, w zależności od ograniczeń lub celów aplikacji. Wpis w Wikipedii dotyczący modyfikacji skali czasu / wysokości dźwięku jest dobrym punktem wyjścia.

Jeśli chcesz zastosować podejście oparte na częstotliwości / falce, rozmiar okna i wybór podstawy wpłynie na to, jak dobrze jesteś w stanie zlokalizować sygnał. Aby użyć STFT jako przykładu, długie okno będzie działać dobrze dla stacjonarnych sinusoid, ale zniszczy twoje transjenty. Krótsze okno zapewni preferowaną odpowiedź przejściową kosztem lokalizacji w dziedzinie częstotliwości. Wydajność innych baz falkowych będzie zależeć od charakteru projekcji twojego sygnału na podstawę.

Szybki
źródło
Dziękuję bardzo za odpowiedź. Czy masz jakieś odniesienia do zastosowania falki do tego problemu?
Hans
Zobacz także mój komentarz poniżej odpowiedzi ederwandera. Dzięki.
Hans
2

Poniżej znajduje się link do prostej i wartościowej funkcji samouczka w C ++ (smbPitchShift.cpp) autorstwa Stephana M. Bernsee, która może spowalniać lub przyspieszać muzykę bez zmiany jej wysokości.

Wydał ten kod na licencji The Wide Open License (WOL). W mojej aplikacji mogłem dostosować jego funkcję do spowolnienia muzyki czasie rzeczywistym - to znaczy podczas odtwarzania pliku mp3 i dodatkowo wykrywania wysokości dźwięku na tym sygnale mp3 w tym samym czasie.

Zamieściłem również link do strony internetowej Bernsee, która zawiera jego szczegółowe opisy dotyczące rozciągania w czasie i zmiany wysokości sygnałów audio, takich jak muzyka.

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

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

James Paul Millard
źródło
Oryginalny kod nie ma zastosowania time stretch, oryginalny kod ma zastosowanie Pitch Shift, w tym przypadku, aby zastosować modyfikację skali czasu, którą musisz połączyć Pitch Shifit + Resample (interpolation), kod Bernsee działa dobrze, używając okna o rozmiarze, w 4096którym będziesz mógł przesunąć tonację o jedną oktawę (powyżej lub poniżej) oznacza to, że odpowiednio będziesz w stanie wykonać skalę czasu tylko przy dobrej jakości, stosując współczynniki między 2,0x-0,5x, dobrze zbudowany wokoder fazowy może osiągnąć lepsze wyniki przy tym samym rozmiarze okna, i będziesz mógł ekstrapolować te czynniki o lepszej jakości
ederwander
Ups, teraz pamiętam, że musiałem zastosować ponowne próbkowanie, aby ukończyć odcinek czasowy, aby pierwotna wysokość dźwięku nie uległa zmianie. Wygląda na to, że Bernsee wprowadził pewne zmiany w swoim kodzie od wersji połączonej na GitHub. Jego nowszy kod jest dostępny do pobrania z jego strony internetowej - może to zwiększyć zakres przesunięć w stosunku do jego oryginalnej specyfikacji. Ulepszyłem jego oryginalny kod, aby móc zwiększyć skok o 8x.
James Paul Millard,
nie ma różnic między twoim kodem a stroną Bernsee, główna matematyka jest nadal taka sama, silna różnica, którą widzę, to rozmiar okna = 8192w kodach ze strony pobierania, więc musisz zrobić 4x więcej punktów do przetworzenia , Wracam do stwierdzenia, że ​​przy rozmiarze połowy okna 8192/2=4096możesz zrobić to samo, używając kilku sekretów wokodera fazowego, chodzi tutaj o to, że możesz zachować jakość przy znacznie mniejszym przetwarzaniu.
ederwander
Chociaż podałem link GitHub do BatPhone, NIE jest to mój kod. Właśnie wyciągnąłem go z wyszukiwania w Internecie, aby umożliwić przeglądanie smbPitchShift (). Mój kod jest znacznie zmodyfikowany w stosunku do wersji Bernsee i znajduje się w tym pliku: github.com/CreativeDetectors/PitchScope_Player/blob/master/Src/…
James Paul Millard
Tak, teraz widzę, to naprawdę próbka, możesz być zainteresowany, aby zobaczyć / usłyszeć mój wokoder fazowy w akcji.
ederwander