Ottenere il volume di una traccia con RMS


15

Sto cercando di calcolare il volume di una traccia audio che ho memorizzato in un buffer. Il buffer contiene i dati PCM del segnale e voglio ottenere quanto è "rumoroso" usando Root Mean Squared. Presumo di poterlo fare nel dominio del tempo invece di dover passare al dominio della frequenza. Quale sarebbe lo pseudo-codice per farlo?

Vorrei semplicemente campionare per un secondo (audio [0] - audio [44099], audio [44099] - audio [88199] ecc.) E calcolare l'RMS di questi valori? Quindi, per esempio, farei questo:

RMS=Audio[0]2+Audio[1]2+Audio[2]2.....Audio[44099]244100

per ogni secondo?


1
C'è una parentesi mancante nell'espressione sopra - la aggiungerei io stesso ma le modifiche devono essere almeno 6 caratteri apparentemente ...
Paul R

3
@PaulR - Puoi aggiungere un modo <!-- html comment -->per aggirare la limitazione del personaggio nel raro caso in cui un post altrimenti perfetto abbia un piccolo ma importantissimo errore. Questa necessità si verifica molto raramente: di solito ci sono più di 6 caratteri di miglioramento da fare. Ad esempio, quando mancano parentesi quadre, di solito è meglio usare i costrutti \sqrt{}e \frac{}{}in TeX.
Kevin Vermeer,

1
@Kevin: grazie per il suggerimento - Userò il tuo suggerimento per i commenti HTML in futuro.
Paolo R

@PaulR - Questo è stato discusso in precedenza: la restrizione è intenzionale, progettata per prevenire modifiche incomplete o inutili (vedi una difesa qui ), ma ha i suoi avversari (vedi discussione qui ).
Kevin Vermeer,

4
Nota che RMS da solo non ti dice volume. Le frequenze estremamente basse o alte suonano in volume più basso di 3 kHz dello stesso valore RMS. Un filtro di ponderazione A ti fornirà una stima più accurata. gist.github.com/148112
endolith

Risposte:


12

Un'altra cosa è che il valore RMS non è molto ben correlato con il volume percepito. Potresti prendere in considerazione l'idea di chiamarlo a livello o volume. C'è qualcosa chiamato contorni di uguale volume che quantifica la sensibilità dell'orecchio a una particolare frequenza rispetto a un'altra frequenza, vedi l'articolo di Wikipedia . Queste curve dipendono dal livello. Ad esempio, l'orecchio è molto sensibile a un tono di 1kHz rispetto a un tono di 100Hz, come mostrato in questa immagine (l'asse orizzontale è la frequenza in Hz):

contorni di uguale volume

Una delle cose semplici relative che puoi fare è filtrare i tuoi dati PCM con una curva di intensità uguale invertita. Oppure puoi applicare la ponderazione A standard, vedi l' articolo Filtro di ponderazione Wikipedia . Quindi è possibile calcolare il valore RMS dell'uscita del filtro ponderato di uguale intensità.


Non sono chiaro come passare dal codice quesitoner a questo. L'esempio della domanda è la somma dei quadrati dei campioni audio. La risposta sta parlando dell'applicazione del filtro alle frequenze, quindi sembra che "filtrare i dati PCM con una curva di intensità uguale invertita" non sia sufficiente. Devi prima avere il valore per ogni frequenza, quindi puoi capire come applicare la curva, giusto? Ma questo è un grande passo lasciato fuori.
Gman,

@gman L'idea è di preelaborare l'audio con un filtro e quindi utilizzare il risultato come nella domanda (calcolo RMS). Non sono sicuro al 100% di cosa intendi. Non sei sicuro di come eseguire il filtro o forse il design del filtro?
niaren,
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.