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

[1] MATLAB - Fast Fourier Transform FFT

Messaggioda Foto Utenteedomar » 26 mar 2018, 18:22

Salve a tutti, vi espongo il mio problema nella speranza che possiate aiutarmi.

Dispongo di un vettore corrente ricavato rispetto a theta = omega*t (fondamentale 50 Hz):

Schermata 2018-03-26 alle 18.15.05.png


Devo effettuare l'analisi in frequenza per poi ricavare l'armonica fondamentale (per calcolare il THD).

Ho seguito questo procedimento:
Codice: Seleziona tutto
% analisi armonica corrente i1

f_fond = 50;
omega = 2*pi*f_fond;
t = theta/omega;

TS = t(2) - t(1);
FS = 1/TS;

Y = fft(i1);

f = FS*(0:length(i1)-1)/length(i1);

stem(f,abs(Y)/length(i1)*2)
xlim([0 500])


Ottenendo questo spettro in ampiezza:

Schermata 2018-03-26 alle 18.17.53.png


ZOOM

Schermata 2018-03-26 alle 18.19.01.png


che è palesemente sbagliato. Qualcuno può aiutarmi? è la prima volta che mi cimento in un'analisi di questo tipo e sono sicuro di star facendo tante stupidaggini
Avatar utente
Foto Utenteedomar
50 1 5
Frequentatore
Frequentatore
 
Messaggi: 140
Iscritto il: 9 lug 2013, 17:12

0
voti

[2] Re: MATLAB - Fast Fourier Transform FFT

Messaggioda Foto Utenteedomar » 26 mar 2018, 20:07

EDIT: ho cambiato un po' il codice, rileggendo un po' di teoria sulla FFT... La situazione è migliorata, ma non capisco perché non mi rappresenti la fondamentale e le sue multiple, sembra tutto "shiftato".. Posto le modifiche:
Codice: Seleziona tutto
f_fond = 50;
omega = 2*pi*f_fond;
t = theta/omega;

TS = t(2) - t(1);
FS = 1/TS;

n = 2^nextpow2(length(i1))
Y = fft(i1,n);

f = FS*(0:n-1)/n;

stem(f,abs(Y)/n*2)
xlim([0 500])




Schermata 2018-03-26 alle 20.04.14.png


Inoltre mi accorgo che variando il numero di elementi di theta (e quindi di t) il risultato cambia e anche di molto..
Avatar utente
Foto Utenteedomar
50 1 5
Frequentatore
Frequentatore
 
Messaggi: 140
Iscritto il: 9 lug 2013, 17:12

0
voti

[3] Re: MATLAB - Fast Fourier Transform FFT

Messaggioda Foto Utentegvee » 26 mar 2018, 21:22

Perché posti un codice incompleto ?
Esempi per calcolare la DFT con MATLAB li puoi trovare in questo libro, p.e. al capitlo DFT Applications.
Avatar utente
Foto Utentegvee
1.475 5 7
Sostenitore
Sostenitore
 
Messaggi: 525
Iscritto il: 11 feb 2018, 20:34

0
voti

[4] Re: MATLAB - Fast Fourier Transform FFT

Messaggioda Foto Utenteedomar » 26 mar 2018, 21:51

Ci sono 600 righe di codice prima... Posso postare "quello che serve"... Il problema è che non riesco a "estrarre" dal workspace il vettore i1.. Sai come si fa?

In rete ci sono tanti esempi, è vero... Ma sono tutti su combinazioni di sinusoidi, partendo dalla definizione di frequenza di campionamento, vettore del tempo, ecc ecc...
In questo caso ho un codice in cui dopo mille peripezie trovo questa corrente e devo studiarne gli spettri... Quindi l'intervallo di tempo è "vincolato"
Avatar utente
Foto Utenteedomar
50 1 5
Frequentatore
Frequentatore
 
Messaggi: 140
Iscritto il: 9 lug 2013, 17:12

0
voti

[5] Re: MATLAB - Fast Fourier Transform FFT

Messaggioda Foto UtenteMaranza » 26 mar 2018, 22:18

