You are on page 1of 38

fft - Fast Fourier transform

Sintaxis
Y Y Y Y = = = = fft(x) fft(X,n) fft(X,[],dim) fft(X,n,dim)

Definiciones
Las funciones Y = fft(x) e y = ifft(X) implementan el par de la transformada y la transformada inversa sobre los vectores de longitud N mediante:

donde

es la raz N-esima de la unidad.

Descripcion
Y = fft(x) devuelve la Transformada de Fourier Discreta (DFT) del vector x, calculado con

el algoritmo de la Transformada Rpida de Fourier (FFT). Si la entrada X es una matriz, Y = fft(X) devuelve la transformada de Fourier de cada uno de las columnas de la matriz. Si la entrada X es un arreglo multidimensional, fft operates on the first nonsingleton dimensin. Y = fft(X,n) devuelve la DFT de n-puntos. La fft(X) es equivalente a fft(X,n) donde n es el tamao de X in the first nonsingleton dimension. Si la longitud de X es menor que n, X es rellenado con ceros hasta la longitud de n. Si la longitud de X es mayor que n, la secuencia X es truncada. Cuando X es una matriz, la longitud de las columnas es ajustada en la misma manera. Y = fft(X,[],dim) e Y = fft(X,n,dim) aplica la operacin de FFT a travs de la dimensin dim.

Ejemplos
Un uso comn de la transformada de Fourier es hallar las componentes de frecuencia de una seal dentro de una seal ruidosa en el dominio del tiempo. Considere la data muestreada a 1000 Hz. Formemos una seal conteniendo una sinusoide de 50 Hz, de amplitud 0.7 y una sinusoide de 120 Hz de amplitud 1, corrompida con algn ruido aleatorio de media cero:
Fs = 1000; T = 1/Fs; L = 1000; t = (0:L-1)*T; % Frecuencia de muestreo % Tiempo de muestreos % Longitud de la seal % Vector de tiempo

% Suma de una sinusoide de 50 Hz y una sinusoide de 120 Hz x = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t); y = x + 2*randn(size(t)); plot(Fs*t(1:50),y(1:50)) title('Signal Corrupted with Zero-Mean Random Noise') xlabel('time (milliseconds)') % Sinusoide ms ruido

Es difcil identificar los componentes de frecuencia al observar la seal original. Al convertirla al dominio de la frecuencia, la transformada de Fourier discreta de la seal ruidosa, se encuentra tomando la transformada rpida de Fourier (FFT):
NFFT = 2^nextpow2(L); % Potencia cercana de 2 de la longitud de y Y = fft(y,NFFT)/L; f = Fs/2*linspace(0,1,NFFT/2+1); % Grafica del espectro e amplitud de un solo lado. plot(f,2*abs(Y(1:NFFT/2+1))) title('Single-Sided Amplitude Spectrum of y(t)') xlabel('Frequency (Hz)') ylabel('|Y(f)|')

La principal razn del porque las amplitudes no son exactamente 0,7 y 1 es por el ruido. Varias ejecuciones de este cdigo (incluyendo reclculo de y) producen diferentes aproximaciones a 0,7 y 1. La otra razn es que usted tiene una seal de longitud finita. El aumento de L de 1000 a 10000 en el ejemplo anterior, producen aproximaciones mucho mejor en promedio

Algoritmos
Las funciones de FFT (fft, fft2, fftn, ifft, ifft2, ifftn) estan basados en una libreria denominada FFTW [3], [4]. Para calcular la DFT de N-puntos cuando N es compuesta (esto es, cuando N = N1N2), la libreria FFTW descompone el problema usando el algoritmo de Cooley-Tukey [1], el cual primero calcula N1 transformadas de tamao N2, y luego calcula N2 transformadas de tamao N1. La descomposicin es aplicada recursivamente tanto para las DFT de N1 y N2-puntos. Las DFT, hasta que el problema pueda resolverse, utiliza una de las

varias mquinas generados de tamao fijo o "codelets". El codelets a su vez utiliza varios algoritmos en combinacin, incluyendo una variacin de Cooley-Tukey [5], un algoritmo de factor prima [6], y un algoritmo de radix dividida [2]. La factorizacin particular de N es elegida heursticamente.
Cuando N es un nmero primo, la librera FFTW primero descompone un problema de Npuntos en tres problemas de (N-1)-puntos usando el algoritmo de Rader [7]. Este luego usa la descomposicin de Cooley-Tukey, descrito anteriormente, para calcular las DFT de ( N 1)-puntos. Para la mayora de N, las DFT de entrada real requieren aproximadamente la mitad del tiempo de clculo de la DFT de entrada complejo. Sin embargo, cuando N tiene factores primos grandes, la diferencia en la velocidad de procesamiento es muy pequea o nada.

El tiempo de ejecucin para la FFT depende de la longitud de la transformacin. Es ms rpido para las potencias de dos. Es casi tan rpido para las longitudes que tienen nicamente factores primos pequeas. Es normalmente varias veces ms lento para las longitudes que son primos o que tienen factores primos grandes.
Note Es posible que pueda aumentarse la velocidad de la fft usando la funcin de utilidad fftw, quien controla la optimizacin del algoritmo usado para calcular una FFT de una dimensin y tamao particular.

Tipos de datos Soportados


fft soporta entradas de datos de los tipos double y single. Si se llama a la fft con la sintaxis y = fft(X, ...), la salida y tiene los mismos tipos de datos que la entrada X.

Referencias
[1]. Cooley, J. W. and J. W. Tukey, "An Algorithm for the Machine Computation of the Complex Fourier Series,"Mathematics of Computation, Vol. 19, April 1965, pp. 297301. [2]. Duhamel, P. and M. Vetterli, "Fast Fourier Transforms: A Tutorial Review and a State of the Art," Signal Processing, Vol. 19, April 1990, pp. 259-299.

