Pagina 1 di 1

Consigli su FFT con Matlab

MessaggioInviato: 26 giu 2013, 10:22
da paologerv
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à!

Re: Consigli su FFT con Matlab

MessaggioInviato: 27 giu 2013, 8:28
da simo85
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.

Re: Consigli su FFT con Matlab

MessaggioInviato: 27 giu 2013, 9:56
da paologerv
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_/

Re: Consigli su FFT con Matlab

MessaggioInviato: 27 giu 2013, 11:51
da xyz
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".

Re: Consigli su FFT con Matlab

MessaggioInviato: 27 giu 2013, 16:03
da paologerv
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....

Re: Consigli su FFT con Matlab

MessaggioInviato: 27 giu 2013, 19:37
da dimaios
Foto Utentepaologerv , allega i dati ad un post così possiamo interagire in modo più efficace.

Re: Consigli su FFT con Matlab

MessaggioInviato: 28 giu 2013, 9:56
da paologerv
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.

Re: Consigli su FFT con Matlab

MessaggioInviato: 28 giu 2013, 11:02
da xyz
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 11516 volte


Hai credo del rumore ad alta frequenza.

Testato con Octave 3.6.4 sotto Linux.

Re: Consigli su FFT con Matlab

MessaggioInviato: 28 giu 2013, 11:30
da paologerv
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!!