Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

MATLAB - Fast Fourier Transform FFT

Strumenti informatici per la matematica applicata, le simulazioni, il disegno: Mathcad, Matlab, Scilab, Microcap, PSpice, AutoCad ...

Moderatori: Foto Utenteg.schgor, Foto Utentedimaios

0
voti

[11] Re: MATLAB - Fast Fourier Transform FFT

Messaggioda Foto Utenteedomar » 27 mar 2018, 13:45

Ho trovato in rete un codice che funziona bene:

Codice: Seleziona tutto
Fs = 1000; % Sampling frequency                     

frq_res = 0.01; %desired frequency resolution

t=0 : 1/Fs : 1/frq_res-1/Fs; %time

X = 220*sin(2 * pi * 50 * t);

x1 = 30*sin(2*pi*100*t + 30*(pi/180));
x2 = 10*sin(2*pi*200*t + 50*(pi/180));
x3 = 05*sin(2*pi*300*t + 90*(pi/180));

%% adding the harmonics
Xt = X + x1 + x2 + x3;

%Transformation
Y=fft(Xt); %FFT

df=Fs/length(Y); %frequency resolution

f=(0:1:length(Y)/2)*df; %frequency axis

subplot(2,1,1);
M=abs(Y)/length(Xt)*2; %amplitude spectrum

M_rounded = int16(M(1:size(f, 2))); %Limit the frequency range
ind = find(M_rounded ~= 0);

stem(f(ind), M(ind), 'LineWidth', 0.5);
xlim([0 350]);
grid on; 

xlabel('Frequency (Hz)')
ylabel('Magnitude');

subplot(2,1,2);
P=angle(Y)*180/pi; %phase spectrum (in deg.)
stem(f(ind), P(ind), 'LineWidth', 0.5);
xlim([0 350]);
ylim([-100 100]);
grid on;

xlabel('Frequency (Hz)');
ylabel('Phase (degree)');



Il problema è che come in tutti gli esempi che si trovano, la frequenza di campionamento e, quindi, l'asse dei tempi sono definiti appositamente. Ho provato allora a definire l'asse dei tempi come nel mio programma:

Codice: Seleziona tutto

theta = 0:0.001:2*pi;
omega = 2*pi*50;
t = theta/omega;

Ts = t(34) - t(33);
Fs = 1/Ts;



E il risultato rimane ancora lo stesso:
Schermata 2018-03-27 alle 13.40.35.png


Poi vado a sostituire nel mio script, cambiando solo Xt con la corrente i1 che voglio analizzare e non funziona più niente...

Schermata 2018-03-27 alle 13.42.34.png


A questo punto non può che essere un problema di campionamento, di scelta della frequenza di campionamento, ecc ecc... Non riesco a raccapezzarmi
Avatar utente
Foto Utenteedomar
50 1 5
Frequentatore
Frequentatore
 
Messaggi: 140
Iscritto il: 9 lug 2013, 17:12

0
voti

[12] Re: MATLAB - Fast Fourier Transform FFT

Messaggioda Foto Utentexyz » 27 mar 2018, 14:18

Ripeto, non ha senso scrivere una cosa del genere:

Codice: Seleziona tutto
Ts = t(34) - t(33);


Il tempo di campionamento è un dato fisso e deve essere una costante, ad esempio:

Codice: Seleziona tutto
Ts = 0.001


o imponi la frequenza di campionamento (il reciproco del tempo), ad esempio:

Codice: Seleziona tutto
Fs = 1000


Ricavi l'asse del tempo in base a Ts o Fs, dipende quale valore definisci del codice, come è correttamente fatto nell'esempio che hai trovato funzionante il quale definisce costante la frequenza di campionamento Fs.
Avatar utente
Foto Utentexyz
6.864 2 4 6
G.Master EY
G.Master EY
 
Messaggi: 1778
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

0
voti

[13] Re: MATLAB - Fast Fourier Transform FFT

Messaggioda Foto UtenteEcoTan » 27 mar 2018, 14:44

edomar ha scritto:la corrente i1 che voglio analizzare

non potrebbe darsi che coi tuoi campioni la FFT sia davvero quella?
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5423
Iscritto il: 29 gen 2014, 8:54

0
voti

[14] Re: MATLAB - Fast Fourier Transform FFT