[3]. FFTW (http://www.fftw.org)


[4]. Frigo, M. and S. G. Johnson, "FFTW: An Adaptive Software Architecture for the FFT,"Proceedings of the International Conference on Acoustics, Speech, and Signal Processing, Vol. 3, 1998, pp. 1381-1384. [5]. Oppenheim, A. V. and R. W. Schafer, Discrete-Time Signal Processing, Prentice-Hall, 1989, p. 611. [6]. Oppenheim, A. V. and R. W. Schafer, Discrete-Time Signal Processing, Prentice-Hall, 1989, p. 619. [7]. Rader, C. M., "Discrete Fourier Transforms when the Number of Data Samples Is Prime," Proceedings of the IEEE, Vol. 56, June 1968, pp. 1107-1108. Ver tambien
dftmtx | fft2 | fftn | fftshift | fftw | filter | freqz | ifft

1.1 Transformada Rpida de Fourier (FFT)


Introduccin

La FFT en una dimension La FFT en multiple dimensiones

1.1.1 Introduccin
DFT con un milln de puntos es comn en muchas aplicaciones. El procesamiento de seales e imgenes en aplicaciones modernas serian imposible sin un eficiente mtodo para calcular la DFT.

La aplicacin directa de la definicin de la DFT (Ver Discrete Fourier Transform (DFT)) ta un vector de datos de longitud n requiere de n multiplicaciones y n sumas un total de 2n2 operaciones de punto flotante. Esto no incluye la generacin de las potencias de la n-esima raz compleja de la unidad . Para calcular el DFT de un milln de puntos, un computador capaz de hacer una multiplicacin y una suma cada microsegundo requerir de un milln de segundos o alrededor de 11.5 das. Los algoritmos de Fast Fourier Transform (FFT) tienen una complejidad computacional de O(nlogn) en lugar de O(n2). Si n es una potencia de 2, una FFT de una dimensin de longitud n requerir menos que 3nlog2n operaciones de punto-flotante (un nmero de veces de una constante de proporcionalidad). Para n = 220, es un factor de casi 35,000 veces ms rpido que 2n2. Las funciones de MATLAB

fft, fft2,

fftn

(y sus inversas

ifft, ifft2,

ifftn,

respectivamente) todos usan algoritmos rpidos de transformada de Fourier para calcular la DFT.
Nota. Los algoritmos de FFT de MATLAB FFT estn basadas en FFTW, "The Fastest Fourier Transform in the West" (http://www.fftw.org). Ver

fft y fftw para mayores detalles.

Cuando se usan algoritmos de FFT, debe de distinguirse entre la longitud de la ventana y la longitud de la transformada. La longitud de la ventana es la longitud del vector de datos de entrada. Este es determinado, por ejemplo, por el tamao de un buffer externo. La longitud de la transformada es la longitud de la salida, el DFT calculado. Un algoritmo de FFT rellena o trocea la entrada para realizar la deseada longitud de la transformada. La siguiente figura ilustra las dos longitudes.

El tiempo de ejecucin de un algoritmo FFT depende de la longitud de la transformada. Es ms rpido cuando la longitud de la transformada es una potencia de dos, y casi tan rpido cuando la longitud de la transformada tiene nicamente factores primos pequeos. Es tpicamente ms lenta para longitudes de transformada que son primos o con factores primos grandes. Estas diferencias de tiempo, sin embargo, son reducidos significativamente por los modernos algoritmos de FFT tales como los algoritmos usados en MATLAB. Ajustar la longitud de estas transformadas para una mayor eficiencia es usualmente innecesario en la prctica.

1.1.2 La FFT en una dimensin


Introduccin Ejemplo: Anlisis espectral bsico Ejemplo: Anlisis espectral de una llamada de una ballena

Ejemplo: Interpolacin de datos

1.1.2.1
La funcin

Introduccin

fft

de MATLAB devuelve la DFT

de un vector de entrada

usando un

algoritmo de transformada rpida de Fourier: y = fft(x);

fft, la longitud de la ventana m = length(x) transformada n = length(y) son los mismos.


En este llamado a la

y la longitud de la

La longitud de la transformada es especificado es especificado por un segundo argumento opcional: y = fft(x,n);

x es menor que n, x es rellenado con ceros hacia adelante para incrementar su longitud a n antes de calcular la DFT. Si la longitud de x es mayor que n, nicamente los primeros n elementos de x son usados para calcular la transformada.
En esta llamada a la longitud de la transformada es longitud de

fft, la

n. Si la

1.1.2.2

Ejemplo: Anlisis espectral bsico

La FFT les permitir estimar eficientemente las componentes de frecuencia en la data a partir de un conjunto discreto de valores muestreados a una tasa fija. Las cantidades relevantes en un anlisis espectral estn listadas en la siguiente tabla. Para datos basados en el espacio, remplace las referencias al tiempo con referencias al espacio. Cantidad x m = length(x) fs dt = 1/fs t = (0:m-1)/fs y = fft(x,n) abs(y) (abs(y).^2)/n fs/n f = (0:n-1)*(fs/n) fs/2 Descripcin Datos muestreados Longitud de l ventana (numero de muestras) Muestras/unidad de tiempo Incremento de tiempo por muestra Rango del intervalo de tiempo para la data Transformada de Fourier Discreta (DFT) Amplitud de la DFT Potencia de la DFT Incremento de frecuencia (resolucin) Rango del intervalo de frecuencia Frecuencia de Nyquist

Por ejemplo, considere la siguiente data de

con dos componentes de frecuencia de

diferentes amplitudes y fases contaminados con ruido: fs = 100; t = 0:1/fs:10-1/fs; x = (1.3)*sin(2*pi*15*t) ... % Frecuencia de muestreo (Hz) % 10 segundos de muestra % Componente de 15 Hz

+ (1.7)*sin(2*pi*40*(t-2)) ... + (2.5)*randn(size(t));

% Componente de 40 Hz % Ruido Gaussiano;

Usemos la fft para calcular la DFT y la potencia de y: m = length(x); n = pow2(nextpow2(m)); y = fft(x,n); f = (0:n-1)*(fs/n); power = y.*conj(y)/n; % Longitud de la ventana % Longitud de la transformada % DFT % Rango de frecuencia % Potencia de la DFT

nextpow2 halla el exponente de la potencia de 2 ms cercana mayor o igual a la longitud de la ventana (ceil(log2(m))), y

pow2

calcula la potencia. Usando una potencia de dos

para la longitud de la transformada optimiza el algoritmo de la FFT, aunque en la prctica exista usualmente una pequea diferencia en el tiempo de ejecucin al usar Para visualizar la DFT, las grficas de

n = m.

abs(y), abs(y).^2,

log(abs(y))son

todas comunes.
periodograma: plot(f,power)

Una grafica de la potencia versus frecuencia es denominada un

xlabel('Frequency (Hz)') ylabel('Power') title('{\bf Periodogram}')

La primera mitad del rango e frecuencia (de 0 a la frecuencia de Nyquist

fs/2)

es

suficiente para identificar las componentes de frecuencia en la data, desde que la segunda mitad es justo un reflejo de l primera mitad.

En muchas aplicaciones es tradicional centrar el periodograma en 0. La funcin re arregla la salida de la

fftshift

fft

con un desplazamiento circular para producir un

periodograma centrado en cero: y0 = fftshift(y); f0 = (-n/2:n/2-1)*(fs/n); power0 = y0.*conj(y0)/n; plot(f0,power0) xlabel('Frequency (Hz)') ylabel('Power') title('{\bf 0-Centered Periodogram}') % Re arregla los valores de y % Rango de frecuencia centrado en 0 % Potencia centrado en 0

El re arreglo hace uso de la periodicidad en la definicin de la DFT (Ver Discrete Fourier Transform (DFT)). Use las funciones de MATLAB DFT: phase = unwrap(angle(y0)); plot(f0,phase*180/pi) xlabel('Frequency (Hz)') ylabel('Phase (Degrees)') grid on

angle

unwrap

para crear una grafica de la fase de la

Las componentes de frecuencias son en su mayora ocultos por la aleatoriedad en la fase en valores adyacentes. La tendencia al alza en la grafica se debe a la funcin desenvolver, que en este caso suma a la fase 2 con ms frecuencia de lo que resta. 1.1.2.3 Ejemplo: Anlisis espectral de la llamada de una ballena El archive de ejemplo

bluewhale.au

contiene data de audio de la vocalizacin una

ballena azul del Ocano Pacifico grabada por micrfonos bajo el agua en la costa de California. El archivo es de la librera de las vocalizaciones de animales mantenido por el Programa de Investigacin Bioacustica de la Universidad de Cornell.
Nota. La documentacin de los archives de ejemplo para matemticos de MATLAB estn ubicados en la subcarpeta

\help\techdoc\math\examples

de la carpeta raz de MATLAB

(matlabroot). Esta subcarpeta no se encuentra en la ruta de MATLAB en la instalacin. Para usar los archivos de MATLAB de esta subcarpeta, ya sea que adicione la subcarpeta a la ruta de MATLAB (addpath) o haga la subcarpeta como la carpeta actual de trabajo (cd).

Debido a que las llamadas de la ballena azul son muy bajas, son raramente audibles a los humanos. La escala de tiempo en la data esta comprimido por un factor de 10 para elevar el pitch y hacer la llamada ms claramente audible. El siguiente cdigo lee, grafica, y reproduce la data: [x,fs] = auread('bluewhale.au'); plot(x) xlabel('Sample Number') ylabel('Amplitude') title('{\bf Blue Whale Call}') sound(x,fs)

Una A "trill" es seguido por una serie de B "moans." La llamada B es la ms simple y fcil de analizar. Use la grafica anterior para determinar aproximadamente los ndices para el comienzo y el fin de la primera llamada B. Corrija la base de tiempo por un factor de 10 para acelerar la data: bCall = x(2.45e4:3.10e4); tb = 10*(0:1/fs:(length(bCall)-1)/fs); % Time base plot(tb,bCall) xlim([0 tb(end)]) xlabel('Time (seconds)') ylabel('Amplitude') title('{\bf Blue Whale B Call}')

Use la

fft para calcular

la DFT de la seal. Corrija el rango de frecuencias por un factor de

10 para acelerar la data: m = length(bCall); n = pow2(nextpow2(m)); y = fft(bCall); f = (0:n-1)*(fs/n)/10; p = y.*conj(y)/n; % Window length % Transform length % DFT of signal % Frequency range % Power of the DFT

Graficando la primera mitad del periodograma, hasta la frecuencia de Nyquist: plot(f(1:floor(n/2)),p(1:floor(n/2))) xlabel('Frequency (Hz)') ylabel('Power') title('{\bf Component Frequencies of a Blue Whale B Call}')

La llamada B est compuesto de una frecuencia fundamental alrededor de 17 Hz y una secuencia de armnicos, con el segundo armnico enfatizado. 1.1.2.4 Ejemplo: Interpolacin de datos Este ejemplo demuestra la FFT en un contexto diferente al del anlisis espectral la estimacin de los coeficientes de un polinomio trigonomtrico que interpola un conjunto de datos espaciados regularmente. Esta aproximacin de interpolacin de datos es descrito en [1]. Varias personas descubrieron algoritmos rpidos DFT de forma independiente, y muchas personas han contribuido a su desarrollo. Un documento de 1965 por John Tukey y John Cooley [2] es generalmente reconocido como el punto de partida para el uso moderno de la FFT. Sin embargo, un trabajo de Gauss publicado pstumamente en 1866 [3] (y fechado en 1805) contiene el uso indiscutible de la tcnica de separacin que forma la base de los modernos algoritmos FFT. Gauss se interes en el problema de calcular con exactitud las rbitas de los asteroides a partir de observaciones de sus posiciones. Su artculo contiene 12 puntos de datos sobre la posicin del asteroide Pallas, a travs del cual desea interpolar un polinomio trigonomtrico con 12 coeficientes. En lugar de resolver el sistema resultante de 12 por 12 de ecuaciones lineales a mano, Gauss busc un atajo. Descubri cmo separar las ecuaciones en tres subproblemas que eran mucho ms fciles de resolver, y luego cmo se recombinan las soluciones para obtener el resultado deseado. La solucin es equivalente a la estimacin de la DFT de los datos con un algoritmo FFT. Aqu est la data que apareci en el artculo de Gauss: asc = 0:30:330; dec = [408 89 -66 10 338 807 1238 1511 1583 1462 1183 804]; plot(asc,dec,'ro','Linewidth',2) xlim([0 360]) xlabel('Ascension (Degrees)')

ylabel('Declination (Minutes)') title('{\bf Position of the Asteroid Pallas}') grid on

Gauss deseaba interpolar un polinomio trigonomtrico de la forma:

El siguiente cdigo usa la d = fft(dec); m = length(dec);

fft para realizar un equivalente clculo de Gauss:

M = floor((m+1)/2); a0 = d(1)/m; an = 2*real(d(2:M))/m; a6 = d(M+1)/m; bn = -2*imag(d(2:M))/m; Graficando lo interpolado con la data: hold on x = 0:0.01:360; n = 1:length(an); y = a0 + an*cos(2*pi*n'*x/360) ... + bn*sin(2*pi*n'*x/360) ... + a6*cos(2*pi*6*x/360); plot(x,y,'Linewidth',2) legend('Data','DFT Interpolant','Location','NW')

Referencias.

[1]. Briggs, W. and V.E. Henson. The DFT: An Owner's Manual for the Discrete Fourier Transform. Philadelphia: SIAM, 1995.

[2]. Cooley, J.W. and J.W. Tukey. "An Algorithm for the Machine Calculation of Complex Fourier Series." Mathematics of Computation. Vol. 19. 1965, pp. 297301. [3]. Gauss, C. F. "Theoria interpolationis methodo nova tractata." Carl Friedrich Gauss Werke. Band 3. Gttingen: Kniglichen Gesellschaft der Wissenschaften, 1866. [4]. Heideman M., D. Johnson, and C. Burrus. "Gauss and the History of the Fast Fourier Transform." Arch. Hist. Exact Sciences. Vol. 34. 1985, pp. 265277. [5]. Goldstine, H. H. A History of Numerical Analysis from the 16th through the 19th Century. Berlin: Springer-Verlag, 1977.

1.2

Usando la FFT

Esta demostracin usa la funcin FFT para analizar las variaciones en la actividad de las manchas solares sobre los ltimos 300 aos. La actividad de las manchas solar es cclica, alcanzando un mximo aproximadamente cada 11 aos. Vamos a confirmarlo. Aqu hay una grafica de una cantidad llamada el nmero relativa de manchas solares de Zurich, que mide tanto en nmero y tamao de las manchas solares. Los astrnomos han tabulado este nmero de casi 300 aos. load sunspot.dat year=sunspot(:,1); relNums=sunspot(:,2); plot(year,relNums) title('Sunspot Data')

Aqu est una mirada ms de cerca a los primeros 50 aos. plot(year(1:50),relNums(1:50),'b.-');

La herramienta fundamental de procesamiento de seales es la FFT, o la Transformada Rpida de Fourier. Para tomar la FFT de la data de las manchas solares escriba lo siguiente. El primer componente de Y, Y(1), es simplemente la suma de los datos, y se puede quitar. Y = fft(relNums); Y(1)=[];

Una grfica de la distribucin de los coeficientes de Fourier (dada por Y) en el plano complejo es bonito, pero difcil de interpretar. Necesitamos una forma ms til de examinar los datos en Y. plot(Y,'ro') title('Fourier Coefficients in the Complex Plane'); xlabel('Real Axis'); ylabel('Imaginary Axis');

La magnitud compleja al cuadrado de Y se llama la potencia, y una grafica de la potencia frente a la frecuencia es un "periodograma". n=length(Y); power = abs(Y(1:floor(n/2))).^2; nyquist = 1/2; freq = (1:n/2)/(n/2)*nyquist; plot(freq,power) xlabel('cycles/year') title('Periodogram')

La escala en ciclos/ao es algo inconveniente. Podemos graficar en aos/ciclo y estimar la longitud de un ciclo. plot(freq(1:40),power(1:40)) xlabel('cycles/year')

Ahora graficaremos la potencia frente al periodo por conveniencia (donde periodo= 1/frecuencia). Como esperbamos, existe un muy prominente ciclo con una longitud de alrededor de 11 aos. period=1./freq; plot(period,power); axis([0 40 0 2e+7]); ylabel('Power'); xlabel('Period (Years/Cycle)');

Finalmente, podemos fijar la longitud del ciclo con un poco mas de precisin extrayendo la frecuencia ms fuerte. Los puntos en rojo ubica este punto. hold on; index=find(power==max(power)); mainPeriodStr=num2str(period(index)); plot(period(index),power(index),'r.', 'MarkerSize',25); text(period(index)+2,power(index),['Period = ',mainPeriodStr]); hold off;

FFT con MATLAB


1) >> X = fft(x) Hace la FFT del vector x. X es un vector de nmeros complejos ordenados desde k=0...N1. Se recomienda que la longitud del vector x sea una potencia de 2. Lo que no se recomienda es que la longitud de x sea un nmero primo. 2) >> X = fft(x,N) Especifica el nmero de puntos con el que se quiere hacer la FFT. Si la longitud de x es menor que N, el vector se rellena con ceros. Si es mayor, el vector es truncado. 3) >> x = ifft(X) Hace la FFT inversa del vector X. 4) >> x = ifft(X,N) Especifica el nmero de puntos N con el que quiero hacer la IFFT. 5) >> X = fftshift(X) Reordena el vector X en orden creciente de frecuencia. Si X es el vector resultante de hacer una FFT, utilizando esta funcin reordenamos los puntos en funcin de la frecuencia.

