PDA

View Full Version : Filtrare un Segnale in matlab.


pakopako
11-05-2017, 17:34
Buonasera, ho un segnale di accelerazione che registra su un file i valori lungo i 3 assi ogni 10ms, quindi la frequenza di campionamento dovrebbe essere 100Hz.

Ciò che vorrei chiedervi e se qualcuno potrebbe indicarmi come è possibile filtrare questo segnale.

Poichè l'accelerometro mi da picchi molto alti in determinate situazioni, ma che costituiscono solo una piccola parte del segnale (questi sono quelli che mi interessano principalmente), io necessito di smussare e quindi filtrare tutti i valori di accelerazione che sono compresi diciamo tra 1m/s^2 e -1m/s^2.

Ora, ho fatto la trasformata di Fourier di questo segnale attraverso il seguente codice:

L = length(segnale);
f = Fs*(0 : (L/2)) /L; %%Viene creato il dominio di Frequenza.
Y = fft(segnale); %%Viene applicata la trasformata di Fourier


P2 = abs(Y/L);
P1 = P2(1:floor(L/2)+1);
P1(2:end-1) = 2*P1(2:end-1);

dOut = P1;
plot(f,dOut)

title('Single-Sided Amplitude Spectrum of Data(t)')
xlabel('f (Hz)')
ylabel('|P1(f)|')



Quindi io vado ad analizzare tutto ciò che ricade tra 0 e 50Hz, in accordo al Teorema di Nyquist, per l'aliasing del segnale.

A seguito di questa trasformata, come posso capire quale parte del mio segnale rappresenta il rumore, e quale parte invece i dati che non voglio "toccare"?

E una volta determinata la frequenza in cui attenuare il rumore come è possibile creare un filtro che mi consenta di poter successivamente integrare il segnale?


Link delle foto della trasformata di Fourier, e del Segnale Originale.

http://imgur.com/e9Zn5kG
http://imgur.com/k3TJiZa

pakopako
11-05-2017, 23:35
Ciao, Grazie per la risposta,
Metto i link delle immagini cosi magari si possono visualizzare:

Questa riguarda il segnale originale.
http://imgur.com/k3TJiZa

Questa la trasformata di FFT
http://imgur.com/e9Zn5kG


Come si vede dal segnale vi sono molti valori che sono compresi tra -1 e 1, che costituiscono per la maggiore i dati del segnale stesso. Ciò che dovrei fare è effettuare l'integrazione di questo segnale.
Tuttavia se lo effettuo su questo segnale così, non ottengo nulla poichè vi è molto rumore, e vorrei appunto filtrato, e il risultato che dovrei ottenere sostanzialmente dal segnale filtrato, e che i valori del segnale originale diciamo >2 e <-2 non dovrebbero cambiare, e attenuare tutti quelli più bassi, quindi la forma del segnale non mi deve cambiare di molto in corrispondenza dei picchi diciamo alti, non so se mi sono ben spiegato,

Ora per applicare il filtro, non riesco a capire a quale frequenza effettuare il taglio, vedendo il risultato di fourier, ho pensato che le componenti con maggior rumore sono tra 10 e 15 Hz, e ho provato ad applicare un filtro passa-basso butter del 6 ordine con frequenza di taglio 15Hz/(100Hz/2). Ma è come se non mi cambiasse nulla, e cambiano solo i valori alti(>2 e <-2), che è esattamente l'opposto di quello che desidero.

Quindi sicuramente sto sbagliando qualcosa, o mi manca altro per poter filtrare correttamente il segnale.

pakopako
12-05-2017, 17:29
Grazie ancora per la risposta.

In scala logaritmica il segnale dovrebbe uscire cosi:
http://imgur.com/a/S7K3X

Il mio problema è proprio che non riesco a capire come identificare il rumore dalla trasformata di Fourier, cioè io vorrei solo smussare i dati per poter effettuare l'integrazione perchè così giustamente non mi esce nulla.

Perdonami ma non ho capito a cosa ti riferisci per rumore bianco.

pakopako
31-05-2017, 17:26
Penso di esser riuscito a tirar fuori lo spettogramma, da questo cosa riesco a capire? quale parte del segnale ha rumore e quale non? e che tipo di filtraggio sarebbe opportuno?
Da quello che penso, come mi hai detto precedentemente sembra che il segnale sia davvero molto rumoroso.

http://imgur.com/a/OfpNm


Per fare lo spettogramma ho utilizzato:
periodogram(x,rectwin(length(x)),length(x))

pakopako
01-06-2017, 11:15
Perchè io di questo segnale devo effettuare una doppia integrazione, ma non mi serve lo spostamento finale, ma lo spostamento punto per punto, provo a fare un esempio di ciò che intendo:

Essendo il segnale di un'accelerazione verticale, se per esempio ho dei valori di accelerazione di 6 m/s^2, penso che lo spostamento verticale sia elevato rispetto ai punti in cui ho valori di accelerazione vicini allo 0, in cui mi apsetto uno spostamento quasi nulla. Il problema che applicando un filtro a media mobile, il segnale si è vero che si smussa, ma se effettuo l'integrazione di esso non ottengo nulla come risposta valida, non so se magari è sbagliata proprio la procedura d'integrazione allora, perchè al momento sto utilizzando a funzione

cumtrapz(segnale) * dt;

kikino
08-07-2017, 02:20
Perchè io di questo segnale devo effettuare una doppia integrazione, ma non mi serve lo spostamento finale, ma lo spostamento punto per punto, provo a fare un esempio di ciò che intendo:

Essendo il segnale di un'accelerazione verticale, se per esempio ho dei valori di accelerazione di 6 m/s^2, penso che lo spostamento verticale sia elevato rispetto ai punti in cui ho valori di accelerazione vicini allo 0, in cui mi apsetto uno spostamento quasi nulla. Il problema che applicando un filtro a media mobile, il segnale si è vero che si smussa, ma se effettuo l'integrazione di esso non ottengo nulla come risposta valida, non so se magari è sbagliata proprio la procedura d'integrazione allora, perchè al momento sto utilizzando a funzione

cumtrapz(segnale) * dt;

pako esattamente il tuo accelerometro che tipo di sorgente sta analizzando?
magari se informi quello possiamo capire se il segnale ha delle caratteristiche stimabili