STFT e DWT (Wavelets)


12

STFT può essere utilizzato con successo su dati audio (ad esempio con un file audio .wav) per apportare alcune modifiche al dominio della frequenza (esempio: rimozione del rumore).
Con N=441000(cioè 10 secondi alla frequenza di campionamento fs=44100), windowsize=4096, overlap=4, STFT produce approssimativamente un 430x4096array (prima coordinata: lasso di tempo, seconda coordinata: bin di frequenza). Le modifiche possono essere eseguite su questo array e la ricostruzione può essere effettuata con overlap-add (*).

Come è possibile fare una cosa simile con le wavelet ? (DWT), ovvero ottenere un array di forma simile a x b, con aintervalli di tempo e bbin di frequenza, apportare alcune modifiche a questo array e, alla fine, recuperare un segnale? Come ? Qual è l'equivalente wavelet di overlap-add ? Quali sarebbero le funzioni di Python coinvolte qui (non ho trovato un semplice esempio di modifica audio con pyWavelets...)?

(*): Ecco il framework STFT che può essere utilizzato:

signal = stft.Stft(x, 4096, 4)    # x is the input
modified_signal = np.zeros(signal.shape, dtype=np.complex)

for i in xrange(signal.shape[0]):    # Process each STFT frame
    modified_signal[i, :] =  signal[i, :] * .....  # here do something in order to
                                                   # modify the signal in frequency domain !
y = stft.OverlapAdd(modified_signal, 4)   # y is the output

L'obiettivo è quello di trovare un quadro simile con wavelets.


Un commento a margine : fare quel tipo di "filtraggio" su STFT è una pessima idea. Non è un ottimo modo per fare la maggior parte delle cose che vuoi davvero fare. Cosa stai effettivamente cercando di ottenere?
Peter K.

Nota che PyWavelets è solo per la trasformazione discreta wavelet. Se vuoi fare cose simili a STFT, capiresti più facilmente la trasformazione wavelet continua, come la costante trasformazione Q, che è una trasformazione di Gabor, essenzialmente la stessa cosa di una complessa trasformazione wavelet continua di Morlet , ma è progettata per essere invertibile: grrrr.org/research/software/nsgt
endolith

1
(questa domanda ripresa da "Community".) secondo me, le wavelet si sovrappongono e si aggiungono in un modo molto simile a STFT. quindi non capisco bene la natura della domanda.
robert bristow-johnson,

Sono necessari ulteriori dettagli?
Laurent Duval,

Risposte:


4

La trasformata di Fourier di breve durata è generalmente una trasformazione ridondante, di solito implementata con lo stesso sottocampionamento su ogni frequenza. Se la finestra è ben scelta, è completa: è possibile invertirla e recuperare qualsiasi segnale iniziale.

Dal momento che è ridondante e completo, ha molte inversioni perfette. Può essere implementato e compreso utilizzando strumenti più generici: banchi di filtri complessi (sovra-campionati). Dato un tipo di finestra e lunghezza più la sovrapposizione fornisce un banco di filtri di analisi per il quale è possibile calcolare se è invertibile o meno. In tal caso, puoi calcolare un inverso naturale e anche inversi ottimizzati . L'overlap-add è solo uno dei molti potenziali inversi, probabilmente il più comune, che spesso limita la scelta della finestra.

Anche le trasformate wavelet discrete standard sono banchi di filtri, con la differenza che il sottocampionamento non è lo stesso in ciascuna banda di frequenza (o scala più propriamente). Questo si trasforma in lunghezze irregolari per ogni scala. Tuttavia, esistono implementazioni wavelet ridondanti che producono "una matrice rettangolare" di coefficienti con cui è possibile lavorare. Gli schemi più noti sono chiamati con nomi diversi: wavelet shift-invariant o time-invariant , wavelet non decimate, trasformata wavelet fissa(SWT) e talvolta la rotazione del ciclo. La sua ricostruzione standard prevede passaggi simili a quelli di sovrapposizione, tranne per il fatto che sono più "incorporati" a causa dei diversi fattori di campionamento sulle scale. Puoi usarli con qualsiasi wavelet discreto da una libreria o anche progettando il tuo wavelet. Il motivo è che le wavelet discrete standard sono state progettate pensando alla non ridondanza, il che limita la scelta delle wavelet. Con la ridondanza, la scelta delle wavelet aumenta, poiché i vincoli da soddisfare sono meno rigorosi. L'avatar "ultimo" è la trasformazione wavelet continua, che ammette "quasi" ogni wavelet di sintesi inversa. La mia ultima frase è piuttosto schifosa, spero che tu abbia il significato: quando una matrice quadrata è invertibile, ha solo un inverso. Quando una matrice "rettangolare" è invertibile a sinistra in modo generalizzato,

