La lingua non sarebbe un problema, qui devo modificare però il dataset sul quale il grafico viene generato.
Al momento il grafico generato da gnuplot è questo:
Che in pratica è esattamente quello che volevo fare, ed è uguale al grafico di partenza.
Ora però vorrei modificarlo, come dicevo prima perchè vorrei eliminare le aree del grafico stesso che non sono parte del plot, vorrei cioè eliminare quelle due parti, cerchiate di verde nella parte alta dell'immagine.
Il plot l'ho realizzato tramite questo script:
Codice: Seleziona tutto
#!/bin/bash
#Questo script prende il file CSV generato dall'oscilloscopio,
#e lo converte in un opportuno formato, in modo da creare il
#file .dat per poter generare il plot.
#Per prima cosa elimino ogni file dalla directory di conversione
cd /home/leonardo/MioArchivio/Letture\ Oscilloscopio;
rm *.*;
#Ora vado sulla scrivania a prendere il file CSV..
cd /home/leonardo/Scrivania;
if [ -f *.CSV ]; then
cp *.CSV /home/leonardo/MioArchivio/Letture\ Oscilloscopio;
else
notify-send 'Nessun file' 'Non c è alcun file .CSV sul desktop';
fi;
cd /home/leonardo/MioArchivio/Letture\ Oscilloscopio;
#Converto il file CSV in TXT;
cat *.CSV > RGB.txt;
cat RGB.txt | sed -e '1,2d' | sed -e 's/,,/,/g' \
| cut --delimiter="," --field=3,4 \
| sed -e 's/^\ //g' \
| sed -e 's/,/\ /g' > RGB.dat
#Ora copio lo script per far eseguire il plot nella directory
#locale
cp /home/leonardo/MioArchivio/Script/GnuplotLoadCommand \
/home/leonardo/MioArchivio/Letture\ Oscilloscopio;
#A questo punto, prima di dare il comando di plot, devo fare
#una manipolazione sui dati.
#Per fare in modo che la parte veramente visualizzata sul
#grafico sia l'intero grafico utile, voglio associare
#all'origine dell'ascissa il primo fronte d'onda quadra utile,
#ed al fondo scala, sempre dell'ascissa, l'ultimo fronte d'onda.
#Per fare questo dovrò modificare i dati che ho, perchè nel file
#CSV d'origine, sono memorizzati anche eventuali parti del
#segnale agli estremi, che sono sempre zero.
#Faccio quindi per ogni simbolo del file CSV in ingresso,
#una differenza con il simbolo che lo precede, ma questo lo
#dovrò fare solo all'inizio ed alla fine dell'intero file,
#perchè voglio eliminare le parti del segnale che, all'esterno
#non rappresentano variazioni.
#Prima di tutto devo ottenere il numero di record contenuti nel
#file:
NumeroRecord=$(cat RGB.dat | wc --lines);
#Ora creo il ciclo per eliminare tutti i valori nulli prima del
#primo fronte d'onda utile.
#Creo una costante, chiamata "SogliaDiscriminante" che in
#pratica è il valore che mi definisce al di sotto di quale
#soglie, tutte le letture vanno eliminate.
SogliaDiscriminante=6000;
#Per prima cosa inizializzo a zero il valore della cariabile
#ValorePrecedente
ValorePrecedente=0;
for i in $NumeroRecord
do
#Estraggo di volta in volta il valore dalla lista.
#Il primo sed serve a rimuovere un eventuale segno "meno",
#per ottenere il valore assoluto.
#Il secondo sed invece serve per rimuovere il ".",
#perchè la sottrazioone per calcolare la differenza non puo'
#essere effettuata tra numeri decimali.
#Il terzo sed serve a rimuovere ogni zero all'inizio, prima
#della cifra reale.
#Iòl quarto sed serve a rimuovere uno zero allla fine per
#ridurre un pò l'intervallo di valori generati.
RigaAttuale=$(cat RGB.dat | sed -n $i'p');
TempoAttuale=$(cat RGB.dat | sed -n $i'p' \
| cut --delimiter=" " --field=1);
TensioneAttuale=$(cat RGB.dat | sed -n $i'p' \
| cut --delimiter=" " --field=2);
TensioneModificataAttuale=$(cat RGB.dat \
| sed -n $i'p' \
| cut --delimiter=" " --field=2 \
| sed -e 's/-//g' \
| sed -e 's/\.//g' \
| sed -e 's/^0//g' \
| sed -e 's/0$//g');
echo "Tempo: " $TempoAttuale "Tensione: " $TensioneAttuale "Tensione modificata attuale: " $TensioneModificataAttuale;
echo "Riga attuale: " $RigaAttuale;
Differenza=$((TensioneModificataAttuale - ValorePrecedente));
echo "La differenza vale: " $Differenza;
if [ $Differenza -gt $SogliaDiscriminante ]; then
#break;
echo "Sono nell if interno";
else
#Se arrivo all'interno di questo else, vuol dire che l'attuale
#valore letto si trova al di sotto della soglia accettata, e
#quindi lo posso eliminare dal set di dati.
#Elimino dunque il recorecho "*" >> RGB.dat;;
echo "Ciao";
fi
ValorePrecedente=$TensioneModificataAttuale;
done
gnuplot --persist GnuplotLoadCommand;
Il contenuto di GnuplotLoadCommand è semplicemente la riga:
Questo script fà tutto quello che voglio tranne una, per la quale vorrei chiedere consiglio.
Tutta la prima parte dello script si occupa di prendere il file CSV in ingresso, convertirlo in .dat e riformattarlo secondo la sintassi di cui ha bisogno gnuplot per funzionare, e questa parte non ha problemi.
Nella secnda parte invece, dovrebbe prendere uno dopo l'altro tutti i valori che vengono messi nel file RGB.dat, scorrerli uno dopo l'altro e fare la differenza tra il valore letto al momento, ed il valore precedente.
Se questa differenza si trova al di sotto di una certa soglia, vuol dire che nel grafico quella particolare lettura corrisponde ad una costante, ovvero il grafico non varia, e quindi vorrei procedere con eliminare quella riga dal dataset.
Vorrei cioè eliminare quella particolare coppia, che mi ha appena generato una differenza "idonea", ma non ci riesco in alcun modo.
Come posso fare ad eliminare da un file che è aperto ed in lettura all'interno di una routine, un suo valore?
Ho provato ad eliminare la costante attraverso un "tr -d $RigaAttuale" ed anche con "sed $RigaAttuale'd' " ma ora comincio a finire le idee.
Potreste aiutarmi?
Grazie mille.