Domanda

Aggiorna questa domanda era stata precedentemente denominata " Dammi il nome di un semplice algoritmo per il rilevamento di segnali (suono) "

  1. Il mio obiettivo è rilevare la presenza di un determinato schema in un segnale rumoroso. Voglio rilevare la presenza di una specie di insetto che registra i suoni con un microfono. In precedenza ho registrato il suono dell'insetto in formato digitale.
  2. Non sto provando a fare il riconoscimento vocale.
  3. Sto già usando la convoluzione tra il segnale di input e il pattern per determinare il loro livello di somiglianza. Ma penso che questa tecnica sia più adatta al tempo discreto (cioè alle comunicazioni digitali, in cui i segnali si verificano a intervalli fissi) e per distinguere un segnale di ingresso tra 2 modelli dati (ho solo un modello).
  4. Ho paura di usare le reti neurali, perché non le ho mai usate e non so se potrei incorporare quel codice.

Potresti indicarmi altri approcci o provare a convincermi che il mio approccio attuale è ancora una buona idea o che le reti neurali potrebbero essere un modo fattibile?

Aggiorna Ho già 2 buone risposte, ma un'altra sarebbe benvenuta e persino premiata.

È stato utile?

Soluzione

Un passo avanti rispetto alla convoluzione è distorsione temporale dinamica che può essere considerata un operatore di convoluzione che allunga e restringe un segnale per abbinarlo in modo ottimale a un altro.

Forse un approccio più semplice sarebbe quello di fare una FFT del campione e determinare se il tuo insetto ha delle frequenze particolari che possono essere filtrate.

Sul lato più complesso, ma non proprio una rete neurale, ci sono toolkit SVM come libsvm e svmlight a cui puoi inviare i tuoi dati.

Indipendentemente dal percorso che tenterai, passerei il tempo ad esplorare la natura del suono prodotto dal tuo insetto usando strumenti come FFT. Dopotutto, sarà più facile insegnare a un computer a classificare il suono se puoi farlo da solo.

Altri suggerimenti

Sembra un tipico un problema di classificazione di una classe cioè tu vuoi cercare una cosa in una vasta gamma di altre cose che non ti interessano.

Quello che vuoi fare è trovare una serie di caratteristiche o descrittori che puoi calcolare per ogni breve pezzo della tua registrazione non elaborata che puoi quindi confrontare con le caratteristiche prodotte dalla tua registrazione pulita. Non penso che la convoluzione sia necessariamente negativa, sebbene sia piuttosto sensibile al rumore, quindi potrebbe non essere ottimale per il tuo caso. Ciò che potrebbe effettivamente funzionare nel tuo caso è la corrispondenza dei pattern su una trasformata di Fourier in binn. Prendi la trasformata di Fourier del tuo segnale, dandoti un grafico di potenza vs frequenza (piuttosto che un grafico di potenza vs tempo), quindi dividi la frequenza in bande e prendi la potenza media per ogni banda come caratteristica. Se i tuoi dati contengono principalmente rumore bianco, il patern che ricevi da un suono di insetto crudo di lunghezza simile corrisponderà molto attentamente al modello del tuo suono di riferimento. Quest'ultimo trucco è stato usato con successo (con alcune finestre) per decifrare i captcha audio usati da google et al i loro siti accessibili ai non vedenti.

