Newsgroup: it.discussioni.ingegneria
Titolo: Info FFT

Salve,
avrei una domanda su matlab: so che viene molto usato in campo
ingegneristico ;)
Ho una serie di coordinate (x,y) di questo tipo. Sono i valori assunti
dalla funzione seno...
0.000	0.000
0.100	0.100
0.200	0.199
0.250	0.247
0.300	0.296
0.400	0.389
0.500	0.479
0.600	0.565
0.700	0.644
0.800	0.717
0.900	0.783
1.000	0.841
1.100	0.891
1.200	0.932
1.300	0.964
1.400	0.985
1.500	0.997
Con una FFT, vorrei ricavarne la frequenza.
Come posso fare?
Leggendo la guida di matlab, ho pensato di fare così:
y=[0.000,0.100,0.199,0.247,0.296....]
Y = fft(y,512);
Pyy = Y.* conj(Y) / 512;
f = 1000*(0:256)/512;
plot(f,Pyy(1:257))
title('Frequenza')
xlabel('frequency (Hz)')
Adesso, il problema è che lo spettro che ottengo è un picco piccato
su 15.625, mi aspettavo invece che fosse piccato su 1, visto che la
funzione di partenza è il sen(2 pi x)
Mi sapete dare suggerimenti ?
Grazie,
Andrea

 Andrea
Beh se volevi calcolare la trasformata di fourier di un segnale
sinusoidale è tutto sbagliato quello che scrivi in quanto Pyy
rappresenta l'autospettro di un segnale e non la trasformata di
Fourier.
Poi con il comando " Y = fft(y,512)" vai si a calcolare la trasformata
di fourier ma non del tuo segnale originale, infatti per y tu davi un
record di 16 punti, il 512 nella chiamata di funzione viene
interpretato da Matlab costruendo un record di 512 punti con i primi 16
valori pari al record y e i restanti vengono imposti pari a 0 (tecnica
dello zero padding), ecco perchè ti viene un'armonica a 15.6 Hz, non
stai considerando una sinusiode ma un'altra cosa!
Poi tu costruisci una sinusoide con periodo pari ad 1 s ma la vai ad
acquisire per 1,5 secondi, questo significa che avrai errore di leakage
quando vai a calcolare la trasformata, hai errore di leakage ogni volta
che il numero di punti acquisiti non rappresenta un numero intero di
periodi del segnale.
Qui sotto trovi il mio programma per il calcolo della FFT di un segnale
qualsiasi, puoi divertirti (divertirti?) a cambiare frequenza, ampiezza
del segnale parametri di acquisizione ecc ecc.
T = 2 	% periodo segnale in secondi
dt = 0.1 % intervallo di acquisizione del segnale
tempo = [0:dt:T]; % vettore tempo
y =sin(2*pi*tempo); % segnale sinusoidale con frequenza 1 Hz
N = length(tempo);  % numero di punti del record
% Calcolo fft
FT = fft(y);  % calcolo la trasformata di Fourier discreta del segnale
y
modFT = abs(FT); % modulo della FT
modFT(1) = modFT(1) * (1/N); % Normalizzo il modulo
modFT(2:N) = modFT(2:N) *(2/N); % Normalizzo il modulo
modFT = modFT(1:N/2); % la FT del segnale è simmetrica, prendo solo la
prima metà del record
% Disegno lo spettro di y
df = 1 / T; % risoluzione in frequenza dello spettro
freq = [0:df:(N/2-1)*df]; % vettore delle frequenze
plot(freq,modFT);

 del segnale parametri di acquisizione ecc ecc.
grazie per il programma!
Ti chiedo qualche cosa che non mi è chiara...
Io mi vorrei scrivere lo spettro del segnale come somma di coseni ognuno con
la sua fase.
quindi
             N
y=a0/2+sum m_k*cos(2*pi*f_k-g_k)
             k=1
dove pi= pi greco
m_k=ampiezza del segnale (il modulo dei singoli elementi della fft)
f_k= le frequenze, le leggo dalla fft, nei punti iin cui ho i picchi.
g_k le fasi.
Le fasi le ottengo tramite l'istruzione p=phase(FT)
A questo punto, mi vado a fare la sommatoria ed in questo modo mi
ricostruisco il segnale partendo dalla trasfomata.
Ho capito bene ?
Grazie!
Andrea
Ciao e grazie!
Andrea