Uso de la FFT para obtener simple graficas para anlisis espectral


1.3 Pregunta

Cmo se puede escalar correctamente la salida de la funcin FFT para obtener una grafica significativa de la potencia versus frecuencia? 1.4 Respuesta

Asuma que x es un vector conteniendo su data. Un vector de muestra usado en esta nota tcnica es una seal sinusoidal de 200 Hz. % Frecuencia de muestreo Fs = 1024; % Vector de tiempo de 1 segundo t = 0:1/Fs:1; % Crear una onda sinusoidal de 200 Hz. x =sin(2*pi*t*200); Primero, necesita llamar a la funcin FFT. Para una mayor rapidez posible de la ffts, tendr que rellenar su datos con ceros suficiente para que su longitud sea una potencia de 2. Al interior de la funcin FFT lo hace de forma automtica, si se le da un segundo argumento que especifica la longitud total de la FFT, como se demuestra a continuacin: % Utilice la prxima potencia de 2 mas alta mayor o % igual a length(x) para calcular la fft nfft = 2^(nextpow2(length(x))); % Tome la fft, rellnelos con ceros hasta % que length(fftx)sea igual a length(nfft) fftx = fft(x,nfft); Si nfft es par (que lo ser, si utiliza los dos comandos de arriba), entonces la magnitud de la FFT ser simtrica, de manera que los primeros (1 + nfft/2) puntos son nicos, y el resto son simtricamente redundantes. La componente DC de x es fftx(1), y fftx(1 +

nfft/2)es la componente de la frecuencia de Nyquist de x. Si nfft es impar, sin


