IMPLEMENTAZIONE DYNAMIC TIME WARPING

Ciao a tutti!
Sono un po’ disperata perchè mi dovrei laureare tra un mese (tesi sperimentale), ma ho un po di problemi con Arduino.
Fondamentalmente devo implementare il Dynamic time Warping, il uP che ho è Arduino Uno-ATMega328.
Il problema mi si presenta quando vado a compilare il codice, che dovrebbe essere giusto perchè su Linux ( con stesso linguaggio tranne che per le istruzioni di print) gira perfettamente.
Non riesco a capire se è la scheda che sto utilizzando o se è implementato male.
Spero possiate aiutarmi, questo è il codice:

[#define col 5
#define row 8

byte A[col] = { 1, 2, 6, 7, 9};                 // vettore A, sequenza di riferimento 
byte B[row] = { 2, 3, 5, 7, 8, 9, 11, 13};      // vettore B, sequenza da comparare a quella di riferimento

/* funzione per calcolare il minimo relativo all'ultima colonna */

int row_val_min(int *vec){ 
 int rowmin=0;
  for(int i=1; i<row; i++){    
   if(vec[i]<0)      
      vec[i] = -vec[i];  //Normalizzazione vettore    
   if( vec[i] < vec[i-1] )      
      rowmin = i;  
}  
return rowmin;
}

/* funzione per calcolare il velore minimo della colonna successiva, nella riga più prossima 
* a quella corrispondente al minimo della colonna precendente */

int row_val_min_next(int *vec_next, int rowmin_prec){   
int rowmin_next = rowmin_prec-1;  
    for(int i=rowmin_prec; i<rowmin_prec+2; i++){ 
      if(vec_next[i] < vec_next[i-1])        
        rowmin_next = i;
    }   
return rowmin_next;
}

void setup() {
Serial.begin(19200); // inizializza la comunicazione seriale a 19200 bps
Serial.flush();     // aspetta che sia completata la trasmissione seriale dei dati

}

void loop() {
 
 int **Dist = (int **)calloc(16, sizeof(int));
 for(int i=0; i<row; i++){
     Dist[i] = (int *)calloc(10, sizeof(int)); 
 } 

 /* Creazione della matrice delle distanze */  
 for(int i=0; i<8; i++){    
   for(int j=0; j<col; j++){     
     Dist[i][j] = B[i] - A[j];   
   }  
 }
   
int *colonna = (int *)calloc(row ,sizeof(int));                   //Alloco memoria per copiare la colonna di Dist[row][col]   
int *riga_ottima = (int *)calloc(1, sizeof(int));                 //Alloco memoria per risultato temporaneo della riga ottima  
int *percorso_minimo = (int *)calloc(col, sizeof(int));           //Alloco memoria per vettore contenente righe ottime, warping path  
int *valori_percorso_minimo = (int *)calloc(col, sizeof(int));    //Alloco memoria per vettore contenente valori ottimi
  
  
int j = col-1;                  //considera solo l'ultima colonna                                       
for(int i=0; i<row; i++){       //Copia l'ultima colonna nel vettore colonna[i] 
 colonna[i] = Dist[i][j];   
}
   
*riga_ottima = row_val_min(colonna);            //Salva la riga ottima dell'ultima colonna      
percorso_minimo[j] = *riga_ottima;              //Copia questo valore nel vettore percorso_minimo[j] 

   
for(int j=col-2; j>=0; j--){  // partendo dalla penultima colonna
 for(int i=0; i<row; i++){   //copia la colonna di Dist nel vettore colonna[i], per poi analizzare ogni colonna singolarmente   
   colonna[i] = Dist[i][j];               
      
riga_ottima = row_val_min_next(colonna, *riga_ottima);  //Valuta la riga ottima di ogni colonna più vicina al risultato della colonna precedente                                                            
 percorso_minimo[j] = *riga_ottima;                       // salva i valori delle righe ottime calcolati dalla funzione row_val_min_next                                             
}               
                                      
for(int column=0; column<col; column++){     
 valori_percorso_minimo[column] = Dist[percorso_minimo[column]][column];     //Copia i valori del warping path nella variabile valori_percorso_minimo[column] 
 Serial.print(valori_percorso_minimo[column]);                               // stampa i valori del warping path, su una stessa riga
} 
 
exit(0);                   // per evitare l'invio infinito di dati

}
]

Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione … possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO

… dopo di che, in conformità al suddetto regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

Grazie,

Guglielmo

Ma che roba è ? vec è un puntatore, assegnare il negativo di un puntatore ? :o
if (vec < 0) vec = -vec; //Normalizzazione vettore

Cercare di implementare il DTW su una piccola mcu 8 bit è volersi fare del male da soli. :) Ti conviene passare subito ad una scheda Arduino 32 bit ben dotata di RAM, il DTW ne richiede molta, e veloce, p.e. la Teensy 3.2, meglio ancora la Teensy 3.6.

