Hilbert si trasforma per calcolare l'inviluppo del segnale?


27

Ho sentito che la trasformazione di Hilbert può essere utilizzata per calcolare l'inviluppo di un segnale. Come funziona? E in che modo questa "busta di Hilbert" è diversa dalla busta che si ottiene semplicemente rettificando un segnale?

Sono interessato in particolare a trovare un modo per calcolare un inviluppo da utilizzare nella compressione della gamma dinamica (ovvero "abbassare il volume" delle parti rumorose di un segnale audio automaticamente).


hai qualche codice funzionante ora? o con la trasformazione di Hilbert o un altro metodo?
Basj,

Risposte:


18

La trasformata di Hilbert viene utilizzata per calcolare il segnale "analitico". Vedi ad esempio http://en.wikipedia.org/wiki/Analytic_signal . Se il tuo segnale è un'onda sinusoidale o un'onda sinusoidale modulata, l'entità del segnale analitico apparirà effettivamente come l'inviluppo. Tuttavia, il calcolo della trasformazione di Hilbert non è banale. Tecnicamente richiede un filtro FIR non causale di notevole lunghezza, quindi richiederà una buona quantità di MIPS, memoria e latenza.

Per un segnale a banda larga, dipende davvero da come si definisce "inviluppo" per l'applicazione specifica. Per la tua applicazione della compressione della gamma dinamica vuoi una metrica che sia ben correlata con la percezione del volume nel tempo. La trasformazione di Hilbert non è lo strumento giusto per questo.

Un'opzione migliore sarebbe quella di applicare un filtro ponderato A ( http://en.wikipedia.org/wiki/A-weighting ) e quindi eseguire un picco con perdita o un rilevatore RMS con perdita. Ciò si correlerà abbastanza bene con il volume percepito nel tempo ed è relativamente economico da fare.


Entrambi sono non causali, ma il metodo FFT (buttare via metà dello spettro e IFFT) di solito è più veloce del filtro FIR?
endolith,

Inoltre, in che modo il metodo FFT per calcolare la trasformazione di Hilbert richiede non causalità? Uno probabilmente ha solo bisogno di una finestra abbastanza grande per ottenere utili forme di busta.
mavavilj,

4

È possibile utilizzare la trasformazione di Hilbert per calcolare una busta nel modo seguente. (Lo scriverò come codice MATLAB):

envelope = abs(hilbert(yourTimeDomainSignal));

Non ho tempo di scrivere la matematica in questo momento, (ci proverò più avanti), ma molto semplicemente, dire che il tuo segnale è un'onda sinusoidale. La trasformata di Hilbert di un seno è una -cosina. (In altre parole, la trasformazione di Hilbert ti darà sempre il segnale spostato di una fase di -90 gradi - la sua quadratura in altre parole).

