Onda triangolare con Matlab

raff5184
devo genereare una funzione triangolare in Matlab. La replica di un triangolo.

Ho pensato:

t=linspace(0, .01, 500); % creo il vettore dei tempi
c=0; %contatore
A=2; %ampiezza del triangolo
d=0;

for i=1:500,
if c<50
c=c+1;
else
if c>=50,
c=c+1;
d=-c;
end %end if
end %end else

end %end if
x(i) = A*(1-d);

if c==100,
c=0;

%qui ci vuole un altro end? cioè l'end dell' if c==100?
end %end for

length(x)
length(t)
plot(t,x)

1) mi faccio restitutire le lunghezze di x e t e vedo che x ha 501 elementi, ma se i va da 1 a 500 come è possibile?
2) dove sbaglio in questo codice? La fuznione che ottengo è abbastanza lontana dall'essere un triangolo

Risposte
_luca.barletta
t=linspace(0, .01, 500);  % creo il vettore dei tempi
c=0;           %contatore
A=2;           %ampiezza del triangolo
d=0;

for i=1:500, 
    if c<50
        c=c+1;
    else
        if c>=50,
        c=c+1;
        d=-c;
        end %end if
    end %end if
   
    
    x(i) = A*(1-d);
   
    if c==100,
    c=0;
    end

end %end for

length(x)
length(t)
plot(t,x)


te l'ho corretto in modo che t e x abbiano la stessa lunghezza, ma non so se il risultato che volevi ottenere sia quello

raff5184
grazie.
Cmq, il risultato che voglio ottenere è diverso. Vorrei un'onda triangolare di ampiezza A, insomma una successione di triangoli ciascuno dei quali ha durata 100 campioni; pertanto per i primi 50 campioni (da 0 a 49) salgo e gli altri 50 (da 50 a 99) scendo.. per 500 campioni

_luca.barletta
ecco il codice:
x=[0:49 50:-1:1];
tri = repmat(x,1,5);
plot(tri)

devi solo mettere a posto l'asse dei tempi e l'ampiezza del segnale.

raff5184
"luca.barletta":
ecco il codice:
x=[0:49 50:-1:1];
tri = repmat(x,1,5);
plot(tri)

devi solo mettere a posto l'asse dei tempi e l'ampiezza del segnale.


so che ci sono funzioni predefinite, il problema è che la traccia richiede esplicitamente di risolvere l'esercizio con il ciclo for

_luca.barletta
a parte che usare i cicli for in matlab è quasi un'eresia se non sono strettamente necessari :), cmq potresti usare un primo ciclo for per scrivere i campioni da 1 a 50, poi un altro per scrivere quelli da 51 a 100, infine un terzo ciclo per replicare 5 volte il vettore di 100 elementi appena creato.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.