Help FFTshift!
Avatar utente
Foto UtenteMaranza
63 1 1 6
New entry
New entry
 
Messaggi: 97
Iscritto il: 26 set 2017, 8:38

0
voti

[6] Re: MATLAB - Fast Fourier Transform FFT

Messaggioda Foto Utenteedomar » 26 mar 2018, 22:27

Viene fuori una cosa improbabile... posto
Codice: Seleziona tutto
% analisi armonica corrente i1

omega = 2*pi*50;

t = theta/omega;

TS = t(2) - t(1);

FS = 1/TS;

n = 2^nextpow2(length(i1))

Y = fftshift(i1);

f = FS*(0:length(Y)-1)/length(Y);

stem(f,abs(Y)/length(Y)*2)
xlim([0 500])




Schermata 2018-03-26 alle 22.24.05.png


Non capisco...
Sai come scrivere qui sul forum un vettore che ho salvato solo sul workspace? In questo modo posso postare theta e i1..
Avatar utente
Foto Utenteedomar
50 1 5
Frequentatore
Frequentatore
 
Messaggi: 140
Iscritto il: 9 lug 2013, 17:12

0
voti

[7] Re: MATLAB - Fast Fourier Transform FFT

Messaggioda Foto Utentegvee » 26 mar 2018, 22:38

edomar ha scritto:Sai come scrivere qui sul forum un vettore che ho salvato solo sul workspace? In questo modo posso postare theta e i1..

Prova a salvare i vettori in un file .mat ed allegarli al forum.
Oppure i un file .dat e ne copi qui il contenuto tra i tag code.

Comunque se conosci il vettore di tempo dovresti conoscere direttamente la frequenza di campionamento.
Avatar utente
Foto Utentegvee
1.475 5 7
Sostenitore
Sostenitore
 
Messaggi: 525
Iscritto il: 11 feb 2018, 20:34

0
voti

[8] Re: MATLAB - Fast Fourier Transform FFT

Messaggioda Foto Utenteedomar » 26 mar 2018, 22:50

Esatto, è definita come TS nello script che ho postato.. Comunque il file .mat non è allegabile, il .dat mi dà fuori caratteri aramaici, tutto tranne il vettore.. non capisco il perché
Avatar utente
Foto Utenteedomar
50 1 5
Frequentatore
Frequentatore
 
Messaggi: 140
Iscritto il: 9 lug 2013, 17:12

0
voti

[9] Re: MATLAB - Fast Fourier Transform FFT

Messaggioda Foto Utentexyz » 26 mar 2018, 23:16

Se definisci TS in questo modo non ha senso:

Codice: Seleziona tutto
...
TS = t(2) - t(1);
....


Il tempo di campionamento non può essere uguale alla differenza dei primi 2 campioni.

Comunque non credo che serva allegare un inutile matrice, basta che parti con un segnale generato nel codice facile come una armonica ad una determinata frequenza e poi vedi cosa ottieni facendo FFT. Se il risultato ti sembra corretto al posto della singola armonica gli dai il tuo segnale e vedi cosa ottieni.
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

[10] Re: MATLAB - Fast Fourier Transform FFT

Messaggioda Foto Utenteedomar » 26 mar 2018, 23:20

Il vettore theta è equispaziato, per questo l'ho definito in questo modo..

hai ragione comunque, e il risultato è pure totalmente sbagliato:

Codice: Seleziona tutto
% analisi armonica corrente i1
theta = 0:0.001:2*pi;

omega = 2*pi*50;

t = theta/omega;

F = 10*sin(3*omega*t);

TS = t(2) - t(1);

FS = 1/TS;

n = 2^nextpow2(length(F));

Y = fft(F,n);

f = FS*(0:n-1)/n;

stem(f,abs(Y)/n*2)
xlim([0 500])



Schermata 2018-03-26 alle 23.21.15.png
Avatar utente
Foto Utenteedomar
50 1 5
Frequentatore
Frequentatore
 
Messaggi: 140
Iscritto il: 9 lug 2013, 17:12

Prossimo

Torna a Programmi applicativi: simulatori, CAD ed altro

Chi c’è in linea

Visitano il forum: Nessuno e 6 ospiti