embargo, la componente de la frecuencia de Nyquist no es evalado, y el nmero de puntos nicos es (nfft + 1)/2. Esto puede ser generalizado para ambos casos por ceil((nfft

+ 1)/2).
% Calculando el nmero de puntos nicos NumUniquePts = ceil((nfft+1)/2); % Como FFT es simtrico, deseche la segunda mitad fftx = fftx(1:NumUniquePts); Despus, calculamos la magnitud de la fft: % Tomando la magnitud de la fft de x mx = abs(fftx); Considere el hecho que MATLAB no escala la salida de la fft por la longitud de la entrada:

% Escale la fft ya que no es una funcin de la longitud de x mx = mx/length(x); % Ahora, tomemos el cuadrado de la magnitud de % la fft de x el cual ha sido escalado apropiadamente. mx = mx.^2; % Desde que dejamos la mitad de la FFT, multipliquemos & mx por 2 para mantener la misma energa. La componente DC % y la componente de Nyquist, si este existe, son nicos % y no debern ser multiplicados por 2. if rem(nfft, 2) % odd nfft excludes Nyquist point mx(2:end) = mx(2:end)*2; else mx(2:end -1) = mx(2:end -1)*2; end Ahora, creamos un vector de frecuencias: % Este es un vector de frecuencias espaciados regularmente % con un numero de NumUniquePts puntos. f = (0:NumUniquePts-1)*Fs/nfft; Finalmente, generamos la grafica con un titulo y etiquetas para los ejes. % Generando la grafica, titulo y etiquetas. plot(f,mx); title('Power Spectrum of a 200Hz Sine Wave'); xlabel('Frequency (Hz)'); ylabel('Power'); Juntando todo lo anterior, tendremos el siguiente archivo de MATLAB: % Frecuencia de muestreo Fs = 1024; % Vector de tiempo de 1 segundo t = 0:1/Fs:1; % Crear una onda sinusoidal de 200 Hz. x = sin(2*pi*t*200); % Utilice la prxima potencia de 2 mas alta mayor o % igual a length(x) para calcular la fft nfft= 2^(nextpow2(length(x))); % Tome la fft, rellnelos con ceros hasta % que length(fftx)sea igual a length(nfft) fftx = fft(x,nfft);

% Calculando el nmero de puntos nicos NumUniquePts = ceil((nfft+1)/2); % Como FFT es simtrico, deseche la segunda mitad fftx = fftx(1:NumUniquePts); % Tomando la magnitud de la fft de x y % Escale la fft ya que no es una funcin de la longitud de x mx = abs(fftx)/length(x); % Ahora, tomemos el cuadrado de la magnitud de % la fft de x el cual ha sido escalado apropiadamente. mx = mx.^2; % Desde que dejamos la mitad de la FFT, multipliquemos & mx por 2 para mantener la misma energa. La componente DC % y la componente de Nyquist, si este existe, son nicos % y no debern ser multiplicados por 2. if rem(nfft, 2) % odd nfft excludes Nyquist point mx(2:end) = mx(2:end)*2; else mx(2:end -1) = mx(2:end -1)*2; end % Este es un vector de frecuencias espaciados regularmente % con un numero de NumUniquePts puntos. f = (0:NumUniquePts-1)*Fs/nfft; % Generando la grafica, titulo y etiquetas. plot(f,mx); title('Power Spectrum of a 200Hz Sine Wave'); xlabel('Frequency (Hz)'); ylabel('Power'); La grafica resultante se ver similar a lo siguiente:

