Esperti matlab e FFT

Allora il problema è che non capisco bene tutti i passaggi per ottenere un analisi spettrale decente di un segnale.
Allora il mio problema è che ho un segnale e voglio scoprirne le frequenze fondametale, il segnale è campionato con una certa frequenza (1000Hz) e in un certo periodo.
Il problema non è tanto fare la fft in matlab ma graficare correttamente i risultati.
Il problema è che per graficarla ho bisogno di sapere cosa mettere sull’asse delle ascisse, si ci vanno le frequenze ma quali?
Allora aiutato dalle mille guide su internet ho capito che la frequenza teorica massima campionata sarà pari alla frequenza di campionamento.Quindi faccio una scala di intervalli che parte da 0 e arriva alla fc (frequenza di campionamento).
Ma cosi facendo il grafico è difficilmente interpretabile in quanto la funzione appare simmetrica rispetto alla verticale passante per fc/2.
Allora sulla guida di matlab ho trovato molti passaggi che risolvono questo inconveniente ma sinceramente non li capisco.
C’è qualcuno che me li spiega?
L’unica cosa che ho capito è che la NFFT serve per cercare la massima potenza in base 2 che posso ottenere dai dati che possiedo, questo per massimizzare l’efficienza della FFT che lavora appunto in potenza di 2.GIUSTO???

Fs = 1000; % Sampling frequency
T = 1/Fs; % Sample time
L = 1000; % Length of signal
t = (0:L-1)T; % Time vector
% Sum of a 50 Hz sinusoid and a 120 Hz sinusoid
x = 0.7
sin(2pi50t) + sin(2pi120t);
y = x + 2randn(size(t)); % Sinusoids plus noise
plot(Fs
t(1:50),y(1:50))
title(‘Signal Corrupted with Zero-Mean Random Noise’)
xlabel(‘time (milliseconds)’)
NFFT = 2^nextpow2(L); % Next power of 2 from length of y
Y = fft(y,NFFT)/L;
f = Fs/2*linspace(0,1,NFFT/2);

% Plot single-sided amplitude spectrum.
plot(f,2*abs(Y(1:NFFT/2)))
title(‘Single-Sided Amplitude Spectrum of y(t)’)
xlabel(‘Frequency (Hz)’)
ylabel(’|Y(f)|’)

Questo è cioè che c’è sulla guida.

Non capisco perche NFFT lo trova cosi?
Perche divide la fft per L?
Perche moltiplica gli intervalli per Fs/2?
Perche c’è il 2 quando plotta 2*abs()??

PS:ragazzi scusate se posto sempre questi argomenti forse per tanti un po pallosi ma ho notato che nel forum c’è molta gente preparata (soprattutto studenti di ingegneria) e ne approfitto per chiedere cose tecniche.
Se è una cosa contro le regole del forum vi prego di comunicarmelo.

Allora non mi intendo di analisi spettrale e non ho mai usato la fft di matlab, ma intanto posso rispondere a questa affermazione:

Allora aiutato dalle mille guide su internet ho capito che la frequenza teorica massima campionata sarà pari alla frequenza di campionamento.

Se campioni a una certa frequenza di campionamento fc, puoi interpretare correttamente solo segnali con frequenze fino a fc/2, per il Teorema di Nyquist-Shannon.
Intuitivamente se hai una sinusoide a 1000 Hz e tu campioni con la stessa frequenza il segnale che ottieni è (trascurando i disturbi) una retta perfetta. Se il segnale ha componenti superiori a fc/2 queste disturberanno le componenti inferiori a fc/2, in modo simmetrico: questo è l’aliasing. Questo fenomeno si ha per esempio quando guardi una ruota di un’auto che ha una frequenza maggiore della tua frequenza di campionamento negli occhi: la ruota sembra ruotare più lentamente e al contrario.
Per questo motivo nella realtà prima di campionare si fa passare il segnale per un filtro passa-basso che taglia le frequenze sopra a fc/2. Nel tuo caso dovresti campionare a 1000 Hz due sinusoidi a 50 e 120 Hz, quindi è ok, ma aggiungi un rumore che mi pare, a prima vista, “bianco”, quindi si distruibuisce uniformemente su tutte le frequenze, e questo dovrebbe essere un problema… :thinking:

Per quanto riguarda il codice in sè, se non hai troppa fretta ci guardo con calma, che sono straimpegnato con gli esami. :stuck_out_tongue_winking_eye:

Grazie infinite della risposta, credevo che ormai fosse morta questa discussione.

Allora per quanto riguarda la frequenza di campionamento e l’aliasing mi sono informato dopo che avevo gia inserito il post quindi ho capito questi problemi.

Se mi dai un aiuto con il codiceti sarei molto grato anche se in questo periodo (da quando ho messo il post) ho fato passi da gigante e ho capito molte cose.

Ma non capisco un paio di cose tipo a volte moltiplica o divide per L e non ne capisco il motivo.

anche io non riesco a capire perchè divida la fft per L
per caso qualcuno puo spiegarmelo?
grazie

Per aver la frequenza normalizzata ad un periodo?

Paolo

sinceramente non lo so. Però mi ricordo una volta che avevo fatto la fft di un segnale di tensione, che questa mi restituiva Volt/Hz. Quindi, forse dividendo per L è come se moltiplicassi per la frequenza, in modo da ottenere l’ampiezza vera e propria.
Questa è solo una teoria? qualcuno la puo confermare?

Se ho letto giusto L e’ la lunghezza del segnale (il numero di campioni) quindi se dividi per L ottieni uno spettro tra zero ed uno dove l’unita’ di misura e’ un periodo.

Paolo

no no ho fatto la prova. Il range di frequenze della trasformata è esatto. La divisione per L effettua solamente una scalatura in ampiezza dello spettro. Ma non ne capisco il motivo
cmq L è il numero di campioni del segnale in ingresso che si vuole analizzare.

Salve, qualcuno potrebbe postare urgentemente, per cortesia, il codice matlab che prende un segnale generico in ingresso e determini l’analisi in sottobande con filtri di fourier e filtri wavelet?..Sostanzialmente occorre calcolare con i due metodi (Fourier e Wavelet) la potenza di ogni sottobanda in watt o dB e verificare che la somma delle potenze nelle sottobande coincida con la potenza totale del segnale in ingresso.