Fronte di salita di una matrice di Double.

Messaggioda Pirelli72 » 07/02/2012, 14:12

Buongiorno a tutti e ringrazio anticipatamente a tutti coloro che mi daranno una mano.

Ho una matrice di Double di n elementi ricavata da un'acquisizione analogica di un segnale in tensione. Vorrei ricavare quale sia il primo l'indice della matrice in cui i valori iniziano a salire.

La mia matrice potrebbe essere così composta:
{0.0567677;0.0568677;0.0565677;0.0567677;0.0667677;1.0567677;1.1567677}

Ovviamente non posso impostare una soglia di rilevamento perchè i valori potrebbero cambiare, ad esempio:
{1.0567677;1.0568677;1.0565677;1.0567677;1.0667677;2.0567677;2.1567677}

Attualmente uso questo tipo di algoritmo:
-prendo 5 punti della matrice
-calcolo il coefficiente angolare della retta calcolata tramite la regressione lineare
-lo confronto con una soglia
-se la condizione non viene soddisfatta
-prendo altri 5 punti della matrice e proseguo con la matrice.

L'algoritmo funziona ma vorrei sapere se c'è qualcosa di più performante.
Pirelli72
Starting Member
Starting Member
 
Messaggi: 8
Iscritto il: 07/02/2012, 14:00

Re: Fronte di salita di una matrice di Double.

Messaggioda apatriarca » 07/02/2012, 16:15

C'è un motivo per cui non calcoli semplicemente il rapporto (o la differenza) tra due valori consecutivi e se questo rapporto (o differenza) è maggiore di una certa soglia lo consideri un aumento?
apatriarca
Moderatore
Moderatore
 
Messaggi: 2124
Iscritto il: 08/12/2008, 20:37
Località: Torino

Re: Fronte di salita di una matrice di Double.

Messaggioda Pirelli72 » 07/02/2012, 18:39

Il motivo per cui non posso calcolare la differenza tra due valori consecutivi è che la matrice essendo popolata da un'acquisizione analogica è instabile nell'andamento, per cui potrei avere valori che salgono o scendono anche lievemente. Purtroppo a me interessa sapere quando i valori iniziano a salire oltre una certa soglia, ovvero il valore analogico misurato alla fonte inizia ad impennarsi e non frutto dell'instabilità dell'acquisizione.

Immagine

Come vedi l'andamento non è lineare, a me interessa stabilire i fronti con la freccia rossa.
Pirelli72
Starting Member
Starting Member
 
Messaggi: 8
Iscritto il: 07/02/2012, 14:00

Re: Fronte di salita di una matrice di Double.

Messaggioda apatriarca » 07/02/2012, 19:54

Vuoi insomma trovare i picchi del tuo segnale? Che ne dici di fare qualcosa come considerare una finestra di \(k\) valori che fai scorrere e consideri il valore massimo e minimo all'interno di questa finestra. Se la differenza tra il massimo e il minimo è sufficientemente ampio, hai un picco. Ovviamente è importante scegliere bene questa finestra. Ma non vedo perché l'analisi della differenza (o del rapporto) tra due o più valori consecutivi non sia sufficiente a stabilire i picchi nel tuo programma. Mi sembra abbastanza evidente che normalmente le variazione sono abbastanza limitate in rapporto all'intensità del segnale, mentre i picchi sono un incremento molto alto.
apatriarca
Moderatore
Moderatore
 
Messaggi: 2124
Iscritto il: 08/12/2008, 20:37
Località: Torino

Re: Fronte di salita di una matrice di Double.

Messaggioda Pirelli72 » 07/02/2012, 22:59

In realtà non mi serve trovare tutti i picchi della matrice ma solo i due indicati con la freccia rossa.
Nel dettaglio la mia situazione è la seguente: ho un tamburo che ruota. Su questo tamburo viene depositato un materiale e devo misurare la giunta che viene creata a fine erogazione (il materiale erogato ha uno spessore di circa 1mm). Io calcolo il primo fronte (prima freccia rossa) ovvero quando il materiale passa e poi misuro il secondo fronte di salita (seconda freccia rossa) partendo dalla fine della matrice verso l'indice 0. La matrice è abbastanza cospicua, circa 60.000 elementi.
Provo sicuramente domani la tua prima idea, a quel punto ti chiedo quale potrebbe essere il numero dei K elementi tenendo conto dei parametri che ti ho detto.
Pirelli72
Starting Member
Starting Member
 
Messaggi: 8
Iscritto il: 07/02/2012, 14:00

Re: Fronte di salita di una matrice di Double.

Messaggioda Pirelli72 » 10/02/2012, 11:44

Ok ho inserito come mi hai detto il controllo tra il valore massimo/minimo della mini matrice (nel mio caso di 5 elementi) considerando che a tale intervallo corrispondono circa 3 decimo di millimetro in termine di spazio, Ho comunque lasciato il calcolo del coefficiente angolare in quando mi serve rilevare un fronte positivo e nella mia matrice posso avere alla fine un inizio in discesa. L'unica pecca di tale algoritmo è che è abbastanza lento, l'elaborazione costa circa 200ms e considerando che ne devo fare 4....!!!
Pirelli72
Starting Member
Starting Member
 
Messaggi: 8
Iscritto il: 07/02/2012, 14:00

Re: Fronte di salita di una matrice di Double.

Messaggioda apatriarca » 10/02/2012, 12:01

Mostreresti il codice?
apatriarca
Moderatore
Moderatore
 