Sembra che ci sia un'implementazione in pitone della trasformazione stazionaria di wavelet . Puoi trovare alcuni riferimenti nella 2.3.4. Traduzione del capitolo wavelet invarianti del documento collegato .

È generalmente molto più robusto per il rilevamento, il denoising o il ripristino in applicazioni pratiche (geofisica, test non distruttivi, ultrasuoni, vibrazioni).


"Ridondante" significa "ha più informazioni nell'output di quelle necessarie per riprodurre l'input"?
endolith

1
Esattamente. Generalmente per un segnale sample, si ottengono coefficienti M > N dopo la trasformazione. Ciò significa che puoi usarlo a tuo vantaggio. Ad esempio, ottieni diversi potenziali inversi, alcuni più pratici di altri. Ancora più importante, durante l'elaborazione nel dominio di trasformazione (miglioramento, rilevamento, denoising, filtro adattativo, ripristino, deconvoluzione, separazione della sorgente) si ottiene robustezza e minore sensibilità al rumore. Ciò deriva dall'ulteriore "diversità" nei dati trasformati. Se usato correttamente solo ...NM>N
Laurent Duval,

3

Il motivo per cui è necessario sovrapporre aggiungere / sovrapporre i salvataggi per il filtraggio con la trasformata di Fourier in breve tempo è fondamentalmente che le funzioni di base associate ai coefficienti ottenuti sono definite in un determinato intervallo di tempo (al contrario di un singolo punto nel tempo). La trasformata di Fourier che usi per calcolare i coefficienti di espansione implementa anche la convoluzione su un dominio circolare definito dalla lunghezza del tuo frame di segnale. Ciò significa che i due punti finali della cornice sono realmente identificati e chiusi in un cerchio. Questo è il motivo per cui devi assicurarti che le funzioni di base dei coefficienti che modifichi non influenzino mai entrambe le estremità del fotogramma.

Le wavelet non sono né autovettori per la traduzione del tempo né sono calcolati usando la convoluzione circolare. Ciò significa che non è necessario aggiungere o salvare sovrapposizioni o altri metodi che si occupano degli effetti collaterali della convoluzione circolare. Invece, i vettori della base wavelet sono solo una possibile base per descrivere il tuo segnale. La trasformazione wavelet (completa, discreta, possibilmente ortogonale) non è quindi altro che un cambiamento di base dalla base del dominio del tempo alla base del dominio wavelet. Le modifiche di base possono essere invertite (applicando l'inverso della matrice di modifica di base che ti ha portato lì) e puoi tornare al dominio del tempo.

I parametri forniti come dimensioni della finestra, sovrapposizione, frequenza di campionamento non sono tutti applicabili alla trasformazione wavelet. L'unica cosa di cui hai bisogno è una madre wavelet. Se si desidera confrontare i risultati con l'output STFT, è possibile selezionare uno qualsiasi dei vettori di base STFT (ovvero la finestra moltiplicata per un vettore esponenziale complesso) come prototipo wavelet. Quindi applichi la trasformazione wavelet veloce, che decompone il tuo segnale in un albero di segnali filtrati e decimati passa alto e basso che alla fine diventano i tuoi coefficienti. Ogni coefficiente è associato a un vettore di base wavelet e ai suoi parametri (scala, tempo) o (frequenza, tempo). È possibile manipolare i coefficienti e quindi applicare la trasformata wavelet discreta inversa. Prenderanno i tuoi coefficienti e li faranno passare attraverso un banco di filtri di risintesi per produrre di nuovo un segnale.

Questi processi non sono banali e probabilmente difficili da digerire per un principiante. Ma dovresti essere in grado di trovare librerie / toolbox per la tua piattaforma preferita che implementano la rapida trasformazione wavelet e il suo inverso. Tuttavia, se si desidera realizzare la propria base wavelet, sarà necessario derivare i coefficienti di filtro per i banchi di filtri di decomposizione e sintesi. Ciò richiede una profonda teoria e probabilmente dovrai prima studiarla.

Esistono altri sapori della trasformazione wavelet, vale a dire la trasformazione wavelet continua che funziona con una base incompleta. È sia molto più lento da calcolare sia molto più difficile da invertire, quindi al momento non è un'opzione per quello che vuoi fare.


1
Grazie per la tua risposta. Il motivo principale per cui sto cercando di avere un framework di codice è che l'ho sempre notato (dalla mia infanzia a qualche anno fa, quando ho finito il mio dottorato di ricerca (ovviamente non legato al DSP, se così non lo chiedessi quindi domande per i principianti qui!)) è che manipolare alcuni materiali della vita reale (ad esempio il segnale audio in DSP) aiuta molto a comprendere la teoria profonda. Quello che vorrei codice è: Audio sound -> Wavelet transform -> (do something on the array) -> Inversion -> Audio output. Con molto (fare qualcosa sull'array), sono sicuro che capirò un po 'di più su come funzionano le wavelet.
Basj,

