Dato un flusso audio, trova quando una porta sbatte (calcolo del livello di pressione sonora?)

StackOverflow https://stackoverflow.com/questions/499795

Domanda

Non diversamente da un rilevatore di applausi (" Clap on! clap clap Clap off! clap clap Clap on, clap off, the Clapper! clap clap ") Devo rilevare quando una porta si chiude. Questo è in un veicolo, che è più facile di una stanza o di una porta di casa:

Ascolta: http://ubasics.com/so/van_driver_door_closing.wav

Cerca:
l'immagine della forma d'onda mostra una linea continua, quindi un'interruzione improvvisa, stabilendosi su una linea fissa

Sta campionando a 16 bit 4 khz e vorrei evitare un sacco di elaborazione o archiviazione dei campioni.

Quando lo guardi nell'audacia o in un altro strumento per la forma d'onda è abbastanza distintivo, e quasi sempre si ritaglia a causa dell'aumento della pressione sonora nel veicolo, anche quando i finestrini e le altre porte sono aperte:

Ascolta: http://ubasics.com/so/van_driverdoorclosing_slidingdoorsopen_windowsopen_engine p>

Cerca:
alt text

Mi aspetto che esista un algoritmo relativamente semplice che rileggerebbe letture a 4kHz, 8 bit e tenga traccia dello "stato stazionario". Quando l'algoritmo rileva un aumento significativo del livello del suono, segna il punto.

  • Quali sono i tuoi pensieri?
  • Come rileveresti questo evento?
  • Ci sono esempi di codice di calcoli del livello di pressione sonora che potrebbero essere d'aiuto?
  • Posso cavarmela con campionamenti meno frequenti (1kHz o anche più lenti?)

Aggiornamento: giocare con Octave (analisi numerica open source - simile a Matlab) e vedere se il quadratino della radice mi darà ciò di cui ho bisogno (il che si traduce in qualcosa di molto simile allo SPL)

Aggiornamento2: Il calcolo dell'RMS trova facilmente la porta chiusa nel caso semplice:
alt text  alt text
Ora ho solo bisogno di esaminare i casi difficili (radio accesa, riscaldamento / aria in alto, ecc.). Il CFAR sembra davvero interessante - so che dovrò usare un algoritmo adattivo e CFAR sicuramente si adatta al conto.

-Adam

È stato utile?

Soluzione

Guardando gli screenshot dei file audio sorgente, un modo semplice per rilevare un cambiamento nel livello del suono sarebbe quello di fare un integrazione numerica dei campioni per scoprire " energy " dell'onda in un momento specifico.

Un algoritmo approssimativo sarebbe:

  1. Dividi i campioni in sezioni
  2. Calcola l'energia di ogni sezione
  3. Prendi il rapporto tra le energie tra la finestra precedente e la finestra corrente
  4. Se il rapporto supera una certa soglia, determinare che si è verificato un improvviso rumore forte.

Pseudocodice

samples = load_audio_samples()     // Array containing audio samples
WINDOW_SIZE = 1000                 // Sample window of 1000 samples (example)

for (i = 0; i < samples.length; i += WINDOW_SIZE):
    // Perform a numerical integration of the current window using simple
    // addition of current sample to a sum.
    for (j = 0; j < WINDOW_SIZE; j++):
        energy += samples[i+j]

    // Take ratio of energies of last window and current window, and see
    // if there is a big difference in the energies. If so, there is a
    // sudden loud noise.
    if (energy / last_energy > THRESHOLD):
        sudden_sound_detected()

    last_energy = energy
    energy = 0;

Dovrei aggiungere una dichiarazione di non responsabilità che non ho provato.

