Rozciąganie czasu o 10 procent w atempo i rubberband: timing, transjenty, brzmienie i stereo, pomiar

Spis treści
- Jak mierzono
- Czas: rubberband go trafia, atempo przesuwa pojedyncze uderzenia
- Transjenty: rubberband buduje narastanie przed uderzeniem
- Czyste tony: ustawienie domyślne rubberband traci poziom
- Tony bogate w harmoniczne: żadna metoda nie pozostaje czysta przy każdym tonie podstawowym
- Obraz stereo, poziom i czas obliczeń
- Co z tego wynika
- Zakres i ograniczenia
- Pytania i odpowiedzi
- Źródła
ffmpeg ma dwa filtry, które zmieniają tempo przy zachowaniu wysokości dźwięku. atempo jest częścią samego ffmpeg i działa metodą WSOLA: tnie dźwięk na nakładające się fragmenty i przesuwa każdy tak, aby jak najdokładniej pasował do poprzedniego. rubberband przekazuje dźwięk bibliotece Rubber Band Library, która pracuje w dziedzinie częstotliwości i przy transjentach stosuje własne reguły.
Pomiar wykonano przy tempie 0,9 i 1,1, czyli przy zmianie, która z utworu w 120 BPM robi utwór w 108 lub 132 BPM. Badano wpływ obu metod na timing, pojedyncze uderzenia, tony i obraz stereo. Pomiar nie rozstrzyga, która metoda brzmi lepiej.