Messaggi: 2124
Iscritto il: 08/12/2008, 20:37
Località: Torino

Re: Fronte di salita di una matrice di Double.

Messaggioda Pirelli72 » 10/02/2012, 14:22

Ok, non posto tutto il codice contenuto nella classe ma solo quello relativo all'elaborazione:

Codice: Seleziona tutto
id2 = start + (punti_matrice_tl - 1)
            max = Double.MinValue
            min = Double.MaxValue
            For idx As Integer = start To mmStartEnd
                For u As Integer = idx To id2
                    valoriY(idc) = sx_tl(u)
                    valoriX(idc) = idc
                    If sx_tl(u) > max Then max = sx_tl(u)
                    If sx_tl(u) < min Then min = sx_tl(u)
                    idc += 1
                Next
                idc = 0
                slopeTemp = Nothing
                intercept = Nothing
                mse = Nothing
                trendLineTemp = Nothing
                myAnalisysStat.LinFit(valoriX, valoriY, trendLineTemp, slopeTemp, intercept, mse)
                If CDbl(slopeTemp) > 0.1 AndAlso max - min > soglia_min_fronte Then
                    start = idx
                    Dim media As Single = CSng(myAnalisysStat.Mean(valoriY))
                    For xx As Integer = start To start + punti_matrice_tl
                        If sx_tl(xx) >= media Then
                            _indice1 = xx
                            Exit For
                        End If
                    Next
                    Exit For
                End If
                id2 += 1
            Next



La matrice su cui effettuare l'elaborazione è sx_tl che contiene circa 60000 elementi. Per snellire l'elaborazione ho limitato la quantità di punti da elaborare sia all'inizio che alla fine.
Pirelli72
Starting Member
Starting Member
 
Messaggi: 8
Iscritto il: 07/02/2012, 14:00

Re: Fronte di salita di una matrice di Double.

Messaggioda apatriarca » 10/02/2012, 14:47

Che linguaggio stai usando? Ci sono diverse cose che non capisco dei tuoi valori (cosa sono ad esempio start, mmStartEnd, id2...) e ho l'impressione che tu faccia più cicli di quanti non siano necessari sui dati. Avevo in mente qualcosa di più minimal, anche se non vedendo più l'immagine non mi è chiaro che cosa abbiano effettivamente di particolare i due picchi a cui siamo interessati e se sia possibile trovarli in modo più diretto.
apatriarca
Moderatore
Moderatore
 
Messaggi: 2124
Iscritto il: 08/12/2008, 20:37
Località: Torino

Re: Fronte di salita di una matrice di Double.

Messaggioda Pirelli72 » 10/02/2012, 15:08

Sto usando VB.NET.
Non riesco a snellire piu di così.
Alla ricapitoliamo: ho una matrice di circa 60000 elementi. Il primo fronte sicuramente c'è l'ho dopo il 20.000° indice, per cui la mia variabile start mi indica quale sia l'indice di partenza (è parametrizzato per poterlo spostare, se necessario) e diciamo che ora è 20.000. L'altra variabile mmStartEnd indica dove fermarsi perchè per me è inutile proseguire la ricerca del fronte oltre questo indice e diciamo che questa variabile è impostata a 24.000.
Per cui semplificando ho:

Codice: Seleziona tutto
max = Double.MinValue
min = Double.MaxValue
            For idx As Integer = 20000 To 24000
                For u As Integer = idx To id2
                    valoriY(idc) = sx_tl(u)
                    valoriX(idc) = idc
                    If sx_tl(u) > max Then max = sx_tl(u)
                    If sx_tl(u) < min Then min = sx_tl(u)
                    idc += 1
                Next

                idc = 0
                slopeTemp = Nothing
                intercept = Nothing
                mse = Nothing
                trendLineTemp = Nothing
                myAnalisysStat.LinFit(valoriX, valoriY, trendLineTemp, slopeTemp, intercept, mse)
                If CDbl(slopeTemp) > 0.1 AndAlso max - min > soglia_min_fronte Then
                    start = idx
                    Dim media As Single = CSng(myAnalisysStat.Mean(valoriY))
                    For xx As Integer = start To start + punti_matrice_tl
                        If sx_tl(xx) >= media Then
                            _indice1 = xx
                            _indice1_h = sx_tl(_indice1 - ((1000 / unita_ing_tl) * 5))
                            Exit For
                        End If
                    Next
                    Exit For
                End If
                id2 += 1
            Next


...popolo la mia mini matrice valoriY di 5 elementi shiftando l'indice di 1 ogni volta in questo modo:
Se la mia matrice sx_tl ad esempio è così composta: {1,2,1,3,2,4,5,8,9,11,8,9,8......}
le mie mini matrici saranno così composte:
{1,2,1,3,2}
{2,1,3,2,4}
{1,3,2,4,5}
{3,2,4,5,8}

di ogni mini matrice calcolo lo slope e il massimo e il minimo.
Se lo slope è positivo e la differenza tra Max e Min è superiore a un certo valore allora sono di fronte ad un picco positivo.

Ora ho la mini matrice che soddisfa le mie condizioni ma a me interessa sapere qual'è l'indice preciso in cui la curva inizia a salire. Per cui mi sono inventato di calcolarmi la media della mini matrice, fare un confronto, il primo valore che supera la media è l'indice che mi interessa.
Pirelli72
Starting Member
Starting Member
 
Messaggi: 8
Iscritto il: 07/02/2012, 14:00

Prossimo

Torna a Informatica

Chi c’è in linea

Visitano il forum: valentina92 e 1 ospite