In questo modo dovrebbe essere possibile eseguire senza che tutti i campioni siano stati prima registrati. Finché esiste un buffer di una certa lunghezza (WINDOW_SIZE nell'esempio), è possibile eseguire un'integrazione numerica per calcolare l'energia della sezione del suono. Ciò significa, tuttavia, che ci sarà un ritardo nell'elaborazione, a seconda della lunghezza di THRESHOLD. Determinare una buona lunghezza per una sezione del suono è un'altra preoccupazione.

Come suddividere in sezioni

Nel primo file audio, sembra che la durata del suono della chiusura della porta sia di 0,25 secondi, quindi la finestra utilizzata per l'integrazione numerica dovrebbe probabilmente essere al massimo la metà di quella, o anche più simile a & # 12288 un decimo, quindi si può notare la differenza tra il silenzio e il suono improvviso, anche se la finestra si sovrappone tra la sezione silenziosa e la sezione rumore.

Ad esempio, se la finestra di integrazione era di 0,5 secondi e la prima finestra copriva 0,25 secondi di silenzio e 0,25 secondi di chiusura della porta, e la seconda finestra copriva 0,25 secondi di chiusura della porta e 0,25 secondi di silenzio, esso può sembrare che le due sezioni del suono abbiano lo stesso livello di rumore, pertanto, non innescando il rilevamento del suono. Immagino che avere una finestra corta allevierebbe un po 'questo problema.

Tuttavia, avere una finestra troppo corta significa che l'aumento del suono potrebbe non adattarsi completamente a una finestra e potrebbe apparire che c'è poca differenza di energia tra le sezioni adiacenti, che può causare il suono perdere.

Credo che <=> e <=> dovranno entrambi essere determinati empiricamente per il suono che verrà rilevato.

Per determinare quanti campioni questo algoritmo dovrà conservare in memoria, diciamo, <=> è 1/10 del suono della chiusura della porta, che è di circa 0,025 secondi. Ad una frequenza di campionamento di 4 kHz, ovvero 100 campioni. Sembra non essere un requisito di memoria eccessivo. Usando campioni a 16 bit che sono 200 byte.

Vantaggi / Svantaggi

Il vantaggio di questo metodo è che l'elaborazione può essere eseguita con una semplice aritmetica intera se l'audio della sorgente viene immesso come numeri interi. Il problema è, come già detto, che l'elaborazione in tempo reale avrà un ritardo, a seconda delle dimensioni della sezione che è integrata.

Ci sono un paio di problemi a cui posso pensare a questo approccio:

  1. Se il rumore di fondo è troppo forte, la differenza di energia tra il rumore di fondo e la chiusura della porta non sarà facilmente distinguibile e potrebbe non essere in grado di rilevare la chiusura della porta.
  2. Qualsiasi rumore improvviso, come un applauso, potrebbe essere considerato mentre la porta si sta chiudendo.

Forse, combinando i suggerimenti nelle altre risposte, come cercare di analizzare la firma di frequenza della chiusura della porta usando l'analisi di Fourier, che richiederebbe una maggiore elaborazione ma renderebbe meno incline all'errore.

Probabilmente ci vorrà un po 'di sperimentazione prima di trovare un modo per risolvere questo problema.

Altri suggerimenti

Dovresti toccare gli interruttori di chiusura della porta in macchina. Cercare di farlo con un'analisi del suono è troppo ingegneristico.

Ci sono molti suggerimenti sull'elaborazione di segnali diversi approcci da prendere, ma in realtà, quando apprendi il rilevamento teoria, costruire una scheda di elaborazione del segnale integrata, apprendere l'elaborazione architettura per il chip scelto, provare un algoritmo, eseguirne il debug e quindi sintonizzalo sull'auto su cui vuoi usarlo (e poi risintonizza e riesegui il debug per ogni altra macchina), ti augurerai che Stickey abbia registrato una canna passare all'interno dell'auto e incollare a caldo un magnete sulla portiera.

Non che non sia un problema interessante da risolvere per gli esperti di dsp, ma dal modo in cui stai ponendo questa domanda, è chiaro quel suono l'elaborazione non è la strada che vuoi prendere. Sarà solo un incubo per farlo funzionare correttamente.

Inoltre, il batacchio è solo un filtro passa-alto immesso in un rilevatore di soglia. (più un timer per assicurarti che 2 battiti abbastanza velocemente insieme)

C'è molta letteratura rilevante su questo problema nel mondo dei radar (si chiama teoria del rilevamento).

Potresti dare un'occhiata a " cella in media CFAR " (frequenza di falso allarme costante). Wikipedia ha un po ' qui . La tua idea è molto simile a questa e dovrebbe funzionare! :)

Buona fortuna!

Vorrei iniziare guardando lo spettro. L'ho fatto sui due file audio che hai dato e sembra esserci qualche somiglianza che potresti usare. Ad esempio, la differenza principale tra i due sembra essere di circa 40-50Hz. Il mio .02.

Aggiorna

Ho avuto un'altra idea dopo aver pubblicato questo. Se puoi, aggiungi un accelerometro sul dispositivo. Quindi correlano i segnali vibrazionali e acustici . Questo dovrebbe aiutare con il rilevamento della porta del veicolo trasversale. Sto pensando che dovrebbe essere ben correlato dal momento che il suono è guidato dalla vibrazione, dove lo stereo per esempio non lo è. Ho avuto un dispositivo in grado di rilevare il mio regime motore con un supporto per parabrezza (ventosa), quindi la sensibilità potrebbe essere lì. (Non prometto che funzioni!)

 alt text
(fonte: charlesrcook.com )

%% Test Script (Matlab)
clear
hold all %keep plots open
dt=.001

%% Van driver door
data = wavread('van_driver_door_closing.wav');

%Frequency analysis
NFFT = 2^nextpow2(length(data));
Y = fft(data(:,2), NFFT)/length(data);
freq = (1/dt)/2*linspace(0,1,NFFT/2);
spectral = [freq'  2*abs(Y(1:NFFT/2))];

plot(spectral(:,1),spectral(:,2))

%% Repeat for van sliding door
data = wavread('van_driverdoorclosing.wav');

%Frequency analysis
NFFT = 2^nextpow2(length(data));
Y = fft(data(:,2), NFFT)/length(data);
freq = (1/dt)/2*linspace(0,1,NFFT/2);
spectral = [freq'  2*abs(Y(1:NFFT/2))];

plot(spectral(:,1),spectral(:,2))

Il processo per trovare picchi distinti nei segnali audio si chiama rilevamento transitorio . Applicazioni come Ableton Live usa il rilevamento transitorio per trovare i battiti nella musica per fare il beat matching.

Lo spike distinto che vedi nella forma d'onda sopra è chiamato transitorio e ci sono molti buoni algoritmi per rilevarlo. L'articolo descrive 3 metodi per farlo.

Forse dovresti provare a rilevare un significativo aumento istantaneo della pressione dell'aria che dovrebbe chiudere una porta. Puoi abbinarlo a questa forma d'onda e all'analisi del livello sonoro e questi potrebbero darti un risultato migliore.

Per quanto riguarda il campionamento meno frequente, la più alta frequenza sonora che può essere catturata è la metà della frequenza di campionamento. Pertanto, se il suono della portiera dell'auto fosse più forte a 1000Hz (ad esempio), una frequenza di campionamento inferiore a 2000Hz perderebbe completamente quel suono

Un noise gate molto semplice probabilmente andrebbe benissimo nella tua situazione. Aspetta semplicemente il primo campione la cui ampiezza è al di sopra di un valore di soglia specificato (per evitare il trigger con rumore di fondo). Dovresti solo complicarti di più se devi distinguere tra diversi tipi di rumore (ad esempio una chiusura della porta rispetto a un battito di mani).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top