ciò che sta levigando in termini molto basilari


17

Cos'è il smoothing e come posso farlo?

Ho una matrice in Matlab che è lo spettro di grandezza di un segnale vocale (la grandezza di 128 punti di FFT). Come posso lisciarlo usando una media mobile? Da quello che ho capito, dovrei prendere una dimensione della finestra di un certo numero di elementi, prendere la media e questo diventa il nuovo primo elemento. Quindi sposta la finestra a destra di un elemento, prendi la media che diventa il 2 ° elemento e così via. Funziona davvero così? Non sono sicuro di me stesso poiché se lo faccio, nel mio risultato finale avrò meno di 128 elementi. Quindi, come funziona e in che modo aiuta a livellare i punti dati? O c'è un altro modo in cui posso fare il livellamento dei dati?

EDIT: collegamento alla domanda di follow-up


per uno spettro che probabilmente si desidera mediare insieme (nella dimensione temporale) più spettri anziché una media corrente lungo l'asse di frequenza di un singolo spettro
endolite

@endolith sono entrambe tecniche valide. La media nel dominio della frequenza (a volte chiamato periodogramma Danielle) è la stessa finestra nel dominio del tempo. La media di più periodogrammi ("spettri") è un tentativo di imitare la media di ensemble richiesta per il vero periodogramma (questo è chiamato periodogramma di Welch). Inoltre, per quanto riguarda la semantica, direi che il "smoothing" è un filtro passa basso non causale. Vedi filtro Kalman vs Kalman smoothing, Wiener filtering Wiener smoothing, ecc. C'è una distinzione non banale e dipende dall'implementazione.
Bryan,

Risposte:


23

Il livellamento può essere fatto in molti modi, ma in termini molto basilari e generali significa che è possibile anche livellare un segnale, mescolando i suoi elementi con i loro vicini. Spalmi / offuschi un po 'il segnale per eliminare il rumore. Ad esempio, una tecnica di livellamento molto semplice sarebbe quella di ricalcolare ogni elemento del segnale f(t)come 0,8 del valore originale, più 0,1 di ciascuno dei suoi vicini:

f'(t) = 0.1*f(t-1) + 0.8*f(t) + 0.1*f(t+1)

Nota come i fattori di moltiplicazione, o pesi, si sommano a uno. Quindi, se il segnale è abbastanza costante, il livellamento non cambia molto. Ma se il segnale contenesse un improvviso cambiamento a scatti, il contributo dei suoi vicini aiuterà a chiarire un po 'quel rumore.

I pesi utilizzati in questa funzione di ricalcolo possono essere chiamati kernel . Nel tuo caso dovrebbe fare una funzione gaussiana unidimensionale o qualsiasi altro kernel di base.

Bell'esempio di un particolare tipo di levigatura:

Sopra: segnale non
livellato Sotto: segnale livellato

inserisci qui la descrizione dell'immagine

Esempi di alcuni kernel:

inserisci qui la descrizione dell'immagine


quindi questa è una media mobile ponderata? Questo si chiama con una dimensione della finestra di 3? E il primo e l'ultimo elemento? E come verrebbe modificato se avessi un array di 128 elementi e volessi usare una finestra di 16 o 32 elementi?

@ user13267: Sì, si potrebbe dire che un kernel di smoothing è una media mobile ponderata. Se usi un kernel uniforme (vedi seconda immagine), è solo una media mobile. Hai ragione sulla dimensione della finestra. Per gestire i bordi, esistono tre approcci di base: 1) zero-padding dei dati, 2) ripetizione dell'ultimo valore, 3) mirroring del segnale. In ogni caso, fai alcuni dati finti in modo che il tuo kernel non cada nel nulla.
Junuxx,

lo zero padding non sarebbe considerato cadere nel nulla? Alla fine del processo di media mobile, il mio nuovo set di dati "medio" dovrebbe avere lo stesso numero di dati dell'originale, no? quindi se zero lo pad all'inizio o alla fine, o ripeto gli ultimi dati, non distorcerebbe il valore medio ai bordi dell'array? E come sarebbe utile il mirroring del segnale in termini di numero di termini dati? Esiste un semplice tutorial per questo che mostri come avviene il processo per, diciamo, 32 punti dati e una dimensione della finestra di 4 o 5?

