Analisi di Fourier dei segnali
Ciao, sto cercando di studiare dei segnali con l'analisi di Fourier. In pratica devo individuare le frequenze principali di un segnale facendone la trasformata di Fourier, poi devo rimuoverne alcune manualmente dalla trasformata e fare la trasformazione inversa per ottenere il segnale ripulito. Ho un dubbio sulla procedura che seguo, che vorrei fosse sciolto.
Il problema è che la trasformata di Fourier di un segnale è in generale complessa, quindi non plottabile in un grafico x-y. Inoltre modificando la trasformata e poi facendo la trasformazione inversa non ottengo un segnale reale, anche se il segnale di partenza lo era.
Ho pensato quindi, anzichè prendere la trasformata prenderne il modulo, e lo stesso per la trasformazione inversa. Mi sembra infatti che così facendo shifto solo il tutto di un fattore di fase globale (nel dominio delle frequenze), che corrisponde ad una traslazione rigida del segnale nel dominio dei tempi. E' così o in realtà così facendo rischio di deformare il segnale?
Il problema è che la trasformata di Fourier di un segnale è in generale complessa, quindi non plottabile in un grafico x-y. Inoltre modificando la trasformata e poi facendo la trasformazione inversa non ottengo un segnale reale, anche se il segnale di partenza lo era.
Ho pensato quindi, anzichè prendere la trasformata prenderne il modulo, e lo stesso per la trasformazione inversa. Mi sembra infatti che così facendo shifto solo il tutto di un fattore di fase globale (nel dominio delle frequenze), che corrisponde ad una traslazione rigida del segnale nel dominio dei tempi. E' così o in realtà così facendo rischio di deformare il segnale?
Risposte
Purtroppo mi sono accorto che non è come pensavo, perchè le trasformate di Fourier di seno e coseno non differiscono solo per un fattore $i$, ma cambia anche il segno relativo tra le due delta di Dirac. Ma allora come risolvo il fatto di non potere lavorare con una trasformata complessa per individuare le frequenze principali?
Ho un programma che trova automaticamente le frequenze principali, ma mi interessava capire come funziona.
Ho un programma che trova automaticamente le frequenze principali, ma mi interessava capire come funziona.
Up
Credo che in applicazioni del genere sia più comodo usare la teoria delle Wavelet...
Da quel che ho visto, usando l'analisi di Fourier, non è la trasformata di Fourier che si usa per trovare le frequenze principali, ma lo spettro di potenza, ovvero la trasformata di Fourier dell'autocorrelazione.
Non mi è chiaro però se e come è possibile fare il passaggio inverso, cioè da uno spettro di potenza ricostruire il segnale temporale.
@ Hadronen
Grazie per il suggerimento sulle wavelet, però vanno bene pure per visualizzare componenti comuni e non comuni tra due segnali? (un po' come con le trasformate di Fourier si trovano le frequenze principali comuni)
Se è così forse vale la pena che penso a studiarmele per applicarle.
Non mi è chiaro però se e come è possibile fare il passaggio inverso, cioè da uno spettro di potenza ricostruire il segnale temporale.
@ Hadronen
Grazie per il suggerimento sulle wavelet, però vanno bene pure per visualizzare componenti comuni e non comuni tra due segnali? (un po' come con le trasformate di Fourier si trovano le frequenze principali comuni)
Se è così forse vale la pena che penso a studiarmele per applicarle.
Da uno spettro di potenza puoi ricostruire l'autocorrelazione del segnale con la trasformata inversa di Fourier, ma non puoi ricostruire il segnale originale.
Ok, quindi ho pensato che se voglio ripulire un segnale dai contributi dovuti a delle frequenze che non mi piacciono la procedura potrebbe essere questa:
1. Creare la trasformata di Fourier e lo spettro di potenza;
2. Nello spettro di potenza individuare le frequenze $omega_i$ che non mi piacciono;
3. Imporre pari a 0 i valori delle trasformata in $ +- omega_i$;
4. Calcolare la trasformata inversa di quella modificata.
Se faccio cosi' dovrei garantirmi anche di riottenere un segnale reale, poiche' l'operazione 3 conserva la simmetria.
Ti pare corretto?
1. Creare la trasformata di Fourier e lo spettro di potenza;
2. Nello spettro di potenza individuare le frequenze $omega_i$ che non mi piacciono;
3. Imporre pari a 0 i valori delle trasformata in $ +- omega_i$;
4. Calcolare la trasformata inversa di quella modificata.
Se faccio cosi' dovrei garantirmi anche di riottenere un segnale reale, poiche' l'operazione 3 conserva la simmetria.
Ti pare corretto?
"robbstark":
1. Creare la trasformata di Fourier e lo spettro di potenza;
La trasformata di Fourier basta.
"robbstark":
Se faccio cosi' dovrei garantirmi anche di riottenere un segnale reale
Ti pare corretto?
sì
Grazie per avermi chiarito; ora penso non dovrei più avere problemi a mettere in pratica questo metodo. (Mi resta poi da studiare le wavelet e capirne i vantaggi)
La trasformata di Fourier basta.
[/quote]
Capisco che in teoria può bastare, ma dovrei fare i controlli incrociati parte reale e immaginaria, perchè non è detto che una frequenza sia rilevante in entrambe. Se poi è distribuita metà e metà magari è difficile rilevarla in entrambi gli spettri (parlo di un caso concreto). Quindi lo spettro di potenza mi sembra più preciso per trovare le frequenze principali.
wnvl:
[quote=robbstark]
1. Creare la trasformata di Fourier e lo spettro di potenza;
La trasformata di Fourier basta.
[/quote]
Capisco che in teoria può bastare, ma dovrei fare i controlli incrociati parte reale e immaginaria, perchè non è detto che una frequenza sia rilevante in entrambe. Se poi è distribuita metà e metà magari è difficile rilevarla in entrambi gli spettri (parlo di un caso concreto). Quindi lo spettro di potenza mi sembra più preciso per trovare le frequenze principali.
"robbstark":
Ok, quindi ho pensato che se voglio ripulire un segnale dai contributi dovuti a delle frequenze che non mi piacciono la procedura potrebbe essere questa:
1. Creare la trasformata di Fourier e lo spettro di potenza;
2. Nello spettro di potenza individuare le frequenze $omega_i$ che non mi piacciono;
3. Imporre pari a 0 i valori delle trasformata in $ +- omega_i$;
4. Calcolare la trasformata inversa di quella modificata.
Se faccio cosi' dovrei garantirmi anche di riottenere un segnale reale, poiche' l'operazione 3 conserva la simmetria.
Ti pare corretto?
Mi scuso dapprima per l'immenso ritardo... Mi ero scordato di aver risposto qui e casualmente ci sono ricapitato! ehehe!
Sì, boh... Idealmente. Ma porre a 0 alcune frequenze $w_i$ crea del ringing in prossimità delle tali... Dipende da cio' che devi farci, sì... Se si tratta di un'immagine il nostro apparato visivo è decisamente sensibile ad una modulazione del ringing; se, invece, si tratta di un segnale audio direi che l'effetto è decisamente meno spiacevole, ricordandoci che comunque si tratta di istanti... Tuttavia non ne sono sicuro! Certo è che il segnale che vai a ricostruire viene distorto...
Forse è meglio attenuare certe frequenze...
Oppure oppure oppure troncare un intorno delle $w_i$ spiacevoli con qualche funzione non troppo ripida, così da spianare un po' quel fenomeno di ringing. (portarlo ad esempio ad un 2-3% di escursione) Ma anche qui poi bisogna vedere/sentire il risultato.
Insomma, i modi di operare sono tanti tanti... Ogni modo, una qualche sperimentazione potrebbe illuminarti la strada!

"robbstark":
Capisco che in teoria può bastare, ma dovrei fare i controlli incrociati parte reale e immaginaria, perchè non è detto che una frequenza sia rilevante in entrambe. Se poi è distribuita metà e metà magari è difficile rilevarla in entrambi gli spettri (parlo di un caso concreto). Quindi lo spettro di potenza mi sembra più preciso per trovare le frequenze principali.
Chiaro, se sono segnali acustici prendi il modulo! (...ma non si chiama spettro di potenza! bensì di ampiezza)
Grazie comunque. Diciamo che ho fatto un po' di esperimenti, piu' o meno ho capito i meccanismi.
L'idea era per separare un segnale da un miscuglio di segnali, pero' da quel che ho osservato pare che non riesca bene, probabilmente perche' lo spettro del segnale che voglio separare si sovrappone a quello di tutto il resto che voglio togliere.
Volevo chiederti invece cosa faresti per eliminare del white noise. Ovviamente la prima idea che ho avuto e' stata di tagliare le alte frequenze, ma non mi dispiacerebbe sapere se ci sono metodi piu' adeguati ed efficaci.
L'idea era per separare un segnale da un miscuglio di segnali, pero' da quel che ho osservato pare che non riesca bene, probabilmente perche' lo spettro del segnale che voglio separare si sovrappone a quello di tutto il resto che voglio togliere.
Volevo chiederti invece cosa faresti per eliminare del white noise. Ovviamente la prima idea che ho avuto e' stata di tagliare le alte frequenze, ma non mi dispiacerebbe sapere se ci sono metodi piu' adeguati ed efficaci.
"robbstark":
Grazie comunque. Diciamo che ho fatto un po' di esperimenti, piu' o meno ho capito i meccanismi.
L'idea era per separare un segnale da un miscuglio di segnali, pero' da quel che ho osservato pare che non riesca bene, probabilmente perche' lo spettro del segnale che voglio separare si sovrappone a quello di tutto il resto che voglio togliere.
Volevo chiederti invece cosa faresti per eliminare del white noise. Ovviamente la prima idea che ho avuto e' stata di tagliare le alte frequenze, ma non mi dispiacerebbe sapere se ci sono metodi piu' adeguati ed efficaci.
Se il rumore è uniformemente distribuito, come dovrebbe essere il rumore bianco, direi che puoi studiarti le applicazioni del Filtro di Wiener, va più che bene.

Grazie, ci darò un'occhiata presto.
"robbstark":
Grazie, ci darò un'occhiata presto.
Sì, non farà male, aggiungo che potresti anche usare la DWT (Discrete Wavelet Transform), applicare dunque un Tresholding al segnale, ovvero eliminare i coefficienti di dettaglio minori di un certo livello di soglia, e successivamente invertire con la IDWT... Il metodo è decisamente semplice (nell'applicazione) e con programmi come MATLAB, ad esempio, puoi simularlo perfettamente e in brevissimo tempo. Bisogna comunque vedere quanto poi il processo risponde alle nostre esigenze, come sempre.