El Signal Processing Toolbox 6.2 agrega un nuevo objeto espectro. Objetos espectro contienen informacin de los parmetros de un mtodo particular de estimacin espectral (por ejemplo, spectrum.welch). Este objeto proporciona una mejor forma para ver y manipular los parmetros de estimacin espectral. Vea la pgina de referencia del espectro (Spectrum Objects) y las correspondiente paginas de referencia para el mtodo de estimacin asociado (Spectral Estimation Method) para ms informacin. El objeto tiene mtodos para evaluar la densidad espectral de potencia para tecnicas paramtricas y no paramtricas (convencional) y el espectro cuadrtico medio para las tcnicas no paramtricas. Para las tcnicas de estimacin espectral subespacio ( MUSIC y utilizar el objeto del espectro, ver la demostracin siguiente:

EIG), sin

embargo, el objeto tiene mtodos para calcular la pseudoespectro. Como un ejemplo para

Measuring the Power of

Deterministic Periodic Signals (Medida de Potencia de Seales peridicas deterministas).

Prctica 3: Transformada de Fourier en tiempo discreto

DTFT >Transformada de Fourier en Tiempo Discreto Introduccin.


La transformada de Fourier X(w) de una seal en tiempo discreto x[n] se calcula mediante la expresin

y su inversa es,

La DTFT X(w) toma valores complejos y es una funcin continua y peridica en w. El periodo es 2, representndose normalmente en el intervalo [- , numricamente la DTFT se presentan dos problemas: a) b) La secuencia x[n] puede tener un nmero infinito de puntos. X(w) es una funcin continua de la frecuencia w y debe ser discretizada para trabajar en un procesador digital.

]. Al evaluar

Para resolver el primer problema consideraremos que la secuencia de entrada est formada por un vector de L puntos siendo 0 para los valores comprendidos entre L+ 1 e infinito. Para el segundo, consideraremos que X(w) se evala en un numero N finito de frecuencias equidistantes en el intervalo [- ,

] con incrementos de 2 /N, es decir se consideran el conjunto discreto de frecuencias wk = 2k/N con k=0,1,...N-1. Si se elige N lo suficientemente grande los valores X[2k/N] se aproximan a la funcin X(w) continua
origen del muestreo. Al muestrear la DTFT de esta manera se obtiene la expresin correspondiente a la trasformada discreta de Fourier DFT que en MATLAB se implementa mediante el algoritmo conocido como FFT (Fast Fourier Transform).

Para evitar problemas de muestreo insuficiente se debe elegir N tal que N>L. Para implementar la dtft usaremos el archivo dtft.m que se lista (si es necesario use help para averiguar cmo funcionan las siguientes lneas) function [H,W]=dtft(x,N) % uso: [H W]=dtft(x,N) % x: muestra de longitud L, se supone que de L+1 % a infinito la muestra toma valor 0. % N: nmero de frecuencias a evaluar. N debe ser mayor que L. % H: valores complejos de la DTFT % W: vector de frecuencias correspondiente a la los valores H calculados N=fix(N); %aproxima a entero redondeando al entero inferior

L=length(x); if(L>N) error(' DTFT: numero de muestras, L, debe ser inferior al numero de frec a calcular N') end % % wk=2*pi*k/N con k=0,1,2, ... ,N-1 W=2*pi/N*(0:N-1); % medio=ceil(N/2)+1 %aproxima a un entero redondeando al entero inferior % % evaluamos la DTFT de -pi a pi % W(medio:N)=W(medio:N)-2*pi; W=fftshift(W); H=fftshift(fft(x,N)); En la funcin anterior se realiz un desplazamiento (fftshift) en frecuencias con objeto de que los resultados de w se den en el intervalo [Ejercicios del apartado 1:

, ].

3.1.1 (*) Represente la dtft en mdulo y fase de la seal x[n]= 0.88n*exp ( j(2/5)n),
con L= 40 y N=128. 3.1.2 Compare los resultados y explique qu sucede si se toman valores de N=40, N=64 y N=1024. 3.1.3 (*) Con N = 128 cambie el valor de L, por ejemplo L=15 y L=128 y comente los resultados.

3.1.4 Repita los apartados anteriores para la seal x1[n]= exp (j(2/5)n) y x2[n]=cos((2
/5)n). Explique las diferencias con los apartados anteriores.

DFT y FFT>Algoritmto FFT para calcular la Transformada Discreta de Fourier


El algoritmo FFT es una manera eficiente de calcular la DFT. En MATLAB la funcin es

X=fft(x,N)
Calcula la FFT de N puntos del vector x. El resultado X es un vector de nmeros complejos ordenados con ndice k=0,1, ...N-1. Si no se da el segundo parmetro se considera como N la longitud del vector. Para que el algoritmo sea eficiente N debe ser potencia de 2. Si la longitud de x es menor que N, el vector se rellena con ceros. Si es mayor el vector es truncado.

x = ifft(X)

Calcula la transformada de Fourier inversa del vector X. Tambin se puede especificar el nmero de puntos N con ifft(X,N)

X=fftshift(x)
Reordena el vector X en orden creciente de frecuencias de tal manera que la componente continua queda centrada. Ejercicios del apartado 2: 3.2.1 (*) Sea la secuencia x[n] = cos(0.25 n) + cos(0.5n)+ cos(0.52n). Se pide Calcular la DFT utilizando la funcin matlab fft(x,N) con N = L = longitud de las secuencia x[n] y representar su mdulo para diferentes valores de nmero de muestras L. Pruebe por ejemplo los siguientes valores N=16, N=32, N=64, N=128. Indique a partir de qu valor de N son distinguibles las tres frecuencias de la seal. 3.2.2 Cmo estn relacionados los valores de L, N y la resolucin en frecuencias? 3.2.3 Compruebe que sucede en el espectro de la seal si la una secuencia de L= 100 muestras de x[n] se rellena con ceros hasta N=128. 3.2.4 (*) Calcule la inversa de la funcin X(w) utilizando la funcin ifft(X) para recuperar la seal en el dominio de tiempos. 3.2.5 Suponga que se desea estudiar el contenido en frecuencias usando la FFT, de la siguiente seal.

x(t) = 0.0472 cos(2(200)t + 1.5077) + 0.1362 cos(2(400)t + 1.8769) + 0.4884 cos(2(500)t - 0.1852) + 0.2942 cos(2(1600)t -1.4488) + 0.1223 cos(2(1700)t).
3.2.6 Cul es su frecuencia fundamental? Qu frecuencia de muestreo debe usarse? Estime un valor adecuado de N para obtener suficiente precisin en frecuencias. Represente |X(w)| y la fase de X(w) en funcin de w. 3.2.7 Calcule la inversa de la funcin X(w) utilizando la funcin ifft(X) para recuperar la seal en el dominio de tiempos.

Enventanado, "Leakage" y resolucin espectral. A) Enventanado


Sea la secuencia x[n] = sen(2n/5) Limitar la secuencia de entrada al intervalo 0, L-l es equivalente a multiplicar la seal de entrada x[n] por una ventana rectangular w(n) de longitud L= 40 donde

w[n] = l para 0 <= n < L-l w[n] = 0 para el resto

Ejercicios del apartado 3:

3.3.1 (*) Represente el espectro de las seales w[n], x[n] y del producto y[n]=w[n]*x[n]. Utilice la funcin fft calculando un nmero suficiente de valores (N=128) para explicar los resultados anteriores. 3.3.2 Explique, a partir de los espectros anteriores, la relacin del valor mximo obtenido en el eje de ordenadas al representar |Y(w)| con los parmetros L y N.

