Esiste un programma in grado di determinare il tono più alto all'interno di un file audio?


14

Esiste un programma Windows in grado di determinare la "frequenza delle onde sonore più elevata" rilevata all'interno di un file audio (ad es. File mp3)?

Ad esempio, dovrebbe essere in grado di analizzare il file Dog-Whistle-0 e determinare che la frequenza più alta trovata all'interno del file è approssimativamente di ~ 12000 Hz.

Inoltre, dovrebbe essere in grado di analizzare Piano.mp3 e determinare la nota più alta.

Risposte:


13

R è multipiattaforma e free / open source.

Caricalo e carica le librerie tuneRe seewave(installale dal gestore dei pacchetti se non ancora installato).

library(tuneR)
library(seewave)

Quindi, carica il tuo file MP3 o WAV:

w = readMP3("dog-whistle-0.mp3")
w = readWave("dog-whistle-0.wav")

Ora, tracciamo lo spettro e i suoi picchi:

fpeaks(meanspec(w), nmax=1)

Risultato:

Risultato numerico:

fpeaks(meanspec(w), nmax=1, plot=FALSE)
12.05859

Quanto sopra funziona solo con dati non musicali. Quando analizzi le frequenze della musica, scoprirai che le frequenze più alte saranno sempre intorno ai 12-20 kHz, a seconda dello strumento o degli strumenti coinvolti. Tuttavia, questa frequenza più alta non ti darà una stima della nota che viene suonata, poiché una nota musicale, quando suonata da uno strumento, sarà composta da più frequenze.

Questo è il cosiddetto "timbro" di uno strumento e scoprirai che un A a 440 Hz per flauto includerà componenti di frequenza diversi rispetto ad un A suonato da una chitarra elettrica.

La soluzione migliore è eseguire un'analisi di frequenza dominante osservando i picchi di frequenza su finestre temporali scorrevoli e verificare dove si verifica quella più alta.

Tuttavia, non esiste una "frequenza nel tempo". Puoi tracciare la frequenza media (o dominante) solo su determinate finestre temporali scorrevoli . Seewave offre alcune funzioni per quanto riguarda la selezione delle finestre temporali, ma diventa piuttosto complicato.

Puoi usare

s = specprop(meanspec(w, from=10, to=11)) 

per ottenere le proprietà dello spettro da 10 a 11 secondi e quindi chiamare s$centroido s$meanper ottenere il centroide o le frequenze medie di quella particolare finestra temporale (anche se 1 secondo è abbastanza grande per l'analisi audio).

Se il file Wave utilizza il campionamento a 44,1 kHz, è possibile eseguirne il downsampling per ridurre lo sforzo di calcolo, ad esempio a 16 kHz.

w = downsample(w, 16000)

Ma ricorda che secondo il Teorema di Nyquist , la frequenza massima che può essere rappresentata ora è di 8 kHz.

Potresti anche cercare un software di rilevamento dell'intonazione. Come questo , che richiede MATLAB però.


A proposito invece di fpeaks, sei consapevole se esiste una funzione che traccia il grafico della frequenza rispetto al tempo?
Pacerier,

Vedi il mio aggiornamento Non è così banale. Non ho lavorato con l'audio così tanto da sapere se c'è qualcosa di meglio in giro, scusa.
slhck,

8

Hai provato Audacity ? Si tratta di uno strumento freeware che ha alcuni strumenti di analisi piuttosto sofisticati, tra cui un Plot Spectrum comando accessibile dal Analizza -> Plot Spectrum ... .

Immagine dello schermo

Si noti che si ottengono risultati diversi con la versione MP3 del file rispetto alla versione WAV perché la compressione MP3 ha alterato la forma d'onda e introdotto artefatti / aliasing.

Modifica: i file audio a cui ti colleghi non sono buoni esempi per questo. I file di frequenza più elevata vengono campionati solo a 44,1 KHz, adattato all'udito umano (circa 20 KHz massimo). Non è possibile rappresentare le frequenze degli ultrasuoni senza aumentare la frequenza di campionamento.


Hmm, non sembra funzionare con il file Piano.mp3 . Per me mostra 10121 Hz (D # 9) screenshoot.me/uZZ2N0 , ma questo è altamente improbabile perché il tasto più grande di un piano è C8 (4186Hz). Sto facendo qualcosa di sbagliato?
Pacerier,

3
@Pacerier No, ma hai cambiato un po 'la tua domanda. Il campione di fischietto per cani è facile da identificare perché la frequenza con il picco più alto nello spettro è anche la frequenza più alta e allo stesso tempo la nota dominante. Per la musica, la frequenza più alta non è necessariamente la nota più alta, poiché una nota musicale suonata da uno strumento è composta da più frequenze.
slhck,

@slhck Ic, avrei pensato di indovinare la nota se avessimo la frequenza, sembra che non sia così semplice ..
Pacerier

@Pacerier: se si imposta Dimensione su un valore più alto, credo che possa dare risultati più precisi ed eliminare alcune armoniche.
James P,

2
@Pacerier No, non è davvero così semplice. Il rilevamento del passo richiede di trasformare prima la forma d'onda in uno spettro di frequenza (Fast Fourier Transform), quindi applicare i filtri (passa-basso per lo più) e un altro giro di filtri. A meno che non trovi uno strumento che tiene traccia del tono nel tempo, ciò che stai cercando sarà davvero difficile. Potresti esaminare strumenti di correzione vocale come Melodyne .
slhck,
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.