2010-05-27 14 views
8

Sto utilizzando la classe AudioRecord per analizzare i byte pcm grezzi nel microfono.Byte PCM Android

Questo funziona bene. Ora ho bisogno di convertire i byte pcm in decibel.

Ho una formula che prende la pressione del suono in Pa in db.

db = 20 * log10 (Pa/ref Pa)

Quindi la domanda è il byte sto ottenendo dal Audiorecorder dal buffer ciò che è è esso ampiezza della pressione sonora pascal o cosa.

ho cercato di mettere il valore in te formula ma torna con molto alta db quindi non credo che il suo diritto

grazie

+0

1+ Voto positivo a tutti per ottime informazioni. Ringrazia tutti. – Terrance

+0

Ho bisogno di aiuto da solo perché sto cercando di fare la stessa cosa! Ho i byte pcm crudi come te, ma quando uso la tua formula esce infinito:/Come sto registrando sto usando gli ultimi 2 valori byte nell'array di byte, è sbagliato? – Neeta

risposta

11

Disclaimer: So poco di Android.

Il dispositivo sta probabilmente registrando in mono a 44.100 campioni al secondo (forse meno) utilizzando due byte per campione. Quindi il primo passo è quello di combinare coppie di byte nei dati originali in numeri interi a due byte (non so come sia fatto in Android).

È quindi possibile calcolare il valore in decibel (rispetto al picco) di ogni campione in primo luogo prendendo il valore assoluto normalizzato del campione e passandolo alla funzione Db:

float Db = 20 * log10(ABS(sampleVal)/32768) 

Un valore vicino al picco (ad esempio +32767 o -32768) avrà un valore Db vicino a 0. Un valore di 3277 (0,1) avrà un valore Db di -20; un valore di 327 (.01) avrà un valore Db di -40 ecc.

+0

Ciao Grazie a tutti sembra funzionare con questa formula. I valori sono +32767 o -32768 intervallo. – Pintac

+0

Una domanda solo per farmi pensare. Quale unità di misura è il valore campione – Pintac

+4

In senso stretto, il valore campione rappresenta l'uscita di tensione istantanea da un microfono (dove +32767 rappresenta la tensione positiva massima e -32768 rappresenta la tensione negativa minima). A causa di come funzionano i microfoni, questa tensione è correlata a * cambiamenti * della pressione sonora dalla media locale - quando un microfono registra un suono, la pressione dell'aria attorno al microfono sale leggermente verso l'alto e verso il basso, che sposta una membrana avanti e indietro producendo un tensione alternata positiva e negativa. Un convertitore ADC (analogico-digitale) campiona questa tensione 44100 volte al secondo ... – MusiGenesis

1

Il problema è probabilmente la definizione della pressione sonora "di riferimento" al microfono. Non ho idea di cosa sarebbe o se è disponibile.

L'unica applicazione audio che abbia mai utilizzato, definita 0db come "full volume", quando i campioni erano al valore + o - max (nei 16 bit senza segno, che sarebbero 0 e 65535). Per ottenere questo in db probabilmente sarei fare qualcosa di simile:

// assume input_sample is in the range 0 to 65535 
sample = (input_sample * 10.0) - 327675.0 
db = log10(sample/327675.0) 

Non so se è vero, ma ci si sente diritto al matematicamente mi ha sfidato. Come input_sample si avvicina al "medio", sembrerà sempre più simile all'infinito negativo.

Ora che ci penso, però, se vuoi un SPL o qualcosa che potrebbe richiedere trucchi diversi come fare la valutazione RMS tra gli zero crossing, di nuovo qualcosa che ho potuto solo intuire perché non ho idea di come sia davvero lavori.

+1

Chiudi, eccetto che gli esempi PCM sono * firmati * a 16 bit (quindi non è necessaria la sottrazione dell'offset). Inoltre, almeno nel mio universo, non puoi prendere il log di un numero negativo. :) – MusiGenesis

+0

Ha ha buoni punti tutti. Sono sempre firmati? Ho pensato che una volta dovevo trattare con i dati PCM che non erano firmati (potrebbe essere errato, ovviamente). –

+0

Avrei dovuto dire che PCM è * solitamente * firmato - I formati PCM e RAW PCM a 1 byte per campione sono senza segno, ma sono piuttosto rari in circolazione (l'audio del CD è firmato). – MusiGenesis

2

La pressione di riferimento nei calcoli di Leq (livello di pressione sonora) è di 20 micro-Pascal (valore efficace). Per misurare i livelli assoluti di Leq, è necessario calibrare il microfono utilizzando un calibratore. La maggior parte dei calibratori misura capsule da 1/2 "o 1/4", quindi ho i miei dubbi sulla calibrazione del microfono su un telefono Android. In alternativa, è possibile utilizzare la sensibilità del microfono (Pa/mV) e quindi calibrare il livello di tensione nell'ADC. Risultati ancora meno affidabili si possono ottenere confrontando i valori di Android con il livello sonoro misurato di un campo sonoro stazionario diffuso utilizzando un fonometro. Si noti che nei calcoli Leq si utilizzano normalmente i valori RMS. Il valore di un singolo campione non significa molto.

+0

Quello che voglio veramente fare con il db è capire il volume (carico) dell'audio se va più in alto di un certo volume (loadness in db) voglio fare qualcosa. Ho una tabella di riferimento di db http://en.wikipedia.org/wiki/Sound_pressure#Examples_of_sound_pressure_and_sound_pressure_levels – Pintac

+1

In un modo o nell'altro è necessario calibrare il sistema. Almeno dovresti confrontare i tuoi valori calcolati con un livello sonoro conosciuto. I valori indicati nella voce di Wikipedia sono probabilmente i livelli sonori ponderati A, in cui il livello sonoro in ciascuna banda di ottava viene ponderato in modo da ottenere un valore complessivo. Il Leq viene solitamente assegnato per ogni banda di ottava. – Han

+0

il valore di esempio che sto ottenendo è +32767 a -32768 quale unità è questa è l'ampiezza pressione sonora volt wats ... – Pintac

2

Ho tenuto il mio fonometro proprio accanto al microfono sul mio google e sono andato 'Woooooo!'e ha notato che il taglio si è verificato a circa 105 db spl. Spero che questo ti aiuti.

1

Le unità sono tutte le unità utilizzate per la lettura di riferimento. Nella formula, la lettura è divisa per la lettura di riferimento, quindi le unità si cancellano e non contano più.

In altre parole, il decibel è un modo di confrontare due cose, non è una misurazione assoluta. Quando lo vedi usato come se fosse assoluto, allora il confronto è con il suono più silenzioso che l'umano medio può sentire.

Nel nostro caso, si tratta di un confronto con la lettura più alta delle maniglie del dispositivo (quindi, ogni altra lettura è negativa o inferiore al massimo).

Problemi correlati