B) Leakage
Una consecuencia del enventanado es que el espectro de la seal no se localiza en una nica frecuencia. Es decir si tenemos una seal como x(t) = sen wot que solo debera tener una frecuencia fundamental w=wo, al calcular su FFT tomando una ventana cuadrada, aparecern componentes adicionales la frecuencia w y su espectro se extiende por todo el intervalo de frecuencias. Este efecto se conoce como derrame, o bien con el trmino ingles "Leakage" Para comprender este efecto y estimar un valor adecuado para el tamao de la ventana se pide realizar las siguientes representaciones y estudiar los comportamientos que se presentas en los siguientes casos. Ejercicios: 3.3.3 Para todo el ejercicio se considera una seal continua infinita dada por x(t) = sen (2ft) con f = 1KHz. El efecto de aplicar una ventana cuadrada es equivalente a reducir el intervalo de muestreo en 0 < t < tamao de ventana. Para todos los casos se pide calcular x[n], X(w)=DTFT(x[n]), y X[k]=DFT(x[k]), Representar |X(w)| y | X[k]|. 3.3.4 (*) Suponga que toma N= 8 muestras considerando el intervalo 0 < t < 1 ms. Cul es la frecuencia de muestreo Fs? 3.3.5 (*) Suponga que toma N= 8 muestras considerando el intervalo 0 < t < 0.5 ms. Cul es la frecuencia de muestreo Fs? 3.3.6 Suponga que toma N= 24 muestras considerando el intervalo 0 < t < 1.5 ms. 3.3.7 Suponga que toma N= 64 muestras considerando el intervalo 0 < t < 4 ms. 3.3.8 (*) Explique qu valores de tamao de la ventana son los adecuados para reducir el efecto de "Leakage"

C) Resolucin espectral
El enventanado reduce la resolucin espectral (diferencia entre la frecuencia de dos seales para que pueden ser distinguidas). Para ello considerar que la seal de entrada viene dada por

3.3.9 Representar la dtft de esta seal para N=128 y para L=25, 50 y 100. Qu relacin hay entre L y la resolucin en frecuencia? Con el fin de reducir el derrame es posible elegir una ventana w(n) cuya dtft W(w) tenga lbulos laterales ms pequeos, pero esto provoca un aumento en la anchura del lbulo principal, lo que provoca una disminucin en la resolucin espectral.