Messaggioda Foto Utenteedomar » 27 mar 2018, 15:07

No, guarda l'andamento della i1 nel mio primo post... Sto provando a modificare il codice a monte, partendo dalla definizione del tempo di campionamento... Vediamo cosa viene fuori
Avatar utente
Foto Utenteedomar
50 1 5
Frequentatore
Frequentatore
 
Messaggi: 140
Iscritto il: 9 lug 2013, 17:12

0
voti

[15] Re: MATLAB - Fast Fourier Transform FFT

Messaggioda Foto Utenteedomar » 27 mar 2018, 15:12

xyz ha scritto:Ripeto, non ha senso scrivere una cosa del genere:

Codice: Seleziona tutto
Ts = t(34) - t(33);

....


Ho provato a fare come hai detto, imponendo a monte la frequenza di campionamento:

Codice: Seleziona tutto
Fs = 10000;

Ts = 1/Fs;

t = 0 : 1/Fs : 2*pi/(2*pi*50) - 1/Fs;

theta = 2*pi*50*t;


Il risultato però rimane invariato... Anche facendo distorcere ulteriormente la i1 il risultato rimane quello
Schermata 2018-03-27 alle 15.15.11.png

Schermata 2018-03-27 alle 15.15.36.png
Ultima modifica di Foto Utentexyz il 27 mar 2018, 16:28, modificato 1 volta in totale.
Motivazione: Non serve quotare tutto il messaggio
Avatar utente
Foto Utenteedomar
50 1 5
Frequentatore
Frequentatore
 
Messaggi: 140
Iscritto il: 9 lug 2013, 17:12

1
voti

[16] Re: MATLAB - Fast Fourier Transform FFT

Messaggioda Foto Utentexyz » 27 mar 2018, 16:37

Nel tuo codice esistono parti oscure come questa:

Codice: Seleziona tutto
2*pi/(2*pi*50)


non si capisce il motivo di un calcolo del genere visto che è uguale a 1/50, dovrebbe indicare il tempo massimo.
Avatar utente
Foto Utentexyz
6.864 2 4 6
G.Master EY
G.Master EY
 
Messaggi: 1778
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

0
voti

[17] Re: MATLAB - Fast Fourier Transform FFT

Messaggioda Foto Utenteedomar » 27 mar 2018, 18:03

xyz ha scritto:Nel tuo codice esistono parti oscure come questa:

Codice: Seleziona tutto
2*pi/(2*pi*50)


non si capisce il motivo di un calcolo del genere visto che è uguale a 1/50, dovrebbe indicare il tempo massimo.


Sì esatto, è il tempo massimo... in effetti è inutile scriverlo in questo modo, bastava scrivere 1/50 #-o
Però il problema rimane..
Avatar utente
Foto Utenteedomar
50 1 5
Frequentatore
Frequentatore
 
Messaggi: 140
Iscritto il: 9 lug 2013, 17:12

0
voti

[18] Re: MATLAB - Fast Fourier Transform FFT

Messaggioda Foto UtenteEcoTan » 28 mar 2018, 12:06

edomar ha scritto:distorcere ulteriormente la i1

Sarebbe più chiaro fornire, oltre al grafico, anche i valori dei campioni.
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5423
Iscritto il: 29 gen 2014, 8:54

0
voti

[19] Re: MATLAB - Fast Fourier Transform FFT

Messaggioda Foto Utenteedomar » 28 mar 2018, 12:27

Potrei copiare il link del medesimo quesito posto nel forum di Matlab (anche in quel caso senza soluzione) in cui è possibile allegare i file.mat... Ma non so se questa operazione sia in linea con le regole del forum

Intanto io continuo a fare mille tentativi ma non riesco a pervenire a una soluzione...

Alla fine io vorrei trovare l'ampiezza della fondamentale e il THD... Non esistono altri modi? Anche se sarebbe comunque bello trovare gli spettri in ampiezza e fase..
Avatar utente
Foto Utenteedomar
50 1 5
Frequentatore
Frequentatore
 
Messaggi: 140
Iscritto il: 9 lug 2013, 17:12

Precedente

Torna a Programmi applicativi: simulatori, CAD ed altro

Chi c’è in linea

Visitano il forum: Nessuno e 15 ospiti