Pagina 1 di 1

Problema FFT sul Matlab Signal Processing Toolbox

Inviato: 17 feb 2011, 13:10
da mctn
Salve. Calcolando la FFT di un semplice segnale sinusoidale, ho riscontrato dei problemi nell'utilizzo del Signal Processing Toolbox di Matlab che non so se attribuire ad una mia errata scrittura del codice o ad un bug del toolbox stesso :?

Il problema sorge nel momento in cui confronto il risultato di uno script che calcola la FFT, con quello fornito dall' SPTool. Sottolineo che ho riutilizzato uno script sulla FFT presente nell'help di Matlab, non cambiando quasi nulla.

Questo lo script in questione:

Codice: Seleziona tutto

 Fs = 1024; % Sampling frequency

t = 0:1/Fs:1-1/Fs;

% Create a sine wave of 200 Hz.
x = sin(2*pi*t*200);

% Use next highest power of 2 greater than or equal to length(x) to calculate FFT.
nfft= 2^(nextpow2(length(x)));

% Take fft, padding with zeros so that length(fftx) is equal to nfft
fftx = fft(x,nfft);


% Calculate the numberof unique points
NumUniquePts = ceil((nfft+1)/2);

% FFT is symmetric, throw away second half
fftx = fftx(1:NumUniquePts);

% Take the magnitude of fft of x and scale the fft so that it is not a function of the length of x
mx = abs(fftx)/(2*length(x)); 
%!! Si noti che il fattore 2 a moltiplicare length(x) è stato aggiunto solo per rendere il risultato dell'ampiezza della FFT compatibile con quella del SPTool, dato che questo (non so per quale motivo) dà l'ampiezza non dimezzata come dovrebbe essere, ma divisa per 4.

% This is an evenly spaced frequency vector with NumUniquePts points.
f = (0:NumUniquePts-1)*Fs/nfft;

% Generate the plot, title and labels.

subplot(2,1,1)
plot(f,mx);
title('Spectrum of a 200Hz Sine Wave');
xlabel('Frequency (Hz)');
ylabel('Amplitude');

subplot(2,1,2)
plot(f,20*log10(mx));


Il risultato di questo script è il seguente:

Cattura0.PNG
Cattura0.PNG (48.21 KiB) Visto 1939 volte


Confrontando il risultato con quello prodotto dall'SPToolbox IN QUESTO CASO non c'è alcun problema, infatti:

Cattura0lin.PNG
Cattura0lin.PNG (60.02 KiB) Visto 1939 volte


Cattura0dBsp.PNG
Cattura0dBsp.PNG (58.74 KiB) Visto 1935 volte


Come è possibile notare le ampiezze in dB e in scala lineare corrispondono.

Se invece provo a modificare la frequenza del segnale portandola a 1MHz, modificando anche la frequenza di campionamento e l'intervallo di segnale campionato:

Codice: Seleziona tutto

 Fs = 5.12e6; % Sampling frequency

t = 0:1/Fs:1e-4-1/Fs;

% Create a sine wave of 1 MHz.
x = sin(2*pi*t*1e6);


si verifica il problema in questione: l'ampiezza del grafico della FFT ottenuto dal ToolBox presenta uno scalamento esagerato in ampiezza (che ritengo errato, dato che la trasformata di fourier di un segnale sinusoidale corrisponde ad una delta di Dirac la cui ampiezza è la metà di quella del segnale nel dominio del tempo), rispetto a quello ottenuto dal mio script.

Questo è il grafico ottenuto con lo script:
Immagine

Mentre quelli ottenuti dal toolbox sono:

In scala lineare
Immagine
Come si nota lo scalamento è dell'ordine di 10^{-5}

In dB:
Immagine

Qualcuno saprebbe spiegarmi il perché? Grazie.

Re: Problema FFT sul Matlab Signal Processing Toolbox

Inviato: 26 mar 2011, 20:46
da Rozana
Salve.
Scusi per caso ha risolto questo problema? Mi trovo nelle stesse condizioni.
Grazie

Re: Problema FFT sul Matlab Signal Processing Toolbox

Inviato: 16 apr 2011, 10:46
da dimaios
Per cortesia inserite alcune informazioni utili che mancano per rispondere :

1. Versione di Matlab utilizzata
2. Versione del Signal Processing Toolbox utilizzato

Grazie.