Infatti io ho subito pensato fosse un problema di scheda...il problema è che il mio relatore mi ha dato questa, quindi diciamo che non avevo molta scelta. Penso che me ne dovrà dare un'altra un po più "potente". Grazie mille :)

Non è un puntatore, è un array di interi

Credo equivalga (non ho qui il k&r) a int vec[]

il casino mi sembra di vederlo quando usa l'allocazione per dimensionare array

Credo perché non ne conosce a compile-time la dimensione

Ma se ricordo bene gli array locali possono avere dimensione nota a run-time

Comunque l'unica domanda vera è:

Che errore di compilazione da?

docsavage: Non è un puntatore, è un array di interi Credo equivalga (non ho qui il k&r) a int vec[]

No @doc, ORA è un array perchè ha corretto il post. Stamattina era una roba diversa. vec=-vec senza le quadre !!

Ora chissà quali errori da, visto che ha modificato.

Ah

Ma allora....

Serve assolutamente sapere che errore ha in compilazione E conoscere il programma dato in pasto al compilatore

Se quel codice di sopra, ora rieditato (e senza quelle quadre errate a inizio e fine!!) allora... gli manca solo una graffa chiusa } al fondo di tutto, poi compila !! @Bartolla, dentro l'IDE usa CTRL+T che indenta in modo decente

Che compila è un conto, che poi riesce realmente a fare il DTW è un altro paio di maniche. :slight_smile:
Probabilmente non sapete esattamente a cosa serve il DTW, un esempio classico è il riconoscimento vocale partendo da campioni analizzando la stessa frase pronunciata a velocità diverse, il sample è molto diverso dal campione e non basta la semplice sovrapposizione con isteresi/jitter per avere il match.
Tramite DTW è possibile ricondurre il sample al campione.

Dividiamo il problema in due

Che il codice faccia quello che deve è così per definizione, dato che su linux gira perfettamente Questo lo dice Bartolla e io lo prendo per buono, cosa deve fare lo sa lei e non io...

Che il compilatore dello IDE non compilasse non è più vero.....

Altre info non ne ho....

Basta problemi? Mi sembra troppo bello...

nid69ita

Però non mi tornano i tempi.... Ricordo di aver visto le [] prima di leggere la tua domanda sul puntatore

Anche perché siccome lo avevo interpretato male sono tornato indietro a rileggerlo...

Vabbe problema minore.....

docsavage: Però non mi tornano i tempi.... Ricordo di aver visto le [] prima di leggere la tua domanda sul puntatore

Baste che guardi quando l'utente ha editato il post ... ;)

IMPLEMENTAZIONE DYNAMIC TIME WARPING Today at 11:12:49 Last Edit: Today at 11:52:49 by Bartolla

mentre il post di Nid è:

Re: IMPLEMENTAZIONE DYNAMIC TIME WARPING #2 Today at 11:49:05

Guglielmo

Grazie

E non è una presa in giro

Ma se io ho visto le quadre prima che nid69ita postasse la domanda…

Significa che la correzione è stata fatta indipendentemente dalla domanda…

Ovvero Bartolla si era già accorta dell’errore…

@docsavage per quanto riguarda il codice, non da errori di compilazione su arduino, non stampa le cose giuste sul monitor seriale, ma gira su linux, è per questo che sono un po' disperata. Per quanto riguarda le [], ci sono sempre state solo che stamattina avevo copiato il codice nel post senza usare l'opzione giusta, poi ho sistemato e questo è quello che ho nell'IDE (senza le quadre hahhaah) :) Dovrebbe stampare questo array { 0, 1, 1, 3, 2} e invece stampa {2, 3} ....

Bartolla, dopo aver corretto il codice però dovevi specificare meglio che avevi corretto e non dava più errori di compilazione. Io purtroppo non conosco la materia. Ma mi fiderei di quel che dice @astro. I valori che ti stampa come fai a dire che non sono corretti ? Sono senza senso oppure hai delle "tabelle" di comparazione ? Ripeto però non conosco la materia warping

E allora qui mi tocca fermarmi...

In realtà non mi aveva mai dato errori di compilazione :o ... stampa proprio valori errati. Ho anche provato a fargli stampare solo la matrice Dist*[j], ma dopo un tot di elementi non li stampa più, per questo ho pensato ad un problema della scheda*

Ma STESSO codice compilato/uplodato su IDE Arduino ma su macchina Linux ti da risultati diversi rispetto a macchina Windows ?

Stesso identico codice, usando printf invece che serial.print perchè in arduino uso il monitor seriale. Su linux mi da i valori esatti. Posso postare anche quello se può essere utile..