Jak mierzono
- Metody: ffmpeg 7.1.5 z Rubber Band Library 3.3.0, 44,1 kHz, wyjście jako 32-bitowy zapis zmiennoprzecinkowy.
atempoirubberbandw ustawieniach domyślnych, do tegorubberbandztransients=mixed,transients=smooth,window=longichannels=together. - Czas: 20 krótkich kliknięć, każde z 2 ms tonu 3 kHz, co 0,5 s. Zmierzone zostały długość wyjścia, położenie każdego kliknięcia względem pozycji docelowej oraz to, czy docierają wszystkie kliknięcia.
- Uderzenia: 12 pojedynczych stop i werbli w odstępie nieco ponad sekundy, każde przesunięte o kolejne 37 ms względem siatki, aby trafiało w inne miejsca okien. Ocena opierała się na obwiedni RMS 3 ms: na chwili, w której osiąga połowę szczytu, i na jej poziomie 10 i 20 ms wcześniej.
- Tony: czyste sinusy 110, 440 i 1760 Hz oraz piły 55, 110, 220 i 440 Hz, po 5 s, rozciągnięte przy tempie 0,9, 0,95, 1,05 i 1,1. Przy sinusie liczy się, jak głęboko poziom w oknach 10 ms spada poniżej średniej. Przy pile liczy się energia między harmonicznymi, odniesiona do całej energii i porównana z nieprzetworzoną piłą.
- Miks: 16 s stereo ze stopy, werbla, hi-hatów, basu, plamy i leadu. Zmierzone zostały korelacja obu kanałów, poziom i czas obliczeń, z trzech przebiegów najkrótszy.
- Próby kontrolne: pierwsze liczenie podwójnych uderzeń znalazło już w nieprzetworzonym uderzeniu od 10 do 13 wejść, ponieważ obwiednia 0,25 ms podąża za drganiami stopy; liczenie odbywa się więc na 3 ms i zawsze obok oryginału. Pierwszy przebieg z jedną piłą 110 Hz sprawiał, że
atempowyglądał na czysty, a seria przez cztery tony podstawowe pokazuje, że był to wyjątek.
Czas: rubberband go trafia, atempo przesuwa pojedyncze uderzenia
| Metoda | Długość względem celu, 0,9 / 1,1 | Średnie przesunięcie, 0,9 / 1,1 | Największy błąd czasu na uderzenie, 0,9 / 1,1 |
|---|---|---|---|
atempo |
−26,6 / −20,7 ms | −15,2 / −19,9 ms | 10,84 / 8,37 ms |
rubberband, domyślnie (crisp) |
0,0 / 0,0 ms | −3,7 / +3,0 ms | 0,37 / 0,47 ms |
rubberband, transients=mixed |
0,0 / 0,0 ms | −3,7 / +3,0 ms | 1,52 / 2,00 ms |
rubberband, transients=smooth |
0,0 / 0,0 ms | −4,2 / +3,7 ms | 0,46 / 0,62 ms |
rubberband, window=long |
0,0 / 0,0 ms | −7,3 / +5,7 ms | 0,75 / 0,61 ms |
rubberband, channels=together |
0,0 / 0,0 ms | −3,6 / +3,0 ms | 0,41 / 0,48 ms |
Wartość ujemna oznacza wcześniej lub krócej, niż wymagano. Przy każdej metodzie dotarło wszystkie 20 kliknięć. rubberband dostarczył długość co do próbki i postawił każde uderzenie w odległości 0,62 ms od jego miejsca w ustawieniu domyślnym oraz przy smooth i together, przy window=long w odległości 0,75 ms, a przy mixed 2,00 ms. Nie było to oczywiste: filtr uruchamia bibliotekę w trybie czasu rzeczywistego, a tam według jej dokumentacji na początku sygnału nie ma korekty opóźnienia ani latencji. Zostało przesunięcie od 3,0 do 7,3 ms, które zmienia znak razem z kierunkiem rozciągnięcia.
atempo rozpoczynał cały sygnał wyjściowy od 15 do 20 ms za wcześnie, a jego długość była o 21 do 27 ms za mała. Dla timingu większe znaczenie ma błąd, który różni się między uderzeniami: przy tempie 0,9 sięgał 10,84 ms, a przy 1,1 do 8,37 ms. Metoda dzieli dźwięk na okna po 2048 próbek, co przy 44,1 kHz odpowiada 46,4 ms, i umieszcza każde okno tam, gdzie najlepiej pasuje do poprzedniego. Uderzenie wewnątrz okna przesuwa się razem z nim.
Transjenty: rubberband buduje narastanie przed uderzeniem
| Metoda | Szczyt stopy, 0,9 / 1,1 | Szczyt werbla, 0,9 / 1,1 | Poziom 10 ms wcześniej, 0,9 / 1,1 | Poziom 20 ms wcześniej, 0,9 / 1,1 |
|---|---|---|---|---|
atempo |
−0,11 / −0,20 dB | −0,24 / −0,06 dB | −24,8 / −39,6 dB | brak |
rubberband, domyślnie (crisp) |
−1,43 / −0,67 dB | −1,99 / −1,75 dB | −22,8 / −16,3 dB | −35,9 / −29,3 dB |
rubberband, transients=mixed |
−0,90 / −1,64 dB | −0,54 / −1,82 dB | −14,5 / −12,3 dB | −25,6 / −20,6 dB |
rubberband, transients=smooth |
−0,73 / −1,28 dB | −0,88 / −1,60 dB | −20,3 / −14,9 dB | −33,1 / −30,4 dB |
rubberband, window=long |
−1,15 / −1,14 dB | −1,77 / −1,61 dB | −14,1 / −14,7 dB | −20,0 / −17,1 dB |
rubberband, channels=together |
−0,93 / −1,31 dB | −1,63 / −1,19 dB | −21,4 / −17,9 dB | −33,8 / −34,3 dB |
Poziomy przed uderzeniem są odniesione do jego szczytu i stanowią najwyższą wartość z dwunastu uderzeń. W oryginale jest w tym miejscu cisza. Przy rubberband obwiednia wyłania się z szumu już 30 ms przed uderzeniem i 10 ms przed nim osiąga od −12,3 do −22,8 dB, przy window=long 20 ms wcześniej wciąż stoi −17,1 dB. Samo uderzenie traci od 0,5 do 2,0 dB szczytu. Wykres pokazuje to narastanie przy obu ustawieniach.
atempo nie ma narastania; 20 ms przed uderzeniem nie ma niczego. Wartości 10 ms wcześniej biorą się z czegoś innego: przy niektórych uderzeniach fragment ataku zaczyna się kilka milisekund przed właściwym wejściem, a między nimi leży spadek. Szczyt zostaje przy tym zachowany z dokładnością do 0,24 dB.
Czyste tony: ustawienie domyślne rubberband traci poziom
| Metoda | Sinus 110 Hz, 0,9 / 1,1 | Sinus 440 Hz, 0,9 / 1,1 | Sinus 1760 Hz, 0,9 / 1,1 |
|---|---|---|---|
atempo |
−0,4 / −0,4 dB | −0,1 / −0,1 dB | 0,0 / 0,0 dB |
rubberband, domyślnie (crisp) |
−1,7 / −2,0 dB | −4,4 / −7,4 dB | −7,6 / −11,5 dB |
rubberband, transients=mixed |
−1,7 / −2,0 dB | −0,1 / −0,2 dB | −7,6 / −11,5 dB |
rubberband, transients=smooth |
−0,3 / −0,3 dB | −0,1 / −0,1 dB | −0,1 / −2,7 dB |
Liczby podają, jak głęboko poziom równego tonu spada w oknie 10 ms poniżej średniej. W ustawieniu domyślnym rubberband wykrywa transjenty nawet w czystym sinusie i zeruje tam fazy, tak jak dokumentacja opisuje ustawienie crisp. Skutkiem są spadki do 11,5 dB, przy tempie 0,95 i 110 Hz 10,4 dB. Przy 440 Hz wysokość wahała się przy tym od −7,0 do +11,5 centa, przy 110 Hz widmo nie zawierało już czystej linii do odczytu.
transients=mixed zeruje fazy według dokumentacji tylko poza zakresem typowych tonów podstawowych, i dokładnie tak wygląda tabela: 440 Hz pozostaje spokojne, 110 i 1760 Hz tracą poziom jak w ustawieniu domyślnym. transients=smooth nigdy nie zeruje i poza jednym przypadkiem trzyma ton w granicach 0,4 dB, z odchyleniem 0,0 centa. atempo równie dobrze trzyma poziom, ale przesuwa wysokość o małą stałą wartość, przy 440 Hz o +0,4 centa przy tempie 0,9 i o −0,4 centa przy 1,1.
Tony bogate w harmoniczne: żadna metoda nie pozostaje czysta przy każdym tonie podstawowym
| Metoda, tempo 0,9 | 55 Hz | 110 Hz | 220 Hz | 440 Hz |
|---|---|---|---|---|
| Oryginał, zakłócenia bezwzględnie | −50,1 dB | −47,1 dB | −43,9 dB | −41,0 dB |
atempo |
+40,3 dB | +1,4 dB | +10,5 dB | +3,4 dB |
rubberband, domyślnie (crisp) |
+40,7 dB | +41,4 dB | +37,2 dB | +28,8 dB |
rubberband, transients=mixed |
+40,8 dB | +41,0 dB | +24,8 dB | +23,3 dB |
rubberband, transients=smooth |
+26,1 dB | +4,2 dB | +10,5 dB | +15,3 dB |
Wiersze metod podają, o ile energia między harmonicznymi leży ponad energią oryginału. Piła ma harmoniczne aż po górę pasma i reprezentuje bas, plamy i leady. We wszystkich czterech tempach przyrost wynosił przy atempo od 1,4 do 40,3 dB, w ustawieniu domyślnym rubberband od 15,4 do 46,5 dB, przy transients=smooth od 4,2 do 26,1 dB.
Odstającą wartością atempo jest niski ton. Przy 55 Hz i tempie 0,9 zakłócenia leżą 9,8 dB poniżej całej energii, poziom spada o 5,2 dB, a wysokość wędruje do +20,4 centa. Jeden okres ma tam 802 próbki, okno 2048; nie dla każdego miejsca znajduje już pasujący odpowiednik. Przy tempie 1,1 ta sama wartość spada do +10,3 dB, a przy 110 Hz atempo we wszystkich czterech tempach mieścił się w 2,0 dB od oryginału.
Obraz stereo, poziom i czas obliczeń
| Metoda | Korelacja po, 0,9 / 1,1 | Poziom miksu, 0,9 / 1,1 | Szybciej niż w czasie rzeczywistym, 0,9 / 1,1 |
|---|---|---|---|
atempo |
0,922 / 0,919 | −0,03 / −0,05 dB | 26,0 / 18,9 raza |
rubberband, domyślnie (crisp) |
0,894 / 0,903 | −0,55 / −0,65 dB | 6,5 / 6,9 raza |
rubberband, transients=mixed |
0,749 / 0,757 | −1,10 / −1,34 dB | 5,6 / 7,1 raza |
rubberband, transients=smooth |
0,531 / 0,495 | −2,61 / −2,95 dB | 5,0 / 5,5 raza |
rubberband, window=long |
0,906 / 0,909 | −0,44 / −0,71 dB | 3,7 / 6,2 raza |
rubberband, channels=together |
0,920 / 0,919 | −0,55 / −0,65 dB | 5,1 / 4,7 raza |
rubberband, smooth i together |
0,911 / 0,912 | −2,66 / −3,03 dB | 5,0 / 7,4 raza |
rubberband, mixed i together |
0,940 / 0,935 | −1,12 / −1,35 dB | 5,5 / 8,1 raza |
Przed rozciągnięciem korelacja wynosiła 0,92. W ustawieniu domyślnym rubberband przetwarza kanały osobno; według dokumentacji skutkuje to bardziej rozmytym obrazem stereo i mniejszą zgodnością mono. Przy smooth korelacja spadła do 0,49, a przy mixed do 0,75. channels=together utrzymuje ją w każdym połączeniu powyżej 0,91.
Nie usuwa to spadku poziomu przy smooth: miks jest o 2,6 do 3,0 dB cichszy także z together. Strata powstaje więc wewnątrz kanałów. Korelację konkretnego miksu przed i po przetwarzaniu pokazuje miernik korelacji stereo i mid/side.
Na Raspberry Pi 4 atempo działał od 19 do 26 razy szybciej niż w czasie rzeczywistym, rubberband od 3,7 do 8,1 raza. Obie wartości wystarczają dla każdego pliku; w tempie trwającego projektu różnica byłaby natomiast odczuwalna.
Co z tego wynika
- Dla perkusji i całych miksów, w których liczy się timing:
rubberband=tempo=…:channels=together. Każde uderzenie wylądowało w odległości 0,48 ms od przypisanego mu miejsca, a obraz stereo pozostał przy 0,92. Ceną są spadki na równych tonach i narastanie przed każdym uderzeniem. - Dla plam, wokalu i wytrzymanych dźwięków:
rubberband=tempo=…:transients=smooth:channels=together. Czyste tony pozostały prawie bez zmian, obraz stereo przy 0,91, a harmoniczne ucierpiały najmniej, z przyrostem od 4 do 26 dB. Miks staje się o 2,6 do 3,0 dB cichszy i wymaga potem ponownego ustawienia głośności. atempotam, gdzie nie ma stałych uderzeń ani niskich tonów. Brzmienie, poziom i obraz stereo zostały zachowane najlepiej, ale pojedyncze uderzenia przesuwały się o do 10,84 ms, a ton 55 Hz przy tempie 0,9 stracił większość czystości.- Tempo jako współczynnik: 120 na 132 BPM to tempo 1,1, 120 na 108 BPM to tempo 0,9. Czasy opóźnień i długości nut, które pasują do nowego tempa, oblicza kalkulator BPM i czasu opóźnienia.
Zakres i ograniczenia
- Sygnały były syntetyczne, nie nagrania. Głos, instrumenty akustyczne i pogłos nie były badane, a test odsłuchowy nie był częścią pomiaru.
- ffmpeg nie daje przy
rubberbandwyboru silnika i korzysta przez to ze starszego silnika R2. Według dokumentacji silnik R3 daje przy większości materiału lepsze wyniki, zwłaszcza przy złożonych miksach, wokalu i mocnym basie, ale wymaga znacznie więcej mocy obliczeniowej. Przez ffmpeg jest niedostępny. - Czasy obliczeń dotyczą Raspberry Pi 4 przy zmiennym obciążeniu; na innym sprzęcie wartości bezwzględne są inne.
- Granice oceny, 3 ms dla obwiedni i okna 10 ms dla poziomu, współdecydują o tym, jak duży wydaje się spadek. Krótsze okna pokazują głębsze spadki.
Pytania i odpowiedzi
Na co należy uważać, gdy poszczególne ścieżki projektu są rozciągane osobno?
Przede wszystkim na to, żeby każda ścieżka dostała te same błędy, inaczej ścieżki przesuną się względem siebie. Przy rubberband błędy są przewidywalne: długość zgadza się co do próbki, a pozostałe przesunięcie zależy od ustawienia. Przy tempie 0,9 wynosiło ono w ustawieniu domyślnym −3,7 ms, a przy window=long −7,3 ms. Jeśli perkusja zostanie rozciągnięta z jednym ustawieniem, a plama z drugim, będą się potem rozmijać o 3,6 ms, czyli o stałą wartość, którą da się wyrównać przesunięciem jednej ścieżki.
Przy atempo to nie działa. Błąd na uderzenie powstaje tam, gdzie okno wypada na uderzeniu, a te miejsca zależą od sygnału. Dwie ścieżki rozciągnięte osobno dostają więc różne błędy, które w teście sięgały 10,84 ms, i żadne stałe przesunięcie ich nie wyrówna. Przy ścieżkach, które muszą razem trzymać rytm, przemawia to za rubberband ze wspólnym ustawieniem albo za krótkim kliknięciem na początku każdej ścieżki, z którego po rozciągnięciu da się odczytać rzeczywiste przesunięcie.
Czy window=long pomaga na narastanie przed uderzeniem?
Nie, raczej przeciwnie. Przy window=long 20 ms przed uderzeniem poziom wynosił jeszcze −17,1 dB, najwyższa wartość spośród wszystkich ustawień w tej kolumnie, bo dłuższe okno rozkłada energię szerzej w czasie. Mniejsze narastanie daje ustawienie domyślne, smooth albo together: 20 ms wcześniej żadne z nich nie przekroczyło −29,3 dB.
Źródła
- ffmpeg: Filters Documentation: sekcje o
atempoirubberband; opcje i wartości domyślne pochodzą z wbudowanej pomocy ffmpeg 7.1.5. - FFmpeg, libavfilter/af_atempo.c: WSOLA jako metoda i rozmiar okna z częstotliwości próbkowania podzielonej przez 24, zaokrąglony w górę do potęgi dwójki.
- FFmpeg, libavfilter/af_rubberband.c: uruchomienie biblioteki w trybie czasu rzeczywistego i bez wyboru silnika.
- Rubber Band Library: RubberBandStretcher: silniki R2 i R3 oraz to, który z nich jest domyślny, brak korekty latencji w trybie czasu rzeczywistego, ustawienia transjentów, okna i kanałów.