A proposito, perché il tuo segnale audio grezzo è digitale (altrimenti l'elaborazione con un computer non funzionerà ;-)) la convoluzione è appropriata. È necessario eseguire la convoluzione tra il segnale di riferimento e un campione di uguale lunghezza dall'input non elaborato a partire da ciascun campione. Quindi, se il tuo segnale di riferimento ha lunghezza N e il tuo campione grezzo ha lunghezza M dove M > = N, allora dovresti eseguire le convoluzioni M-N + 1 = P tra il tuo segnale di riferimento e campioni P dall'input grezzo a partire da 1 .. P. La migliore possibilità per la posizione del suono di riferimento nel campione grezzo è il campione con il punteggio di convoluzione più alto. Si noti che questo diventa follemente tempo molto rapidamente.

Corrispondenza basata sulla trasformata di Fourier, come ho spiegato sopra, utilizzando campioni sovrapposti del 50% dai dati grezzi di una lunghezza doppia rispetto al campione di riferimento sarebbe almeno più veloce (anche se non necessariamente migliore)

Sono necessarie ulteriori informazioni.

Quando dici un segnale rumoroso qual è il rumore di fondo? È, per una prima approssimazione, stazionario (in senso statistico, cioè costante) o non è stazionario (cioè probabilmente contiene altri suoni, come altre chiamate di animali, ecc?)

Se il rumore di fondo non è stazionario, la soluzione migliore potrebbe essere quella di utilizzare qualcosa chiamato Analisi dei componenti indipendenti che tenta di separare una determinata miscela sonora nelle sue fonti componenti, non avresti nemmeno bisogno della registrazione originale dell'insetto stesso. Molti software ICA sono collegati dalla pagina di Wikipedia.

(Modifica: ICA è un caso di Blind Source Separation ( BSS), ci sono molti altri modi di fare BSS e potrebbe aiutare a cercare anche quelli.)

Se, tuttavia, il rumore di fondo è fermo, il problema è molto più semplice (anche se ancora molto difficile):

In questo caso l'approccio che vorrei usare è il seguente. Analizza lo spettro di ampiezza di un po 'di rumore e lo spettro di ampiezza della tua chiamata di insetto. Se sei fortunato, la chiamata dell'insetto può, in generale, essere in una banda di frequenza diversa dal rumore. In tal caso, filtrare il segnale in ingresso con un filtro passa-alto, passa-basso o passa-banda adatto.

Puoi quindi provare a confrontare sezioni del tuo segnale filtrato che contengono " più energia " della media con il tuo insetto (filtrato). Forse usando gli algoritmi di somiglianza delle immagini suggeriti da A. Rex.

Modifica : poiché il rumore di fondo non è stazionario, posso solo suggerire che la ricerca di La separazione della fonte cieca di fonti non gaussiane può portare ad alcuni altri algoritmi. Temo che la risposta sia che non esiste nessun semplice algoritmo che farà ciò che desideri.

Se fossi in te inizieresti a leggere un po 'di Window Window come la finestra di Hamming, questo è un buon punto di partenza per il riconoscimento del suono. (Questo, ovviamente, combinato con Trasformata di Fourier )

Puoi provare un filtro abbinato. Anche se non ne ho mai usato uno, ho sentito cose positive.

Inoltre, anche se non semplice, penso che un modello Markov nascosto (HMM, so che hai detto di non riconoscere il parlato, ma ascoltami!) ti fornirebbe i migliori risultati. Ancora una volta, non ne ho mai usato uno ma ci sono implementazioni open source disponibili ovunque. Dovresti solo allenarlo usando il tuo "pulito" quotato esistente registrazione degli insetti. Ecco un'implementazione open source: Biblioteca generale di modelli nascosti Markov .

È vero che questa non è la mia area di competenza, ma il mio primo pensiero è un filtro dei minimi quadrati ricorsivo - esegue l'autocorrelazione. È simile al filtro di convoluzione che stai utilizzando ora, ma un po 'più avanzato. Il filtro Kalman è un'estensione di questo: viene utilizzato per rigenerare un segnale da più misurazioni rumorose, quindi probabilmente non è utile in questo caso. Non rifiuterei le reti neurali fuori mano - sono molto utili in questo genere di cose (a condizione che le addestriate correttamente).

Pensandoci più approfonditamente, probabilmente consiglierei di usare una FFT. È probabile che il segnale che stai cercando sia molto limitato di banda e probabilmente avresti più fortuna usando un filtro passa-banda sui dati quindi un FFT e infine usando il tuo semplice filtro di convoluzione su quei dati invece dei dati nel dominio del tempo punti. Oppure fai entrambi e hai il doppio dei dati. Non sono molto interessato alla matematica, quindi non posso dirti se otterrai questo risultato significativo (non linearmente dipendente) usando questo metodo, ma l'unica cosa che perdi è il tempo.

Potresti essere interessato a una MA Toolbox , un'implementazione di Matlab di misure di somiglianza.

Ho trovato personalmente questo documento, Classificazione generale del suono e somiglianza in MPEG-7 , interessante. Tuttavia, potrebbe essere dietro un paywall (non lo so) e potrebbe non essere così utile in pratica.

Il framework GPL-ed Marsyas ha uno strumento per la classificazione dell'apprendimento automatico, chiamato kea. La mia ipotesi è che questo probabilmente non fa quello che vuoi o è troppo sforzo per collegarti.

La mia unica idea è quella di prendere trasformazioni di Fourier, trasformando efficacemente i tuoi suoni in immagini in scala di grigi. Quindi utilizza uno dei molti algoritmi di somiglianza delle immagini .

Un Naive Bayes Classifier può essere utile qui, classificando campioni sonori in quelli che contengono il tuo specie di interesse e quelle che non lo fanno. Funziona abbastanza bene per fenomeni complessi; Una volta l'ho usato per decidere se un determinato set di dati RADAR a onde millimetriche conteneva un ostacolo come pennello, trappola per serbatoio, ecc. Per quanto riguarda come suddividere i dati continui in blocchi discreti per il classificatore bayesiano, potresti semplicemente scorrere lungo il set di dati continuo e spezza pezzi di lunghezza uguale al campione di insetto. Ad esempio, se il campione con cui stai confrontando è lungo 2 secondi, potresti alimentare il discriminatore 0-2s, 0,5-2,5s, 1-3s, ecc. Dovrai addestrare il discriminatore, ma questo è comune requisito di qualsiasi soluzione basata sull'apprendimento automatico.

Questo tipo di approccio è l'unico modo per procedere se la tua specie di insetto non ha un suono unico, relativamente distinto che stai cercando. La correlazione incrociata / convoluzione sono di utilità limitata se stai cercando qualcosa di più complesso di un singolo suono che può essere a volume più alto o più basso.

Esistono implementazioni ingenui del classificatore Bayes per diverse lingue, come nbc .

Potresti desiderare un filtro Wiener .

Google: algoritmo FastICA. Alcuni usano l'ICA e la separazione del segnale sorgente cieca in modo intercambiabile. L'autore dell'algoritmo ha scritto un libro fantastico su ICA che è circa $ 40- $ 60 usato su Amazon.

Goertzel: puoi usarlo sia per un semplice rilevamento di pattern, sia per una separazione complicata delle frequenze. Puoi vedere l'esempio di la mia implementazione in C #

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