Esercitazioni in Matlab

enpires1
salve a tutti! Sto facendo qualche esercitazione di matlab e sto trovando alcune difficoltà, in particolare in questo esercizio:
Considerare la sequenza ottenuta campionando la funzione [tex]s_1(t)=exp(j2\pi t/T_0)[/tex] con T0=1 s, e dt=0.01. Fare il grafico sul piano di Gauss, parte reale-parte immaginaria della sequenza. Evidenziare con due circoletti di diverso colore i punti s(0) e s(dt).


La mia risoluzione è stata la seguente
T0 = 1;
dt = 0.01;
t = [dt:dt:T0];
s0=exp(j*2*pi*0/T0);
s1=exp(j*2*pi*t/T0);
figure (1), plot(s1,'bo'), grid on, axis square, title('Sequenza s1(t)');
hold on;
plot(s0, 'ro')

Ma stranamente il grafico esce male



Notare il cerchietto rosso che si trova in alto a destra nel punto (1,1) invece che in (1,0). Come mai??

inoltre c'è un sistema migliore per evidenziare un particolare elemento di un grafico, cioè qualcosa per dire "l'elemento n-esimo coloralo di fuxia"? Non mi piace il dover salvare in una variabile a parte il valore che voglio evidenziare (e soprattutto non mi piace doverlo eliminare dall'array rappresentante la sequenza)

Grazie a tutti

Risposte
apatriarca
Ho fatto alcune prove e sembra essere dovuto al modo in cui matlab interpreta s0. Lo vede come un numero reale (e quindi non complesso) e quindi suppone che tu abbia fornito solo la colonna delle Y e che per le X tu voglia utilizzare gli indici dell'array. Per cui, essendo s0(1) = 1, disegna il punto (1,1). Una soluzione potrebbe essere quella di scrivere esplicitamente le coordinate del punto nel plot:
plot(real(s0), imag(s0), 'ro');

enpires1
Si effettivamente scrivendo
T0 = 1;
dt = 0.01;
t = [dt:dt:(T0-dt)];
s0=exp(j*2*pi*0/T0);
s1=exp(j*2*pi*t/T0);
figure (1), plot(s1,'bo'), grid on, axis square, title('Sequenza s1(t)');
hold on;
plot(real(s0), imag(s0), 'ro');

la cosa funziona bene, il problema è che dopo la traccia continua dicendo "Fare i grafici rispetto al tempo della parte reale e della parte immaginaria di s1(t).", quindi speravo che ci fosse una soluzione per evitare di "levare" il valore s0 dalla sequenza.

apatriarca
Puoi semplicemente usare gli indici per accedere ad una sottosequenza. Il primo elemento sarà quindi s1(1), e i successivi s1(2:length(s1)) saranno gli altri elementi. Puoi anche inserire tutto nella stessa chiamata a funzione se non ricordo male scrivendo:
plot(real(s1(1)), imag(s1(1)), 'ro', s1(2:length(s1)), 'bo')

enpires1
Giustissimo :) grazie mille!

enpires1
Continuo qui per evitare di aprire altri topic.
In un'altra esercitazione mi si chiede
Date la sequenza periodica ottenuta campionando con tempo di campionamento T=1 s, il segnale tempo continuo x1(t)=cos(2*pi*t/16), utilizzare l'algoritmo di fft per calcolarne la TDF. Tracciare i grafici modulo e fase della TDF. Curare la determinazione del corretto periodo delle sequenze campionate e la corretta taratura dell'asse frequenziale.


Per quanto riguarda la "cura" dell'asse frequenziale, suppongo si riferisca ad impostare correttamente la scala dell'asse delle ascisse, io ho fatto così:
1) ho calcolato il numero di campioni
N=Toss/T

dove Toss è la durata della finestra di osservazione (in questo caso 16 secondi) e T il passo di campionamento (in questo caso un secondo)
2) ho "tarato" l'asse delle frequenze come segue
asse_freq=delta_f*[0:1:(N-1)];

3) Ho plottato il risultato
figure (1), stem(asse_freq,X);


Come vi sembra? Corretto?

enpires1
Continua l'odissea, come mai il comando
stem(asse_freq_x3,abs(F_x3),'b')

genera un grafico che sull'asse x va da -3 a 3, quandi asse_freq_x3 è un vettore che va da -0.5 a 0.5? Ho già verificato che i due vettori siano di pari lunghezza

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