Forum Italiano sui Prodotti NI

annulla
Visualizzazione dei risultati per 
Cerca invece 
Intendevi dire: 

Finestra mobile

Salve a tutti,

sto cercando di creare un sistema che mi permetta di calcolare la deviazione standard su una finestra di 1000 campioni. Questa finestra deve mantenere questa grandezza e deve scorrere di 100 campioni alla volta. Ho un sistema di acquisizione dal quale acquisisco un segnale di spostamento verticale (tramite laser) e lo leggo tramite DAQ assistant. Ho impostato un numero di campioni pari a 100 e un rate di 1000 Hz. 

Come posso procedere?

 

Grazie

0 Kudos
Messaggio 1 di 11
154Visualizzazioni

What software are you using? Is this a LabVIEW question?

0 Kudos
Messaggio 2 di 11
144Visualizzazioni

Yes it's a LabVIEW question

0 Kudos
Messaggio 3 di 11
115Visualizzazioni

Quindi tu hai (o avrai) un while loop in cui si leggono 100 campioni alla volta. A questo loop puoi aggiungere uno shift register (SR) inizializzato con un array da 1000 elementi (campioni). Ad ogni lettura andrai a sostituire un blocco di 100 elementi nello SR con Replace Array Subset. La prima volta sostituirai il blocco con indici da 0 a 99, la seconda da 100 a 199, ecc. Una volta sostituito l'ultimo blocco (900-999), potrai cominciare ad analizzare. La volta successiva dovrai ricominciare con il blocco 0-99 eccetera. Per effettuare il riposizionamento potrai usare opportunamente l'indice del loop  (Loop iteration) modulo 10.

Paolo
-------------------
LV 7.1, 2011, 2017, 2019, 2021
Messaggio 4 di 11
100Visualizzazioni

Ti ringrazio per la risposta ora provo,

 

Inizialmente avevo fatto in questo modo: all'uscita del daq assistant ho un dynamic data che converto in array. Lo mando a un Build array con shift register e creo dunque un array che ha 100 colonne, che sono i 100 campioni alla volta, e tante righe quante sono le iterazioni che fa il programma. Da questo array prelevo sempre le prime 10 righe con Array Subset (quindi ho 100 colonne e 10 righe) e li mando in un Reshape Array con dimensione 1000 che quindi crea un array 1D di 1000 valori. 

 

Facendo un test con un segnale che scorre più lentamente sembra che tutto il subset array scorra verso il basso di una riga che è quella nuova e la decima diventa la nona del ciclo precedente. 

 

Può andare bene anche così?

Grazie ancora per la tua risposta.

0 Kudos
Messaggio 5 di 11
92Visualizzazioni

Quindi tu costruisci l'array aggiungendo la riga nuova "in cima" e prendendo sempre le prime 10 righe? Presumo anche che nello shift register viene memorizzata l'uscita di Array Subset. (sempre meglio allegare il codice, tenendo presente che non moltissimi hanno l'ultima versione di LabVIEW - io per esempio ho la 2021).

Questa tecnica funziona, solo è un pochino meno efficiente della mia, perchè costringe il programma a riallocare la memoria e probabilmente a fare delle copie dei dati per fare posto ai nuovi. Certo per un numero limitato di campioni la differenza non è poi così rilevante, però può diventarlo per frequenze e popolazioni di dati molto maggiori.

 

Paolo
-------------------
LV 7.1, 2011, 2017, 2019, 2021
Messaggio 6 di 11
77Visualizzazioni

Solo il Build array è collegato allo shift register.

Il diagramma è come segue, la versione che uso è la 2024Screenshot 2025-05-07 095336.png

0 Kudos
Messaggio 7 di 11
70Visualizzazioni

Così ti porti dietro un sacco di dati che non usi (a meno che non ti interessi conservarli per qualche elaborazione successiva). In caso di acquisizione di lunga durata, prima o poi avrai dei problemi di prestazioni e di memoria. Come suggerivo, puoi mettere nello shift register solo i dati che usi.

Un'altra osservazione è che nelle prime 9 iterazioni hai meno di 1000 dati, il che può andare bene o meno a seconda delle specifiche. Direi però che le prime 9 STD ottenute non sono omogenee con tutte le successive e quindi vanno scartate. Naturalmente qui stai solo visualizzando il dato, per cui conseguenze non ce ne sono.

Di solito è meglio inizializzare lo SR con un array vuoto, in modo che alla esecuzione successiva riparti da zero. Altrimenti è possibile che ti trovi dentro i dati vecchi.

Paolo
-------------------
LV 7.1, 2011, 2017, 2019, 2021
Messaggio 8 di 11
66Visualizzazioni

Quindi mando i dati in un Initialize Array di grandezza 1000? Però dopo come faccio ad aggiornare la prima riga e ad eliminare l'ultima?

 

Scusa per le infinite domande ma sto usando labView da poco

0 Kudos
Messaggio 9 di 11
60Visualizzazioni

Ho provato a spiegartelo nel mio post iniziale. Studiati come funziona Replace Array Subset, dopo di che potrai capire meglio.

Paolo
-------------------
LV 7.1, 2011, 2017, 2019, 2021
Messaggio 10 di 11
56Visualizzazioni