3.3.10 Comprobar este efecto para la seal x[n] anterior usando una ventana de Hamming definida por w(n) = 1/2(1-cos(2n/(L-l)) w(n) = 0 usando el mismo valor de L=50 para 0<= n < L-1 en el resto

3.3.11 Comparar la dfft de una ventana rectangular y de una ventana de Hamming

Analizador de Espectros
Un analizador de espectro es un sistema que permite obtener las frecuencias que estn presentes en una seal discreta. El sistema ms simple que nos permite verificar si una seal tiene una componente con frecuencia w1 sera

donde se multiplica la seal de entrada por e -jw1n para desplazar la componente con frecuencia w=w1 al origen de frecuencias w=0 y al aplicar el filtro pasa bajas se obtendr la contribucin de la componente de la seal con w= w1. Repitiendo este proceso para cada frecuencia w= wk, se obtendra el espectro del sistema. Un sistema como el descrito adolece de dos grandes inconvenientes: Implica que se conocen las frecuencias presentes en la seal. La respuesta en frecuencia del filtro pasa baja debe ser cero salvo para w=0. No obstante tiene su utilidad si se pretende conocer si determinadas frecuencias estn presentes en la seal y solo interesa la contribucin de estas componentes. Para seales peridicas de periodo N el FPBJ puede sustituirse simplemente por un acumulador que suma L puntos

En el caso N=L el comportamiento de este sistema es un filtro pasa baja ideal. El sistema anterior tiene h[n]= [1, 1, 1, ...1] con L puntos distintos de 0 y su H(w) para L=10 es:

Ejercicios del apartado 4: Considere la seal discreta con periodo N=10,

x[n] = 8 + 10 sen (2/10)n

3.4.1 Represente la seal x[n] en un rango adecuado de valores para verificar que es peridica 3.4.2 Utilizando el sistema descrito obtenga los componentes X[k]. Recuerde que el caso estudiado en el ejemplo corresponde con N=L=10. Qu componentes de frecuencia son distintos de cero? Qu valores toman y por qu? 3.4.3 Compare los resultados con los obtenidos mediante la fft 3.4.4 Conocido el espectro exacto de x[n] y del acumulador empleado, explique razonadamente el funcionamiento del sistema. Por qu el acumulador se puede utilizar como FPBJ?. Represente en el dominio de frecuencias los diferentes espectros que resultan despus de aplicar el desplazamiento en frecuencias y su posterior filtrado.

Prctica 4: Respuesta en frecuencia de sistemas LTI - Muestreo y Reconstruccin - Filtrado


Sistemas digitales (Filtros digitales) Sea un sistema LTI descrito por una ecuacin en diferencias lineal de coeficientes constantes. La salida y[n] en funcin de la entrada x[n], viene dada por

En MATLAB, estas ecuaciones se representan por dos vectores an y bn, expresndose la ecuacin anterior como

La funcin FILTER(b,a,x) implementa un filtro digital caracterizado por los coeficientes a y b que filtrar los datos almacenados en x. Cuando x[n] =

[n], se tiene la respuesta al impulso que denominamos h(n).

4.4.1 (*) Respuesta al impulso de un sistema definido por su ecuacin en diferencias.

Crear los vectores a y b que contengan los coeficientes x[n] e y[n] de la siguiente ecuacin

Genere un impuso unidad con una longitud de 100 elementos, y calcule mediante el comando filter la respuesta h(n) del sistema anterior. Represente la funcin h[n]. 4.4.2 Resuelva analticamente la ecuacin anterior para n=1,... 5, cuando x[n] = Suponga las condiciones iniciales de reposo y[0] = y[-1] = 0; 4.4.3 Respuesta estacionaria: Calcule mediante la funcin filter la respuesta al impulso h(n) correspondiente al sistema descrito por la siguiente ecuacin

[n].

en el intervalo -10 < n < 100, y la repuesta a la funcin escaln u(n). Represente grficamente la salida y determine el valor constante que alcanza la salida (valor que llamaremos H0) para n-> oo. Verificar, en su caso, que coincide con el valor determinado analticamente. NOTA La respuesta constante, H0, cuando n->00, se denomina respuesta estacionaria. Compruebe grficamente usando la funcin diff (vease help) que la derivada de la respuesta a la funcin escaln es la respuesta al pulso unitario. 4.4.4 Respuesta en frecuencia Para el sistema descrito en el apartado 4.1.3, genere la respuesta a la seal de entrada (impulso en frecuencia) x[n] = e jn/3 u[n] para -10 < n < 100. Represente grficamente la parte real e imaginaria, as como la razn entre ambas. Dividendo la respuesta por x(n) se obtiene H(w) para w =

/3 , determine el valor constante, en

modulo y fase, de H para n->oo. El valor de H caracteriza en rgimen estacionario al sistema para una frecuencia. Indica la ganancia o atenuacin y el cambio de fase para la componente de w =

/3 de la seal de entrada

Repita el proceso anterior para distintos valores de w y obtenga una representacin de la respuesta en frecuencia del sistema H(w). Compruebe que los valores coinciden con el clculo de H(w) determinado analticamente. Compare los resultados con los obtenidos mediante la funcin matlab freqz. Muestreo y Reconstruccin de seales La reconstruccin de una seal muestreada a una frecuencia fs cumpliendo el criterio de Nyquist se realiza de manera ideal con un filtro pasa baja, cuya funcin de transferencia es H(w) = As para |w|< wc

H(w) = 0

para el resto de frecuencias

siendo wc la frecuencia de corte . Nota: La amplificacin del filtro As permite recuperar sin atenuacin la seal, debido a que el espectro de la seal original al ser muestreado con un tren de deltas de periodo Ts sufre una atenuacin que viene dada por un factor 1/Ts. La funcin h(t) en el domino de tiempos se obtiene calculando la transformada de Fourier inversa de H(w) y corresponde a la expresin. h(t) = (wc*As /)Sinc (wc*t/) 4.4.5 (*) En este ejercicio se pretende realizar la reconstruccin de la seal y(t) = cos(2**f0*t) con f0 =100Hz; seal muestreada con una frecuencia de muestreo fs= 250Hz Represente la seal continua y(t) en el intervalo [-40 ms, 40 ms] utilizando una variable independiente t evaluada cada dt= 1/(10*fs) para que conseguir mediante el comando plot(t,y) una representacin adecuada. Represente la respuesta del filtro h(t). Considere las muestras y[n] que corresponden al muestreo con Ts = 1/fs A partir de la secuencia y[n] y la funcin h(t) represente el proceso de reconstruccin que se corresponda con la aplicacin de un filtro pasa baja con una frecuencia de corte fc=120Hz. Para comprobar el proceso de reconstruccin se deber representar en un grfico simultneamente la seal "continua", las muestras tomadas con fs= 250 Hz, y la seal reconstruida. 4.4.6 Repita el ejercicio anterior utilizando la funcin conv de Matlab que permite realizar la convolucin lineal de dos seales. Se pretende calcular la comvolucin y(t) = x(t)*h(t) que se corresponde con aplicar el filtro pasa baja en el mundo de frecuencia Y(w)=X(w)H(w). 4.4.7 Vari la frecuencia de corte del filtro fc1= 50 Hz, fc2= 100Hz, fc3= 150Hz, fc4=125Hz y

explique los resultados.

Diseo de FILTROS digitales con MATLAB


Los filtros ideales definidos como H( w) = constante H(w) = 0 para w < wo para w > wo (banda de paso). (banda de rechazo).

no son fsicamente realizables ya que no son causales, sin embargo es posible disear filtros causales que pueden aproximarse a los ideales con tanta precisin como sea necesaria . Estos filtros causales presentaran un rizado tanto en la banda de paso como en la banda de rechazo. Por otra parte la transicin en frecuencia entre ambas bandas no se realizara de forma abrupta. La figura muestra las caractersticas indicadas

En matlab existen varias funciones que ayudan al diseo de un filtro indicando sus caractersticas. Una de ellas es ellip (ver help) que permite disear filtros elpticos. Las salidas b y a de esta funcin son los coeficientes de la ecuacin de diferencias del sistema, definidos en la primera parte de la prctica. Por otro lado el orden N del filtro se corresponde con el mayor de los valores Na o Nb empleados en la ecuacin de diferencias.

Unos valores razonables para los parmetros de rizado que deben introducirse en en la funcin ellip son Rp=0.5 y Rs=20. 4.4.8 Usando la funcin ellip, disear un filtro pasabaja de orden N=4 con frecuencia de corte de 600 Hz , suponiendo que la seal de entrada ser muestreada a una frecuencia de 8192 Hz. 4.4.9 (*) Mat1ab incorpora la funcin freqz (ver help) que calcula la funcin de transferencia H(w). 4.4.10 A partir de los vectores b y a obtenidos, construya la funcin H(w) siguiendo el procedimiento del ejercicio 4.1.4 y represente H(w) en funcin de w en el intervalo 0,

. Compruebe que se obtiene el mismo resultado que utilizando la funcin

freqz.
4.4.11 Considere que la seal de entrada est formada por la suma de dos seales sinusoidales de frecuencia 200 y 800 Hz respectivamente. Usando la funcin filter compruebe que a la salida ha desaparecido la componente de 800 Hz.

4.4.12 Manteniendo la frecuencia de corte en la funcin ellip modificar uno a uno los parmetros N, Rp y Rs. Use la funcin freqz para representar las caractersticas H(w) del filtro y estudie su dependencia con los parmetros anteriores. 4.4.13 Disee un filtro pasa-alta de orden N=6 con frecuencia de corte de 600 Hz , suponiendo que la seal de entrada ser muestreada a una frecuencia de 8192 Hz. Represente H(w). Considere que la seal de entrada est formada por la suma de dos seale sinusoidales de frecuencia 200 y 800 Hz respectivamente. Usando la funcin filter compruebe que a la salida ha desaparecido la componente de 200Hz, 4.4.14 Disee un filtro pasa-banda de orden N=6 con frecuencia de paso de 300 y 500 Hz, suponiendo que la seal de entrada ser muestreada a una frecuencia de 8192 Hz. Represente H(w). Considere que la seal de entrada est formada por la suma de tres seales sinusoidales de frecuencia 100,400 y 600 Hz respectivamente. Usando la funcin filter compruebe que a la salida ha desaparecido la componente de 100 y de 600 Hz. 4.4.15 Disee un filtro suprime-banda de orden N=6 con frecuencia de paso de 300 y 500 Hz, suponiendo que la seal de entrada ser muestreada a una frecuencia de 8192 Hz. Represente H(w). Considere que la seal de entrada est formada por la suma de tres seales sinusoidales de frecuencia 100,400 y 600 Hz respectivamente. Usando la funcin filter se debe comprobar que a la salida ha desaparecido la componente de 400 Hz.

REPRESENTACIONES DE FOURIER PARA LAS SEALES


Existen cuatro representaciones distintas de Fourier, cada una aplicable a diferentes tipos de seales. Estas cuatro clases estn definidas por las propiedades de periodicidad de una seal y si el tiempo es de tipo continuo o discreto. Las seales peridicas tienen representacin en series de Fourier. La Serie de Fourier ( FS) aplica a seales peridicas de tiempo continuo mientras que la Serie Discreta de Fourier ( DTFS) aplica a seales peridicas de tiempo discreto. Las seales no peridicas tienen representacin en forma de transformada. Si la seal es continua en el tiempo y no peridica, la representacin es llamada Transformada de Fourier (FT). Si la seal es discreta en el tiempo y no peridica entonces la representacin usada es la transformada de Fourier en tiempo discreto ( DTFT). La siguiente tabla ilustra la relacin entre las propiedades de tiempo de una seal y la representacin de Fourier adecuada.

Tiempo
Continuas

Peridicas
Series de Fourier ( FS ) Series discretas de Fourier ( DTFS )

No peridicas
Transformada de Fourier ( FT ) Transformada discreta de Fourier ( DTFT)

Discretas

La siguiente tabla muestra las relaciones matemticas utilizadas para calcular las representaciones de Fourier.

Tiempo

Peridicas Series de Fourier

No peridicas Transformada de Fourier

Continuas

Series discretas de Fourier

Transformada discreta de Fourier

Discretas

La Transformada Discreta de Fourier (DTFS)


La DTFS es la nica representacin de Fourier que es de valor discreto tanto en el tiempo como en la frecuencia y de esta manera implcitamente conveniente para una implementacin computacional en MATLAB. Las expresiones utilizadas para esta representacin son fcilmente implementables en MATLAB como archivos. Sin embargo los comandos built-in de MATLAB fft y ifft pueden tambin ser utilizados para evaluar la DTFS. Dado un vector llamado x de longitud N representando un periodo de una seal peridica x[n]. El comando: >> X=fft(x)/N Produce un vector llamado X de longitud N que contiene los coeficientes de la DTFS. Matlab asume que el periodo evaluado en la seal es desde 0 hasta N-1, de manera que el primer elemento de x y X corresponden a x[0] y X[0] respectivamente, mientras que los ltimos elementos corresponden a x[N-1] y X[N-1]. Ntese que la divisin por N es completamente necesaria, debido a que el comando fft evala la siguiente expresin sin realizar la divisin por N.

Similarmente, dados los coeficientes de una DTFS en un vector llamado X el comando:

>> x=ifft(X)*N Produce un vector x que representa un periodo de la seal en el tiempo. Ntese que el comando ifft debe estar multiplicado por N para evaluar la siguiente ecuacin.

Los comandos fft e ifft son computados usando un algoritmo rpido o numricamente eficiente, conocido como Fast Fourier Transform. Considere el siguiente ejemplo: Determinar los coeficientes DTFS para la siguiente seal:

La seal tiene un periodo de 24, de manera que tan solo se hace necesario definir un periodo y evaluar sobre este periodo la DTFS. Los comandos usados para realizar dicho clculo son: >> n = 0:23; >> x = ones(1,24) + sin( (n * pi / 12) + (3 * pi / 8 ) ); >> X = fft(x)/24; El resultado terico del ejemplo es el siguiente:

El resultado obtenido mediante los comandos presentados anteriormente es: X = Columns 1 through 5 1.0000 0.4619 0.0000i -0.0000 + 0.0000i Columns 6 through 10 -0.0000 - 0.0000i 0.0000 0.0000i -0.0000 - 0.0000i Columns 11 through 15 -0.0000 - 0.0000i -0.0000 0.0000i -0.0000 + 0.0000i Columns 16 through 20 -0.0000 + 0.0000i 0.0000 0.0000i -0.0000 + 0.0000i 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0 -0.0000 + 0.0000i 0.0000 0.0000i 0.0000 + 0.1913i 0.0000 + 0.0000i -0.0000 +

Columns 21 through 24 -0.0000 - 0.0000i -0.0000 - 0.0000i 0.0000 - 0.0000i 0.4619 + 0.1913i

Como se puede ver, tres componentes tienen valor diferente de cero. Un uso comn de la transformada de Fourier, es encontrar las componentes frecuenciales de una seal en el dominio del tiempo que est contaminada con ruido. Considrese dos seales sinusoidales que tienen frecuencias fundamentales de 50Hz y 120Hz, luego considrese estas seales contaminadas con ruido aleatorio. Los comandos para generar una seal con las especificaciones anteriormente mostradas son los siguientes: >> t = 0:0.001:0.6; >> x = sin(2 * pi * 50 * t ) + sin(2 * pi * 120 * t); >> y = x + 2 * randn (size(t)); >> plot(1000 * t(1:50), y(1:50))

Es de gran dificultad identificar las componentes de frecuencia mirando la seal original. Sin embargo al realizar la conversin de esta seal al dominio de la frecuencia, la identificacin de estas componentes se hace ms sencilla. La conversin de la seal al dominio de la frecuencia se hace calculando la Transformada Rpida de Fourier, tomando para el clculo los primeros 512 puntos de la seal. El espectro de potencia es una medida de la potencia a varias frecuencias, y este puede ser calculado con los siguientes comandos. >> Pyy = Y .* conj (Y) / 512; Para realizar la grfica se puede tener en cuenta que la informacin que aparece en el arreglo Pyy es por propiedades de la transformada, simtrica con respecto a la frecuencia media, es decir que si tenemos 512 puntos de muestra, la seal que esta almacenada en el arreglo es simtrica con respecto a la muestra 256, por lo tanto dibujar las ultimas 256 muestras del arreglo ser completamente innecesario. De manera que para visualizar el espectro de potencia los comandos deben ser como se muestran a continuacin: >> f = 1000*(0:256)/512; >> plot(f,Pyy(1:257)) Para ver todas las muestras y entender la caracterstica de simetra descrita anteriormente se pueden utilizar los siguientes comandos:

>> f = 1000*(0:511)/512; >> plot(f,Pyy)

Del espectro de potencia se puede visualizar que las componentes con mayor frecuencia se encuentran a los 50 y 120 Hz respectivamente. Comprobando as que las seales de las cuales se formo la seal contaminada con ruido tienen estas frecuencias fundamentales.

% FFT PARA ANLISIS ESPECTRAL


% % % % % % % % Este ejemplo muestra el uso de la funcin FFT para el anlisis espectral. Un uso comn de las FFT es encontrar los componentes de la frecuencia de una seal enterrada en una seal ruidosa con dominio de tiempo. Primero vamos a crear algunos datos. Considerar los datos muestreados en 1000 Hz Empezaremos formando un eje de tiempo para nuestros datos, que funcione desde t=0 hasta t=25 con pasos de 1 milisegundo. Luego formamos una seal, x, que contenga ondas seno a 50 Hz y 120 Hz

t = 0:.001:.25; x = sin(2*pi*50*t) + sin(2*pi*120*t); % Adicionar algn ruido aleatorio con una desviacin estndar de 2 para % producir una seal de ruido y. Dar una mirada a esta seal de ruido y % graficndola. y = x + 2*rand(size(t)); plot(y(1:50)) title ('Tiempo de Dominio de la Seal Ruidosa') % % % % % % % % % Claramente, resulta dificil identificar los componentes de la frecuencia de la mirada a esta seal; es por eso que el anlisis espectral es tan popular. Encontrar la transformada discreta de Fourier de la seal ruidosa y es fcil; solo usar la transformada rpida de Fourier (FFT) Computar la densidad espectral de la energa, una medida de la energa a varias frecuencias, usando la compleja conjugada (CONJ). Formar un eje de frecuencia para los primeros 127 puntos y usarlo para diagramar el resultado. (Los restantes 256 puntos son asimtricos.)

Y = fft(y,256);

Pyy = Y.*conj(Y)/256; f = 1000/256*(0:127); plot(f,Pyy(1:128)) title('Densidad espectral de la energa') xlabel('Frecuencia(Hz)') % Enfocar adentro y trazar solamente hasta los 200 Hz. Notar los picos en % 50 Hz y 120 Hz. Esas son las frecuencias de la seal original.

plot(f(1:50),Pyy(1:50)) title('Densidad espectral de la energa') xlabel('Frecuencia (Hz)') %____________________________??????

You might also like