Implementare il root mean square value

di il
2 risposte

Implementare il root mean square value

Buongiorno a tutti, questo è il mio primo post e spero di rispettare le linee guida del forum.
Sto sviluppando un programma per analizzare dati EMG e stavo cercando un modo per implementare una funzione che riconosca autonomamente l'attivazione di un muscolo.
Vorrei calcolare il RMS per un certo numero di campioni in modo da utilizzare il valore trovato come threshold, in pratica quando il segnale supera la soglia per un certo lasso di tempo allora il muscolo è 'ON' altrimenti è 'OFF'.
Essendo alle prime armi con matlab non capisco dove sia l'errore nel codice in quanto la funzione da me creata e la funzione rms di matlab mi danno valori diversi, posto di seguito il codice, sarei grato se qualcuno sapesse darmi una dritta!
x=emg_del_low;
N=length(emg_del_low);
for n=2:N
x_rms=sqrt(1/N*((x(n)+x(n-1))^2));
end
disp (x_rms)

2 Risposte

  • Re: Implementare il root mean square value

    Dal momento che non hai pubblicato alcun esempio di dati di input non è possibile verificare il codice.

    Hai provato ad eseguire il codice in modalità debug?

    In generale, non è chiaro quale sia l'algoritmo che stai cercando di implementare.
    [*] Nel ciclo for che hai scritto, il valore della variabile x_rms viene "sovrascritto" ad ogni iterazione quindi, alla fine del loop avrà semplicemente l'ultimo valore calcolato
    [*] la stessa variabile x_rms non viene usata nel ciclo for come input tra le varie iterazioni

    Una possibilità potrebbe essere modificare l'istruzione da
    
    for n=2:N
    x_rms=sqrt(1/N*((x(n)+x(n-1))^2));
    end
    
    
    for n=2:N
    x_rms(n-1)=sqrt(1/N*((x(n)+x(n-1))^2));
    end
    
    In quest modo otterresti un array con i valori calcolati ad ogni iterazione.

    Dal momento che non hai decritto l'algoritmo che vuoi implementare, non è possibile dare una risposta adeguata.
  • Re: Implementare il root mean square value

    Verifica la formula che devi implementare:
    sei sicuro che contenga il quadrato della somma di due valori consecutivi ==>

    (x(n)+x(n-1)).^2

    come hai scritto nel codice, e non, semplicemente il quadrato del singolo valore ==>

    x(n).^2

    Se la formula che intendi implementare è quella riportata nell'help di MatLab

    MATLAB_RMS_AVERAGE.png
    MATLAB_RMS_AVERAGE.png

    nel ciclo for devi calcolare solo la somma dei quadrati.

    La divisione per il numero degli elementi e l'estrazione della radice quadrata devono essere fatti al di fuori del loop, al termine dello stesso.

    Una possibile implementazione potrebbe essere:
    
    x=emg_del_low;
    N=length(emg_del_low);
    s=0;
    for i=1:N
       s=s+x(i).^2;
    end
    x_rms=sqrt(1/N*s)
    
    Considera che, in realtà, il ciclo for non è necessario, se si sfruttano le proprietà di indexing di MatLab
    
    x_rms_1=sqrt(1/N*sum(x.^2))
    
Devi accedere o registrarti per scrivere nel forum
2 risposte