Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Consigli su FFT con Matlab

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] Consigli su FFT con Matlab

Messaggioda Foto Utentepaologerv » 26 giu 2013, 10:22

Salve a tutti gli utenti del forum,

come scritto nel titolo ho dei problemi a generare la FFT con Matlab. Partiamo dall'inizio: ho prelevato un segnale da un oscilloscopio Tektronix e trasformato in una matrice 2X20000 di dati. Plottando con matlab tale segnale nel tempo, non si riscontrano particolari differenze con lo screenshot dell'oscilloscopio

Immagine
"da Matlab"


Immagine
"screenshot


Il problema si presenta quando vado a fare la FFT; il codice è il seguente:

Codice: Seleziona tutto
signal = load ('D:\grafici misure\appr_cap.dat');
x=signal (:,1);
y=signal (:,2);
plot (x,y);
grid on;
title('Andamento di Vm nel tempo');
xlim([min(x) max(x)]);
xlabel('Time (s)');
ylabel('Vm (V)');

%FFT
fs = 5*10^9;
ts=1/fs;
N=length(signal);
t= (0:N-1)*ts;
figure();
NFFT = 2^nextpow2(N); %L’algoritmo è più efficiente se N è uguale ad una potenza di 2
Y = fft (signal,NFFT)/N;
f = fs/2*linspace(0,1,NFFT/2+1);
semilogx(f,20*log(abs(Y(1:NFFT/2+1))),'k') %è lo stesso di 'plot' solo con asse x log
% plot(f(1:NFFT/2+1),2*abs(Y(1:NFFT/2+1)));
%figure;
title('Spettro V_R_m');
%legend('|Y(f)|');
xlabel('Frequenza (Hz)')
ylabel('|Y(f)| (dB)')
grid on;


con il seguente risultato:
Immagine

dove può essere l'errore??
ho provato a cambiare la forma del segnale nella matrice ma non ottengo miglioramenti con:

y = sin(45.5*10^6.*x); %segnale sinusoidale in 40us

Grazie a chi mi risponderà!
Avatar utente
Foto Utentepaologerv
15 2
 
Messaggi: 18
Iscritto il: 22 gen 2013, 18:39

0
voti

[2] Re: Consigli su FFT con Matlab

Messaggioda Foto Utentesimo85 » 27 giu 2013, 8:28

Se non lo hai già fatto, potresti sfruttare la visualizzazione della DFT facendo eseguire l'algoritmo FFT all'oscilloscopio digitale.
Dovrebbe esserci questa opzione. :)

Non ricordo di aver mai analizzato con un editore di testi un file con estensione .dat, ma se puoi risalire al segnale penso che anche la rappresentazione della DFT non dovrebbe essere impossibile o difficile appunto attraverso il file .dat.

Ad ogni modo al seguente link hai un bell'esempio dell'uso dell'algoritmo FFT:

http://www.dsprelated.com/dspbooks/mdft ... usoid.html

Spero possa esserti utile.
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[3] Re: Consigli su FFT con Matlab

Messaggioda Foto Utentepaologerv » 27 giu 2013, 9:56

Ciao Simo85,

posso sfruttare la DFT con l'oscilloscopio, ma devo poter gestire i dati in matlab così da confrontare diversi segnali sovrapposti.

Il segnale è un semplice .dat che ricrea una matrice 20000x2 che può essere letta sia in matlab che con editor di testo.

Ora mi guardo per benino il file che mi hai proposto. Grazie per la risposta! O_/
Avatar utente
Foto Utentepaologerv
15 2
 
Messaggi: 18
Iscritto il: 22 gen 2013, 18:39

0
voti

[4] Re: Consigli su FFT con Matlab

Messaggioda Foto Utentexyz » 27 giu 2013, 11:51

Ho dato solo una rapita occhiata al codice, sei sicuro di prendere i dati giusti, dici di avere una matrice con due righe 2 ma nel codice usi 2 colonne, credo tempo e campione, la FFT di solito è fatta solo sui campioni non su tutte e due i dati.

Poi usi "5*10^9", scrivelo "5.E9" eviti di calcolarlo. La funzione "log" calcola i logaritmi naturali, quelli in base 10 la funzione è "log10".
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

[5] Re: Consigli su FFT con Matlab

Messaggioda Foto Utentepaologerv » 27 giu 2013, 16:03

Salve xyz,

xyz ha scritto:dici di avere una matrice con due righe 2 ma nel codice usi 2 colonne, credo tempo e campione, la FFT di solito è fatta solo sui campioni non su tutte e due i dati.


