Analisi immagine...

Salve a tutti…spero possiate essermi utile…è la mia ultima speranza…ho un certo segnale( vedete figura)…ora…io vorrei scrivere un codice in matlab che automaticamente mi vada a calcolare la frequenza del tratto compreso tra 900 e 1100 circa(sarebbe quel tratto piu largo di segnale)…in pratica quel tratto è un tratto in cui il piede umano trema(freezing) senza riuscire ad andare avanti per una serie di patologie…come detto in presentazione sono un ing.biomedico e ho realizzato un software per l’analisi di una serie di problemi patologici in certe categorie di pazienti…però ora devo risolvere questo problema…in termini spiccioli vorrei che il matlab mi dicesse quel tratto lì tra 900 e 1110 frame ha una frequenza per es di 3 o 4 o 5 Hz il che per il medico signifca che il piede trema 3 o 4 o 5 volte prima di riprendere il normale cammino…quindi nn so come fare…una semplice fft non mi da un risultato molto preciso…mi hanno parlato di wavelet ect però vorrei sapere se qualcuno di voi sa come scrivere un codice che mi fa questa operazione …
P.S. ricordo che l’analisi la voglio fare solo su un pezzo del segnale ( 900 -1100) non su tutto…

SAREI INFINITAMENTE A CHI MI RISOLVA QUESTO PROBLEMA…


segnale.jpg

Ciao senti ma hai un pò di confidenza con matlab?! Non è niente di difficile. Allora inizialmente isola quel pezzo di segnale e lo salvi in un’altra variabile, fai un semplice ciclo for. E poi seguendo la guida di matlab sulla fft procedi passo passo come nell’esempio ed ottieni quello che vuoi. Vedi di scriverti un pezzo di codice, ma fidati devi solamente copiare l’esempio

questo per l’analisi FFT, al posto di y sostituisci il tuo segnale

[code]Fs = 1000; % Frequenza di campionamento
T = 1/Fs; % Tempo di campionamento
L = 1000; % Lunghezza segnale
t = (0:L-1)*T; % Vettore del tempo

% Segnale da analizzare
y = 0.7sin(2pi50t) + sin(2pi120t) + 2randn(size(t));

%Grafico segnale nel tempo
plot(Fs*t(1:50),y(1:50))
title(‘Segnale’)
xlabel(‘tempo (milliseconds)’)

NFFT = 2^nextpow2(L); % Potenza di due più vicina alla lunghezza del segnale da analizzare
Y = fft(y); %FFT del segnale con normalizzazione rispetto alla lunghezza del segnale stesso
f = Fs/2*linspace(0,1,NFFT/2+1); %vettore delle frequenza