Se aggiungi il tuo segnale (l'onda sinusoidale) a jvolte il tuo segnale hilberted, (onda sinusoidale), ottieni:

sin(wt) - j.*cos(wt)

Che è anche e ^ (j * (wt - pi / 2)).

Quindi, quando prendi il valore assoluto di questo, ottieni 1, che è la tua busta. (Per questo caso).


Oops! Ho dimenticato il segno negativo - grazie Dilip, risolto ora.
Spacey,

2

Sono a conoscenza di almeno due modi separati per recuperare l'inviluppo di ampiezza da un segnale.

L'equazione chiave è:

E(t)^2 = S(t)^2 + Q(S(t))^2

Where Q represents a π/2 phase shift (also known as quadrature signal).

Il modo più semplice di cui sono a conoscenza è ottenere Q sarebbe di scomporre S (t) in un gruppo di componenti sinusoidali usando FFT, ruotare ciascun componente di un quarto di giro in senso antiorario (ricordare che ciascun componente sarà un numero complesso, quindi un particolare componente x + iy -> -y + ix) e poi ricombina.

Questo approccio funziona abbastanza bene, anche se richiede un po 'di ottimizzazione (non ho ancora capito abbastanza bene la matematica per spiegarlo in modo migliore)

Ci sono un paio di termini chiave qui, vale a dire "trasformata di Hilbert" e "segnale analitico"

Sto evitando di usare questi termini perché sono abbastanza sicuro di aver visto una notevole ambiguità nel loro uso.

Un documento descrive il segnale (complesso) analitico di un segnale reale originale f (t) come:

Analytic(f(t)) = f(t) + i.H(f(t))

where H(f(t)) represents the 'π/2 phase shift' of f(t)

nel qual caso l'inviluppo dell'ampiezza è semplicemente | Analitico (f (t)) |, che ci riporta all'equazione pitagorica originale

NB: Di recente mi sono imbattuto in una tecnica più avanzata che prevede lo spostamento di frequenza e un filtro digitale passa basso. La teoria è che possiamo costruire il segnale analitico con mezzi diversi; scomponiamo f (t) in componenti di frequenza sinusoidali positive e negative e quindi rimuoviamo semplicemente i componenti negativi e raddoppiamo i componenti positivi. ed è possibile eseguire questa "rimozione dei componenti di frequenza negativa" mediante una combinazione di spostamento di frequenza e filtro passa basso. questo può essere fatto estremamente velocemente usando i filtri digitali. Non ho ancora esplorato questo approccio, quindi questo è quanto posso dire al momento.


1
Questi sono tutti modi diversi di calcolare la stessa cosa (grandezza del segnale analitico attraverso una trasformata di Hilbert). La tecnica "avanzata" è semplicemente fare un FFT, azzerare le frequenze negative e quindi fare un FFT inverso. La parte reale è il segnale originale e la parte immaginaria che ne trasforma Hilbert. Il diavolo è nei dettagli come inquadratura, finestre, sovrapposizioni e elaborazione lineare vs. circolare.
Hilmar,

2
È scoraggiante vedere che qualcuno ha ritenuto opportuno premiare il tempo e l'energia che ho dato a questa comunità (tramite il post sopra) con un voto negativo. Un post che contiene buone informazioni solide che saranno di beneficio a qualcuno.
P

2
@Hilmar, esiste un modo migliore di "rimuovere le frequenze negative" per ottenere la trasformazione di Hilbert. Come ho detto, un modo che non coinvolge FFT. Alla luce di quanto sopra, non mi sento particolarmente entusiasta di dettagliarlo in questo momento.
P

Apprezzo la tua risposta dettagliata sulla trasformazione di Hilbert; voleva assicurare che questo fosse ben accolto, quindi non scoraggiato. Si prega di ignorare il voto negativo di chiunque.

0

quindi in pratica stai cercando un controllo automatico del guadagno (AGC). Non sono sicuro se è necessario farlo elaborando digitalmente, ma ci sono ottimi circuiti integrati là fuori che possono svolgere molto bene quel compito, di solito l'AGC è integrato con molte altre funzionalità, ma alcuni circuiti possono essere creati con transistor JFET e alcuni diodi.

Ma un modo facilmente comprensibile di farlo con l'elaborazione digitale sarebbe quello di progettare uno stimatore di varianza adattiva, come prendere una finestra temporale di campioni sufficienti per rappresentare 5 o 10 msec e applicare un fattore di dimenticanza alpha ^ n (alpha <1) quindi ogni nuovo campione che viene preso viene preso in considerazione più dei campioni precedenti. quindi in base a questa stima della varianza che si progetta secondo il proprio desiderio, una funzione che mappa la varianza su un guadagno che si applica a ciascun campione audio. questo potrebbe essere un limite di decisione difficile, mentre se la varianza supera una soglia si riduce il guadagno di un fattore.

O potrebbe essere un limite di decisione più morbido, in cui si crea una trasformazione non lineare dalla varianza per guadagnare e si applica la trasformazione a ogni campione in base all'ultima stima della varianza.

Questi sono metodi più euristici ma almeno ti salva da tutta la matematica pesante.

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.