Matlab, chi sa risolvere questo problema?
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);
% 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
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.
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.
Ho risolto introducendo epsilon= 0.01
Non so come ringraziarti, mi hai fatto notare parecchie cose che non mi avevano neanche sfiorato.
Ciao!
Ale
Non so come ringraziarti, mi hai fatto notare parecchie cose che non mi avevano neanche sfiorato.
Ciao!
Ale