% Grafico spettrale del segnale da un solo lato rispetto alle ordinate (la
figure;
plot(f,2*abs(Y(1:NFFT/2+1)))
title(‘Spettro del segnale’)
xlabel(‘Frequenze (Hz)’)
ylabel(’|Y(f)|’)[/code]

qui ti ho messo anche la parte per il ridimensionamento dell’array sui valori che vuoi tu. Se non capisci quali parametri cambiare dimmi pure

[code]Fs = 1000; % Frequenza di campionamento
T = 1/Fs; % Tempo di campionamento

L = 10000; % Lunghezza segnale
t = (0:L-1)*T; % Vettore del tempo

% Segnale da analizzare
y = 0.7sin(2pi50t) + sin(2pi120t) + 2randn(size(t));

L=0; %riazzero il contatore della lunghezza del segnale
for n=1:200
y_new(n)=y(899+n);
end
L=length(y_new);
t = (0:L-1)*T;

%Grafico segnale nel tempo
plot(t,y_new)
title(‘Segnale’)
xlabel(‘tempo (milliseconds)’)

NFFT = 2^nextpow2(L); % Potenza di due più vicina alla lunghezza del segnale da analizzare
Y = fft(y_new); %FFT del segnale con normalizzazione rispetto alla lunghezza del segnale stesso
f = Fs/2*linspace(0,1,NFFT/2+1); %vettore delle frequenza

% Grafico spettrale del segnale da un solo lato rispetto alle ordinate (la
figure;
plot(f,2*abs(Y(1:NFFT/2+1)))
title(‘Spettro del segnale’)
xlabel(‘Frequenze (Hz)’)
ylabel(’|Y(f)|’)[/code]

ancora devo leggere il codice, però solo per aver risposto ti ringrazio infinitamente…spero di capire e che tutto funzioni per non dare piu fastidio…

lo so che mi reputi scocciante…però ti allego il segnale…prova tu col codice che mi hai scritto e se non ti è troppo disturbo dimmi la frequenze che ti trovi nel tratto di segnale che va da 1200 a 1900…non so se ti serve
sapere che il segnale che tu vedi, è un segnale prelevato da un sistema di camere infrarosso campionando il passo
umano a 240 hz…
allora ti dico che mi hanno detto che usare una semplice fft non è molto rigoroso perche il segnale non è stazionario…conosci qualche metodo(da illustrarmi ovviamtne) per fare l’analisi in altro modo? magari wavelet?

e soprattutto, la questione della wavelt è dovuta al fatto che la wavelet mi scorre sul segnale con delle finestre variabili e mi isola il tratto che devo analizzare in automatico(teoricamente lo so, ma in matlab nn so farlo)…e questo è comodo perche io devo inserire il tutto in un software chiuso da proporre a chi nn sa manco cos’è matlab…quindi di volta in volta il tratto “frastagliato” sta in un certo intervallo e a volte in altri, e non posso chiedere a un medico di fare un ciclo for tagliando il segnale laddove ha il tratto interessato…cioe la wavelet , oltre a dare un risultato piu raffinato, mi rende la cosa piu automatizzata…questo è in sintesi il mio problema…

Per il segnale vedo che posso fare ma non devi far altro che usare il codice che ti ho postato. La wavelet si potrebbe usare anche per validare il risultato della FFT ma è molto molto più complicato e non fa nulla in automatico.

Per semplificare il programma potresti scrivere qualche altra riga di codice che ti isoli il tratto di segnale che ti interessa, ma ovviamente devi porre dei canoni standard quando esegui le prove.

Mi spieghi bene le prove sperimentali in cosa consistono?

Ho provato a farlo girare e ti consiglio anche di filtrare il segnale o come minimo di togliere il valor medio

questo è l’andamento nel tempo e nella frequenza ti torna?


premetto che mi dispiace che ti sto “pressando” in questo modo…però visto che sei cosi disponibile cerco di apprendere…non mi ritrovo col segnale nel tempo…ti ri-allego il file txt del segnale e il grafico nel tempo cosi lo vedi per bene…per il discorso del filtraggio hai qualche consiglio? (qualcosa magari di un po sofisticato)…per la wavelet potrei sia fare l’analisi in frequenza che il de-noise però non so come…è cosi difficile da spiegare? grazie

P.S.= questi segnali sono relativi all’andamento del piede di una persona nel tempo durante una camminata…le persone normali, durante la camminata hanno un andamento del piede che è come quello della prima parte del segnale…invece in alcune patologie( Parkinson) le persone mentre camminano possono avere dei fenomeni detti freezing,cioe piedi incollati al terreno…quindi tremano(fanno oscillazioni su e giu col piede) prima di riprendere a camminare…quindi non posso sapere quando e se si verficano sempre questi fenomeni durante una camminata…quello che sto cercando di fare è l’analisi di quei tratti…

nel msg appena sopra tio ho allegato il file.txt del segnale…questo è il suo grafico…nota il freezing tra 1300 a 2500 circa…


segnale.jpg

Ho reimmesso il segnale che mi hai passato, ti allego segnale originale, segnale tagliato da 1200 1900, con la media eliminata, e fft di quest’ultimo troncone di segnale

Qui il codice, come vedi sono pochi i parametri da modificare.

Per il filtro ti consiglio un passa basso per eliminare le alte frequenze nel segnale che tanto non ti servono


Veramente affascinante come ricerca, ed i sensori sono sul pavimento vero? Sensori di pressione? Come ti ho scritto in pm se vuoi altre aiuti non ci sono problemi :slight_smile:

ok mi trovo…diciamo che il freezing quindi ha un range 2-3 Hz…i metodo sei sensori è un modo…io lavoro con un sistema di camere a infrarosso che preleva il segnale proveniente da dei dispositivi catarinfrangenti( palline) poste sul corpo del soggetto…grazie…

P.S.= scusami l’insistenza ma credi sia difficile riportare e spiegarmi tutto in wavelet? e per caso conosci la funzione spectrogram(mi hanno detto che potevo usare anche quella)

si si ho capito i mark giusto?

La funzione spectrogram non la conosco. Con la wavelet è un pò complesso in quanto io l’ho utilizzata solo a livello qualitativo e non quantitativo. Ossia a me è servita per analizzare la variazione di frequenza di un segnale e mi ha permesso di isolare un certo intervallo di tempo dove c’era una stazionarietà del segnale nel dominio della frequenza, cosa che dovresti fare anche tu se il tuo scopo è quello di isolare solamente il tratto di segnale dove avviene il “freezing” giusto? Però per automatizzare questa cosa non ne ho idea, o meglio non è una cosa da poter fare in due minuti.
Perchè se poi devi affidare il tutto a un tecnico che deve solo spingere i tasti sulla tastiera devi costruire un sistema molto robusto per quanto riguarda l’affidabilità dei calcoli e su due piedi non mi viene in mente niente.

Potresti però far plottare l’analisi wavelet e impostare un sistema di input degli estremi che ti interessano del segnale e istruire il tecnico su questa operazione.

Considera che questa è la cwt (analisi wavelet continua) dell’intero segnale con solo la media eliminata. Purtroppo è una cosa un pò lunga e non te la posso fare tutta io, ti allego uno stralcio di codice ma voi cerca di smanettarci tu con i coefficienti e leggiti qualche guida sulla wavelet.

Praticamente la variabile segnale2 l’ho creata importando il file txt che mi hai passato. Il toolbox wavelet non l’ho mai usato quindi non ti so dire, io facevo tutto da riga di comando.

[code]%ANALISI WAVELET
Ts=t(3)-t(2);
signal=segnale2-mean(segnale2);
topa = 128; %topa <= nbcol
colorn = 256;
wname = ‘db8’;

scales = (1:topa);
cwt(signal,scales,wname,‘plot’);
colormap(Hot);%(cool(colorn));
tt = get(gca,‘Yticklabel’);
[r,c] = size(tt);
yl = char(topa*ones(r,c));[/code]

In ogni caso ti consigli anche qui di usare un filtro (basta che cerchi su google è una cosa semplicissima) perchè ti interessano solo le basse frequenze e hai una migliore interpretazione dei risultati


wavelet.jpg

capisco che la cosa è difficile…purtroppo queste cose non le ho trattate al mio corso di laurea…vabbe ci metto una pietra sopra anche se sarebbe stato davvero interessante…anche in ottica di quello che ti ho detto in privato…grazie di tutto valentino :stuck_out_tongue:

Scusa abis86 se mi permetto ma non hai detto che sei un ing. biomedico!?? Allora basta che cerchi su google e in mezza giornata ti studi la wavelet. Neanche io non l’avevo studiata nel mio percorso di laurea ma l’ho utilizzata per la tesi

msg ricevuto…