Matlab, chi sa risolvere questo problema?

Ale831
Salve a tutti, di seguito vi posto un listato matlab che non fa tutto quello che dovrebbe. Traccia una sinusoide discreta con tutti i suoi parametri, ma non vuole calcolarne il periodo. Avevo scelto questa strada: confrontare il primo campione della sequenza con ciascuno dei successivi, una volta trovato il primo uguale è semplice trovare il periodo (tramite l'indice k). Provando a eseguirlo step by step, vedo che NON FA MAI il confronto if (x(1) == x(k)) quando arriva a k=26 dovrebbe entrare dentro l'if, no? Infatti x(1)==x(26)== -1.1202 quindi periodo = 25. Ma periodo non si schioda dal valore di inizializzazione, cioè 0.
% Ex5 ***Sinusoide***

clear;
clc;
clf;
N = 50; % Ampiezza dell'insieme di definizione
n = 0:N;
f = 0.08; % Frequenza
phase = 90; % Fase
A = 2.5; % Ampiezza
arg = 2*pi*f*n - phase;
x = A*cos(arg);

periodo = 0;
k = 2;

while ((k <= (N+1)) & (periodo == 0))
if (x(1) == x(k))
periodo = k - 1;
end;
k = k+1;
end;

stem(n,x,'filled'), grid; %plot(arg,x) e stairs(x) sono altre possibilità
ylabel('x[n]'), title('SEQUENZA SINUSOIDALE');
axis([0 N -3 3]);

% Calcolo della potenza media

pot = 0;

for i = 1:periodo
pot = (x(i))^2;
end;

fprintf('\n\tPotenza media: %f\n\tPeriodo:%d', pot/periodo, periodo);

Risposte
david_e1
Gli errori di arrotondamento del calcolatore rendono impossibile un confronto di questo tipo fra i valori assunti dalla sinusoide. Prova a fissare una tolleranza epsilon e a sostituire l'if(..) con:

if( abs(x(1)-x(k)) <= epsilon )

Poi stai attento ai punti di campionamento perche' non e' detto che, anche in assenza di errori di arrotondamento, ricompaia un valore uguale a x(0). (questo non l'ho controllato) (in pratica vedi se esiste una suluzione intera dell'equazione 2*pi*f*n = 2*k*pi con i valori da te messi di f e n).

PS: La fase devi metterla in radianti.

Ale831
Ho risolto introducendo epsilon= 0.01
Non so come ringraziarti, mi hai fatto notare parecchie cose che non mi avevano neanche sfiorato.
Ciao!
Ale

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