1
@Basj, poi fai come ho detto. Trova una libreria Python che supporti sia la trasformazione wavelet veloce sia la sua inversa, quindi gioca con l'albero dei coefficienti generato. Buona fortuna e buon divertimento!
Jazzmaniac,

"non sono tutti applicabili alla trasformata wavelet" Sono applicabili a CWT, giusto?
endolith,

1

Esistono molti modi per definire una base wavelet. In genere un wavelet assomiglia a qualcosa del tipo:

wx0,k0(x)=Aexp(ik0x)e(k0(xx0))

x0k0eAk

(x0,k0)(x0,k0)

Poiché la dimensionalità dei dati trasformati supera quella del segnale, la base wavelet non sarà ortonormale. Vale a dire quanto segue sarà falso:

wk0,x0|wk0,x0=δ(x0,x0)δ(k0,k0)

Aw

x0,k0|wx0,k01k0wx0,k0|=identity

In altre parole, puoi ricostruire perfettamente il segnale semplicemente sommando le sue wavelet costituenti.

La tua "modifica" può essere semplicemente inserita nella somma sopra:

my_filter=x0,k0|wx0,k0f(x0,k0)wx0,k0|

Aggiornamento 19-11-2013: aggiunta dei dettagli di implementazione di seguito come richiesto.

f(x)

cx0,k0=wx0,k0|f

k0cx0,k0x0ffw0,k0cx0,k0

  • ff^
  • k01/4
    • f^w^0,k0
    • [kl,kr)w^0,k0
    • Applica una trasformazione inversa di Fourier a quella.
    • exp(ixkl+kr2)cx0,k0x0

k0x0w0,k0k0k0

cx0,k0k0

Troncare gli spettri a volte introduce problemi di normalizzazione, a seconda di come è definita la tua FFT. Non cercherò di coprire tutte le possibilità qui. La normalizzazione è fondamentalmente un problema facile. ;-)

w^x0,k0(k)wx0,k0(x)

w^x0,k0=Aexp(i(kk0)x0)exp((Qlog(k/k0))2)

QAk0


1
Grazie per aver ricordato questi punti importanti sulla teoria wavelet, che sono davvero necessari per capire come funziona. Ma qui la domanda sarebbe di più sulla costruzione di un codice quadro che funzionerebbe ad esempio sul segnale audio. Le domande sono: come gestire queste somme infinite, come scegliere le finestre (o meglio madre-wavelet ), come farlo usando pyWavelets in Python (o in un altro linguaggio equivalente, poi tradurrò in Python), come scegli i parametri (come nel mio esempio per l'audio: frequenza di campionamento = 44100, finestra fft = 4096, sovrapposizione = 4, ecc.)
Basj

akk|kakk|=Id

K

akakf

1
Il modo migliore per vedere se funziona o no sarebbe quello di fornire un esempio di codice minimo (con pyWavelet per esempio dovrebbe essere possibile in poche righe immagino) (lo farò bene una volta che lo capirò, penso di
Ho
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.