Zero Crossing MatLab
Devo cercare di scrivere uno script che quando eseguito su un dato segnale/grafico (che già ho) mi individui i punti in cui il segnale passa da essere positivo a negativo e poi mi faccia un grafico tracciando solo questi punti.. ho provato in mille modi ma non riesco a trovare una soluzione..
Risposte
Questa è solo una idea.. ma qualcosa come il seguente pensi possa funzionare?
Restituisce gli indici di tutti i valori che hanno un segno diverso del valore a loro successivo.
Adiff = A(:(end-1))*A(2:end); points = find(Adiff <= 0);
Restituisce gli indici di tutti i valori che hanno un segno diverso del valore a loro successivo.
plot(sig_AP, 'y') hold on for i = 1:length(sig_AP)-1 if ( sig_AP(i)>0 && sig_AP(i+1)<0 ) sig_AP(i+1) = 0-sig_AP(i+1); x = sig_AP(i); y = sig_AP(i+1); if ( x > y ) ZC(i) = sig_AP(i+1); else ZC(i) = sig_AP(i); end else ZC(i) = 0; end end ZC = ZC' plot (ZC, 'k')
Io avevo pensato a una cosa del genere ma non funziona, sono un novizio nell'uso di MatLab, il tuo codice non riesco bene a capire i comandi cosa dovrebbe fare?
Non sono sicuro di capire cosa stai cercando di fare all'interno del ciclo. Per trovare i punti è sufficiente confrontare valori successivi, come li vuoi stampare?
Io non voglio stampare valori, come ho detto sopra sto cercando di trovare i punti in cui il segnale che ho passa da essere positivo a negativo e poi rifare un grafico formato solo da questi punti.. ma non riesco
Sì, ho scritto stampare ma intendevo dire farne il grafico. Non capisco come vorresti il grafo alla fine.
"apatriarca":
Sì, ho scritto stampare ma intendevo dire farne il grafico. Non capisco come vorresti il grafo alla fine.
Vorrei semplicemente avere un grafico a punti sovrapposto al segnale che già ho, e questo grafico a punti deve solamente indicare quei punti in cui passo per lo zero (da positivo a negativo).
Per i punti non è sufficiente passare un singolo vettore o ti mostrerà i punti con la coordinata x uguale all'indice. Devi salvarti quindi anche gli indici nel vettore originale e passare dire vettori.
plot(sig_filtrato, 'y') hold on for i = 1:length(sig_filtrato)-1 if (sig_filtrato(i)>0 && sig_filtrato(i+1)<0) prec = sig_filtrato(i); succ = -sig_filtrato(i+1); if(prec>succ) ZC(i)=sig_filtrato(i+1); else ZC(i)=sig_filtrato(i); end end end plot(ZC,'or')
Così riesco a trovare i punti approssimativi dello zero crossing, il problema è che mi esce un grafico che non segna solo quei punti!

"apatriarca":
Per i punti non è sufficiente passare un singolo vettore o ti mostrerà i punti con la coordinata x uguale all'indice. Devi salvarti quindi anche gli indici nel vettore originale e passare dire vettori.
Non capisco proprio come fare questo, io ho il segnale che "plotto" ed è un vettore colonna, poi applicando quel for che ho messo sopra, mi trova un vettore riga... non riesco a capire come salvare in due vettori diversi le coordinate!
plot(sig_filtrato, 'y') hold on for i = 1:length(sig_filtrato)-1 if (sig_filtrato(i)>0 && sig_filtrato(i+1)<0) prec = sig_filtrato(i); succ = -sig_filtrato(i+1); if(prec>succ) ZC(i)=sig_filtrato(i+1); x(i)=i; else ZC(i)=sig_filtrato(i); x(i)=i; end end end plot(x,ZC,'or')
Penso di esserci riuscito!
Sì, c'è forse un punto aggiuntivo dovuto agli elementi per cui non hai definito ZC e x, ma l'idea è più o meno quella. Per eliminare tali elementi puoi scrivere (cambiando l'indice dove necessario).
ZC = [ZC; sig_filtrato(i)]; x = [x; i];
Scusami ma non ho capito ahah.. dove dovrei sostituire queste due righe di codice che mi hai dato?
Al posto di Z(i) = .. invece di assegnare un valore all'elemento stai aggiungendo l'elemento alla fine.
Se scrivo al posto delle varie assegnazioni quella che hai detto tu non mi esce più il grafico

Puoi mostrare il codice? Non ho Matlab qui per cui in realtà non posso fare test.
è identico a quello sopra solo che ho riscritto negli if invece di mettere direttamente ZC(i) = ... il comando che hai detto tu. Stessa cosa per X(i).
Ma come hai dichiarato le due variabili X e ZC? In ogni caso se il tuo funziona non c'è ragione di fare qualcosa di diverso.