Massimi relativi

di il
3 risposte

Massimi relativi

Ciao a tutti, sono una studentessa di ingegneria e sto provando di scrivere una funzione sui massimi relativi .
La funzione dovrebbe essere in grado di individuare gli indici (posizioni) degli elementi di un vettore x fornito come argomento alla funzione che rappresentano i massimi relativi. Gli indici devono essere restituiti dalla funzione in una variabile imaxrel che deve essere un vettore colonna e si assume che nessun massimo relativo possa trovarsi nella prima e\o ultima posizione.

function imaxrel=maxrelativi(x)

t=0:0.0.1:30;
x=sin(1.5*t).*cos(0.1*t)

end

Ho provato vari tentativi con il comando "find" ma senza successo.
Mi potresti dare una mano
Grazie

3 Risposte

  • Re: Massimi relativi

    Hai provato ad usare la funzione "findpeaks"?

  • Re: Massimi relativi

    ask_raf ha scritto:


    Hai provato ad usare la funzione "findpeaks"?

    Ciao ask_raf.
    innanzitutto grazie mille della tua risposta. Ho provato ma comunque c'è ancora qualcosa che non va. mi spiego:

    function imaxrel=maxrelativi(x)
    t=0:0.1:30;
    x=sin(1.5*t).*cos(0.1*t);
    [pkt,lkl] = findpeaks(x);
    imaxrel=lkl

    end

    esce come errore:Undefined function 'findpeaks' for input arguments of type 'double' visto che output della funzione e soltanto imaxrel credo.
    Sicuramente mi sfugge qualcosa.
    Grazie mille ancora
  • Re: Massimi relativi

    La funzione "findpeaks" fa parte del toolbox "SignalProcessing", forse non hai questo toolbox.

    Ad ogni modo, puoi creare la tua funzione "findpeaks" in questi passi: dato il segnale (vettore) di partenza

    [*] calcola la differenza tra due elementi consecutivi del vettore
    [*] determina il segno del vettore "differenza" calcolato al punto precedente
    [*] calcola la differenza tra i valori di segno
    [*] identifica gli indici degli elementi (calcolati al passo precedente) con valore diverso da "0"

    A questo punto, hai ottenuto gli indici degli elementi del vettore segnale che corrispondono ad un Massimo o ad un Minimo.

    Se il primo di questi è maggiore del secondo, quello sarà un Massimo, in caso contrario sarà un Minimo.

    Massimi e Minimi si alternano, quindi basta prendere i valori definiti dagli indici (vedi sopra) con passo 2.
    
    t=0:0.1:30;
    x=sin(1.5*t).*cos(0.1*t);
    
    figure
    hp(1)=plot(t,x);
    
    % Compute the difference between two consecutive elements
    diff_val=[1e-9 diff(x)];
    
    % Get the sign of the difference
    sgn_diff_val=sign(diff_val);
    
    % Compute the difference between the signs
    sgn_val=diff(sgn_diff_val);
    
    % Find the indices for which the difference between the signs is different from 0
    pk_idx=find(sgn_val ~= 0)
    
    % Get the number of the index array
    n_pk=length(pk_idx)
    
    % Get the values of the MAX_rel and MIN_rel: they are alternate (max, min, max, ...)
    % If the first element is greater that the second, then it is a MAX_rel, otherwise it is a MIN_rel
    if(x(pk_idx(1)) > x(pk_idx(2)))
       max_rel_idx=pk_idx(1:2:n_pk)
       max_rel=x(max_rel_idx)
       min_rel_idx=pk_idx(2:2:n_pk)
       min_rel=x(min_rel_idx)
    else
       max_rel_idx=pk_idx(2:2:n_pk)
       max_rel=x(pk_idx(max_rel_idx))
       min_rel_idx=pk_idx(1:2:n_pk)
       min_rel=x(pk_idx(min_rel_idx))
    end
    hold on
    
    % Plot the results
    hp(2)=plot(t(max_rel_idx),max_rel,'o','markersize',9,'markeredgecolor','r')
    hp(3)=plot(t(min_rel_idx),min_rel,'s','markersize',9,'markeredgecolor','r')
    legend(hp,{'Signal','MAX_-rel','MIN_-rel'})
    

    MAX_MIN_rel.jpg
    MAX_MIN_rel.jpg

Devi accedere o registrarti per scrivere nel forum
3 risposte