2
Se si desidera che il set di dati smoothed abbia la stessa lunghezza del set di dati originale, è necessario "recuperare" i dati agli endpoint. Qualsiasi scelta tu faccia per come creare tali dati distorce la media in qualche modo. Il trattamento dei dati fuori limite come un mirror del set di dati reale (ovvero supponendo che il campione N + 1 sia uguale a N-1, N + 2 = N-2, ecc.) Conserverà le caratteristiche dello spettro di frequenza del parti finali del segnale, mentre assumendo una ripetizione zero o non zero, sembrerà che tutte le frequenze stiano rotolando alle estremità.
Russell Borogove,

8

Oltre alla bella risposta di Junuxx, vorrei lasciare alcune note.

  • Il livellamento è correlato al filtro (purtroppo abbastanza vago articolo di Wikipedia ) - dovresti scegliere quello più liscio in base alle sue proprietà.

  • Uno dei miei preferiti è il filtro mediano . Questo è un esempio di filtro non lineare. Ha alcune proprietà interessanti, conserva gli "spigoli" ed è abbastanza robusto con un grande rumore.

  • Se hai un modello su come si comporta il tuo segnale, vale la pena dare un'occhiata a un filtro Kalman . Il suo livellamento è in realtà una stima della massima probabilità bayesiana del segnale basata su osservazioni.


4

Il livellamento implica l'utilizzo di informazioni provenienti da campioni vicini al fine di modificare la relazione tra campioni vicini. Per i vettori finiti, alle estremità, non ci sono informazioni vicine da un lato. Le tue scelte sono: non levigare / filtrare le estremità, accettare un vettore levigato risultante più corto, truccare i dati e attenuarli (dipende dall'accuratezza / utilità di eventuali previsioni al di fuori delle estremità), o magari usare diversi kernel di smussatura asimmetrici a le estremità (che finisce per accorciare comunque il contenuto delle informazioni nel segnale).


3

È possibile trovare l'intero codice matlab per smussare il filtro della media mobile per diverse lunghezze di tocchi. www.gaussianwaves.com/2010/11/moving-average-filter-ma-filter-2/


1

Altri hanno menzionato il modo in cui esegui il livellamento, vorrei menzionare il motivo per cui il livellamento funziona.

Se si sovracampiona correttamente il segnale, esso varierà relativamente poco da un campione all'altro (campione = punti temporali, pixel, ecc.) E si prevede che abbia un aspetto uniforme. In altre parole, il segnale contiene poche alte frequenze, ovvero componenti del segnale che variano a una frequenza simile alla frequenza di campionamento.

Tuttavia, le misurazioni sono spesso corrotte dal rumore. In una prima approssimazione, di solito consideriamo il rumore che segue una distribuzione gaussiana con zero medio e una certa deviazione standard che viene semplicemente aggiunta in cima al segnale.

Per ridurre il rumore nel nostro segnale, facciamo comunemente le seguenti quattro ipotesi: il rumore è casuale, non è correlato tra i campioni, ha una media di zero e il segnale è sufficientemente sovracampionato. Con questi presupposti, possiamo usare un filtro medio scorrevole.

Considera, ad esempio, tre campioni consecutivi. Poiché il segnale è fortemente sovracampionato, si può considerare che il segnale sottostante cambi linearmente, il che significa che la media del segnale attraverso i tre campioni equivarrebbe al segnale vero nel campione centrale. Al contrario, il rumore ha zero medio ed è non correlato, il che significa che la sua media dovrebbe tendere a zero. Pertanto, possiamo applicare un filtro medio scorrevole a tre campioni, in cui sostituiamo ogni campione con la media tra se stesso e i suoi due vicini adiacenti.

Ovviamente, più grande è la finestra, più il rumore sarà in media a zero, ma meno la nostra ipotesi di linearità del vero segnale vale. Pertanto, dobbiamo fare un compromesso. Un modo per tentare di ottenere il meglio da entrambi i mondi è quello di utilizzare una media ponderata, in cui diamo campioni più lontani campioni di pesi più piccoli, in modo da mediare gli effetti del rumore da intervalli più ampi, senza ponderare troppo il segnale vero dove si discosta dalla nostra linearità assunzione.

Il modo in cui dovresti mettere i pesi dipende dal rumore, dal segnale e dall'efficienza computazionale e, naturalmente, dal compromesso tra sbarazzarsi del rumore e tagliare il segnale.

Si noti che negli ultimi anni è stato svolto molto lavoro per consentirci di rilassare alcune delle quattro assunzioni, ad esempio progettando schemi di smoothing con finestre a filtro variabile (diffusione anisotropica) o schemi che non utilizzano realmente Windows affatto (mezzi non locali).

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.