in effetti ho sbagliato prima a scrivere 2x20000, ho una matrice di 2 colonne, come ben detto da te, una con i valori nel tempo e l'altra con i valori in tensione. Per quanto riguarda la Y

Codice: Seleziona tutto
Y = fft (signal,NFFT)/N;


ho seguito mathworks per trovare la DFT a N-punti
http://www.mathworks.it/it/help/matlab/math/fast-fourier-transform-fft.html
http://www.mathworks.it/it/help/matlab/ref/fft.html

xyz ha scritto:Poi usi "5*10^9", scrivelo "5.E9" eviti di calcolarlo. La funzione "log" calcola i logaritmi naturali, quelli in base 10 la funzione è "log10".


pensavo di aver trovato l'errore, ma il risulato non cambia con log10 :cry:


simo85 ha scritto:Ad ogni modo al seguente link hai un bell'esempio dell'uso dell'algoritmo FFT:

http://www.dsprelated.com/dspbooks/mdft ... usoid.html


purtroppo non mi è stato d'aiuto....
Avatar utente
Foto Utentepaologerv
15 2
 
Messaggi: 18
Iscritto il: 22 gen 2013, 18:39

1
voti

[6] Re: Consigli su FFT con Matlab

Messaggioda Foto Utentedimaios » 27 giu 2013, 19:37

Foto Utentepaologerv , allega i dati ad un post così possiamo interagire in modo più efficace.
Ingegneria : alternativa intelligente alla droga.
Avatar utente
Foto Utentedimaios
30,2k 7 10 12
G.Master EY
G.Master EY
 
Messaggi: 3381
Iscritto il: 24 ago 2010, 14:12
Località: Behind the scenes

0
voti

[7] Re: Consigli su FFT con Matlab

Messaggioda Foto Utentepaologerv » 28 giu 2013, 9:56

dimaios ha scritto:Foto Utentepaologerv , allega i dati ad un post così possiamo interagire in modo più efficace.


ciao dimaios, in allegato trovi il file dei dati. Per essere precisi, la matrice è 19994x2.
Allegati
appr_capac.rar
(46.6 KiB) Scaricato 169 volte
Avatar utente
Foto Utentepaologerv
15 2
 
Messaggi: 18
Iscritto il: 22 gen 2013, 18:39

4
voti

[8] Re: Consigli su FFT con Matlab

Messaggioda Foto Utentexyz » 28 giu 2013, 11:02

Ho revisionato e corretto il codice, spero di aver capito cosa volevi ottenere.

Codice: Seleziona tutto
close all

signal = load ('appr_capac.txt');

x=signal (:,1);
y=signal (:,2);

plot (x,y);
grid on;
title('Andamento di Vm nel tempo');
xlim([min(x) max(x)]);
xlabel('Time (s)');
ylabel('Vm (V)');

%FFT
fs = 5E9;
ts=1/fs;
N=length(y);
t= (0:N-1)*ts;
figure();
NFFT = 2^nextpow2(N);
%L’algoritmo è più efficiente se N è uguale ad una potenza di 2
Y = fft(y,NFFT)/N;
f = fs/2*linspace(0,1,NFFT/2+1);

semilogx(f,20*log10(abs(Y(1:NFFT/2+1))),'k') %è lo stesso di 'plot' solo con asse x log

% plot(f(1:NFFT/2+1),2*abs(Y(1:NFFT/2+1)));
%figure;
title('Spettro V_R_m');
%legend('|Y(f)|');
xlabel('Frequenza (Hz)')
ylabel('|Y(f)| (dB)')
grid on;


Come detto prima i calcoli venivano fatti sia sulla prima, il tempo, che sulla seconda colonna, i campioni, in contemporanea. La prima colonna è una rampa e la sua FFT veniva disegnata insieme a quella del segnale.

In definitiva il risultato è questo:

dump.png
dump.png (28.18 KiB) Osservato 11511 volte


Hai credo del rumore ad alta frequenza.

Testato con Octave 3.6.4 sotto Linux.
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

2
voti

[9] Re: Consigli su FFT con Matlab

Messaggioda Foto Utentepaologerv » 28 giu 2013, 11:30

Grazie Foto Utentexyz finalmente ho capito l'errore ed mi hai fatto arrivare a quello che cercavo! In effetti sulla FFT caricavo tutta la matrice e non i campioni =D> Grazie mille!!
Avatar utente
Foto Utentepaologerv
15 2
 
Messaggi: 18
Iscritto il: 22 gen 2013, 18:39


Torna a Programmi applicativi: simulatori, CAD ed altro

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti