Rallenta la riproduzione della musica mantenendo la frequenza


10

La riproduzione di un brano musicale a una velocità inferiore ridurrebbe il tono (frequenza). C'è uno strumento e una teoria per rallentare la riproduzione della canzone mantenendo la stessa frequenza? Suppongo che si possa fare una trasformazione di Fourier con finestre o una trasformazione wavelet. Sembra che sia necessario preselezionare la dimensione della finestra o scegliere dinamicamente la base wavelet. Esiste una teoria e un'applicazione specifica e dettagliata per farlo?


1
Oltre alla risposta fornita di seguito, consultare questo link per ulteriori informazioni.
A_A

Risposte:


5

Sì, alcuni di noi possono farlo, puoi accelerare o rallentare senza influire sul tono, alcuni ragazzi chiamano queste applicazioni di Time Stretch, ci sono diversi modi per farlo, puoi farlo nel dominio della frequenza o nel dominio del tempo, dovrai scegliere ciò che è meglio per te, troverai alcuni vantaggi e svantaggi di ciascuno.

Dominio del tempo:

In Time Domain puoi provare alcune tecniche come:

  • TDHS (Sacraling armonico nel dominio del tempo)
  • SOLA (Synchronous Overlap Add)
  • PSOLA (Pitch Synchronous Overlap Add)
  • WSOLA (Aggiungi sovrapposizione somiglianza forma d'onda)

Pro: è veloce, alcuni algoritmi sono facili da capire, di buona qualità nei suoni monofonici.

Contro: generalmente avrai bisogno di una traccia del pitch molto bella per giuntare nella giusta posizione, è difficile fare :-(, quindi se la tua traccia del pitch fallisce o non funziona nei suoni polifonici, questi algoritmi daranno molti glitch / artefatti nel suono di uscita.

Dominio di frequenza:

Tutto il tempo che conosco nel dominio della frequenza si basa su tecniche di vocoder di fase .

Pro: Funzionerà con suoni polifonici o monofonici.

Contro: può essere doloroso capire tutta la matematica, l'implementazione è un po 'difficile, non è così veloce come i codici del dominio del tempo, per la voce preferisco i risultati del dominio del tempo, alcuni trucchi per migliorare il risultato del vocoder di fase standard non sono condivisi.

Posso dire che la finestra e la dimensione del luppolo sono una delle chiavi per la qualità del vocoder di fase, generalmente scegliamo la 4xsovrapposizione alla risintesi, una finestra di hann di dimensioni 4096è sufficiente per le mie orecchie (ovviamente se hai potenza di elaborazione per queste dimensioni) , il vocoder di fase standard può aggiungere alcuni effetti riverberanti, per cercare di evitare questo tipo di problemi potresti aver bisogno di bloccare la fase.

Per datailed date un'occhiata nella Miller Puckette e Portnoff carta


La ringrazio per la risposta. Qual è il problema con il più ingenuo degli approcci: espandere il segnale temporale nel suo complesso come una funzione sull'intero intervallo di tempo senza spostarsi in una serie di Fourier e moltiplicare tutte le frequenze per una costante. Comprendo che qualsiasi errore locale nel dominio del tempo influirebbe su tutti i coefficienti di Fourier. A parte questo, quali sono le insidie ​​di questo ingenuo approccio non localizzato?
Hans

Non ho mai provato niente del genere, potrebbe funzionare, l'ovvio problema è che questo può essere abbastanza costoso, Non è certamente un modo efficiente, immagina di avere un pezzo di audio (1 minuto) campionato a 44100Hz, ora per fai quello che stai proponendo, dovrai applicare Fourier in 44100 * 60 = 2646000punti contemporaneamente ed elaborare, quindi dimentica qualsiasi tentativo di elaborazione in tempo reale come questo ,
ederwander

1
Non credo che ciò che ho suggerito prima avrebbe funzionato in puro senso matematico (trascurando la sensibilità ai costi e agli errori).
Hans,

3

Lo strumento / teoria che descrivi è in realtà una vasta area di ricerca nella tecnologia musicale, generalmente definita modifica della scala temporale dell'audio. Un grande componente di questo campo è il modo in cui è possibile prevenire le variazioni udibili della frequenza dopo il time stretching. Questo può essere affrontato con metodi nel dominio della frequenza e del tempo, a seconda dei vincoli o degli obiettivi dell'applicazione. La voce di Wikipedia per la modifica della scala temporale / del tono dell'audio è un buon punto di partenza.

Se sei interessato a perseguire un approccio usando la frequenza / base wavelet, la dimensione della finestra e la scelta della base influenzeranno la tua capacità di localizzare il segnale. Per usare la STFT come esempio, una lunga finestra funzionerà bene per i sinusoidi stazionari ma distruggerà i tuoi transitori. Una finestra più corta fornirà una risposta transitoria preferibile a scapito della localizzazione del dominio di frequenza. Le prestazioni di altre basi wavelet dipenderanno dalla natura della proiezione del segnale sulla base.


Grazie mille per la risposta. Hai qualche riferimento sull'applicazione di wavelet a questo problema?
Hans

Vedi anche il mio commento sotto la risposta di ederwander. Grazie.
Hans

2

Di seguito è riportato un collegamento a una semplice e preziosa funzione tutorial in C ++ (smbPitchShift.cpp) di Stephan M. Bernsee, che può rallentare o accelerare la musica senza modificarne il tono.

Ha rilasciato questo codice con The Wide Open License (WOL). All'interno della mia applicazione, sono stato in grado di adattare la sua funzione al rallentamento della musica in tempo reale, ovvero durante la riproduzione di un file mp3 e allo stesso tempo il rilevamento del tono su quel segnale mp3.

Ho anche incluso un link al sito Web di Bernsee che contiene le sue descrizioni dettagliate su Time-Stretching e Pitch-Shifting di segnali audio, come la musica.

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

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


Il codice originale non si applica time stretch, si applica il codice originale Pitch Shift, in questo caso per applicare la modifica della scala temporale che è necessario combinare Pitch Shifit + Resample (interpolation), il codice di Bernsee funziona bene usando una finestra di dimensioni 4096che sarà possibile spostare il pitch di un'ottava (sopra o sotto) , significa che di conseguenza sarai in grado di fare una scala temporale con una buona qualità usando fattori compresi tra 2,0x-0,5x, un vocoder di fase ben costruito può ottenere risultati migliori usando la stessa dimensione della finestra e sarai in grado di estrapolarli fattori con una migliore qualità
ederwander

Oops, ora ricordando che dovevo applicare Re-Sampling per completare il periodo di tempo, in modo che il pitch originale non fosse modificato. Sembra che Bernsee abbia apportato alcune modifiche al suo codice dalla versione collegata a GitHub. Il suo codice più recente per è disponibile per il download dal suo sito Web: potrebbe aumentare la gamma di spostamento dalle specifiche originali. Ho modificato il suo codice originale in modo da poter aumentare il tono di 8 volte.
James Paul Millard,

non ci sono differenze tra il tuo codice e la pagina Bernsee, la matematica principale è sempre la stessa, La forte differenza che posso vedere è la dimensione della finestra = 8192nei codici dalla pagina di download, quindi devi fare altri 4 punti per l'elaborazione , Torno a dire che con la mezza finestra 8192/2=4096puoi fare lo stesso usando alcuni segreti del vocoder di fase, il punto qui è che puoi mantenere la qualità con molta meno elaborazione.
ederwander,

Sebbene abbia fornito il link GitHub a BatPhone, NON è il mio codice. L'ho appena estratto da una ricerca su Internet per visualizzare smbPitchShift (). Il mio codice è molto modificato dalla versione di Bernsee e risiedeva in questo file: github.com/CreativeDetectors/PitchScope_Player/blob/master/Src/…
James Paul Millard

Sì, ora posso vedere, è davvero un nuovo esempio, potresti essere interessato a vedere / ascoltare il mio vocoder di fase in azione.
ederwander,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.