You are on page 1of 27

fft - Fast Fourier transform (Transformada Rápida de Fourier)

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

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

( )( ) ( )( )
( )= () ( )= ( )

( )/
Donde = , es la raíz N-esima de la unidad.
Descripción
 Y = fft(x) devuelve la Transformada de Fourier Discreta (DFT) del vector x, calculado con el
algoritmo de la Transformada Rápida 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 opera en la primera dimensión no singleton.
 Y = fft(X,n) devuelve la DFT de n-puntos. La fft(X) es equivalente a fft(X,n) donde n es el
tamaño 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 operación de FFT a través de la dimensión
dim.
Ejemplo1
Un uso común de la transformada de Fourier es hallar las componentes de frecuencia de una señal
dentro de una señal ruidosa en el dominio del tiempo. Considere la data muestreada a 1000 Hz.
Formemos una señal conteniendo una sinusoide de 50 Hz, de amplitud 0.7 y una sinusoide de 120
Hz de amplitud 1, corrompida con algún ruido aleatorio de media cero:
Fs = 1000; % Frecuencia de muestreo
T = 1/Fs; % Tiempo de muestreos
L = 1000; % Longitud de la señal
t = (0:L-1)*T; % 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)); % Sinusoide más ruido
plot(Fs*t(1:50),y(1:50)); title('Signal Corrupted with Zero-Mean Random Noise')
xlabel('time (milliseconds)')
Es difícil identificar los componentes de frecuencia al observar la señal original. Al convertirla al
dominio de la frecuencia, la transformada de Fourier discreta de la señal ruidosa, se encuentra to-
mando la transformada rápida 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 razón del porque las amplitudes no son exactamente 0,7 y 1 es por el ruido. Varias
ejecuciones de este código (incluyendo recálculo de y) producen diferentes aproximaciones a 0,7 y
1. La otra razón es que usted tiene una señal 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 deno-
minada 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 tamaño N2, y luego calcula N2 transformadas de tamaño N1. La
descomposición 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 máquinas generados de tamaño fijo o "code-
lets". El codelets a su vez utiliza varios algoritmos en combinación, incluyendo una variación de Cooley-
Tukey [5], un algoritmo de factor prima [6], y un algoritmo de radix dividida [2]. La factorización particular
de N es elegida heurísticamente.
Cuando N es un número primo, la librería FFTW primero descompone un problema de N-puntos
en tres problemas de (N-1)-puntos usando el algoritmo de Rader [7]. Este luego usa la descomposi-
ción de Cooley-Tukey, descrito anteriormente, para calcular las DFT de (N – 1)-puntos.
Para la mayoría de N, las DFT de entrada real requieren aproximadamente la mitad del tiempo de
cálculo de la DFT de entrada complejo. Sin embargo, cuando N tiene factores primos grandes, la
diferencia en la velocidad de procesamiento es muy pequeña o nada.
El tiempo de ejecución para la FFT depende de la longitud de la transformación. Es más rápido para
las potencias de dos. Es casi tan rápido para las longitudes que tienen únicamente factores primos
pequeñas. Es normalmente varias veces más 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 función de utilidad fftw, quien con-
trola la optimización del algoritmo usado para calcular una FFT de una dimensión y tamaño 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. 297-301.
[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," Pro-
ceedings of the IEEE, Vol. 56, June 1968, pp. 1107-1108.

Ver también
dftmtx | fft2 | fftn | fftshift | fftw | filter | freqz | ifft

******************************************************************************

1.1 Transformada Rápida de Fourier (FFT)


 Introducción
 La FFT en una dimension
 La FFT en multiple dimensiones

1.1.1 Introducción
DFT con un millón de puntos es común en muchas aplicaciones. El procesamiento de señales e
imágenes en aplicaciones modernas serian imposible sin un eficiente método para calcular la DFT.
La aplicación directa de la definición 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 generación de las potencias de la n-esima raíz compleja de la unidad ω. Para
calcular el DFT de un millón de puntos, un computador capaz de hacer una multiplicación y una su-
ma cada microsegundo requerirá de un millón de segundos o alrededor de 11.5 días.
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 dimensión de longitud n
requerirá menos que 3nlog2n operaciones de punto-flotante (un número de veces de una constante
de proporcionalidad). Para n = 220, es un factor de casi 35,000 veces más rápido que 2n2.
Las funciones de MATLAB fft, fft2, y fftn (y sus inversas ifft, ifft2, y ifftn, respectivamente) todos usan
algoritmos rápidos de transformada de Fourier para calcular la DFT.

Nota. Los algoritmos de FFT de MATLAB FFT están 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 longi-
tud de la transformada. La longitud de la ventana es la longitud del vector de datos de entrada. Este
es determinado, por ejemplo, por el tamaño 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 reali-
zar la deseada longitud de la transformada. La siguiente figura ilustra las dos longitudes.

El tiempo de ejecución de un algoritmo FFT depende de la longitud de la transformada. Es más


rápido cuando la longitud de la transformada es una potencia de dos, y casi tan rápido cuando la
longitud de la transformada tiene únicamente factores primos pequeños. Es típicamente más 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 práctica.

1.1.2 La FFT en una dimensión


Introducción
Ejemplo: Análisis espectral básico
Ejemplo: Análisis espectral de una llamada de una ballena
Ejemplo: Interpolación de datos

1.1.2.1 Introducción
La función fft de MATLAB devuelve la DFT y de un vector de entrada x usando un algoritmo de
transformada rápida de Fourier:
y = fft(x);

En este llamado a la fft, la longitud de la ventana m = length(x) y la longitud de la transforma-


da n = length(y) son los mismos.
La longitud de la transformada es especificado es especificado por un segundo argumento opcio-
nal:
y = fft(x,n);

En esta llamada a la fft, la longitud de la transformada es n. Si la longitud de 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.

1.1.2.2 Ejemplo: Análisis espectral básico


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 análisis
espectral están listadas en la siguiente tabla. Para datos basados en el espacio, remplace las refe-
rencias al tiempo con referencias al espacio.

Cantidad Descripción

x Datos muestreados

m = length(x) Longitud de la data (número de muestras)


Cantidad Descripción

fs Muestras/unidad de tiempo

dt = 1/fs Incremento de tiempo por muestra

t = (0:m-1)/fs Rango del intervalo de tiempo para la data

y = fft(x,n) Transformada de Fourier Discreta (DFT)

abs(y) Amplitud de la DFT

(abs(y).^2)/n Potencia de la DFT

fs/n Incremento de frecuencia (resolución)

f = (0:n-1)*(fs/n) Rango del intervalo de frecuencia

fs/2 Frecuencia de Nyquist

EJEMPLO 2
a) Por ejemplo, genere la siguiente data de x con dos componentes de frecuencia de diferentes am-
plitudes y fases contaminados con ruido:
fs = 100; % Frecuencia de muestreo (Hz)
t = 0:1/fs:10-1/fs; % 10 segundos de muestra
x = (1.3)*sin(2*pi*15*t) ... % Componente de 15 Hz
+ (1.7)*sin(2*pi*40*(t-2)) ... % Componente de 40 Hz
+ (2.5)*randn(size(t)); % Ruido Gaussiano;
b) Use la fft para calcular la DFT y la potencia de y:
m = length(x); % Longitud de la ventana
n = pow2(nextpow2(m)); % Longitud de la transformada
y = fft(x,n); % DFT
f = (0:n-1)*(fs/n); % Rango de frecuencia
power = y.*conj(y)/n; % Potencia de la DFT

nextpow2 halla el exponente de la potencia de 2 más cercana mayor o igual a la longitud de la ven-
tana (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 práctica exista usualmente una pequeña
diferencia en el tiempo de ejecución al usar n = m.

c) Visualizar la DFT. Las gráficas de abs(y), abs(y).^2, y log(abs(y))son todas comunes. Una
grafica de la potencia versus frecuencia es denominada un periodograma:
plot(f,power)
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.

d) En muchas aplicaciones es tradicional centrar el periodograma en 0. La función fftshift re


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

El re arreglo hace uso de la periodicidad en la definición de la DFT (Ver Discrete Fourier Transform
(DFT)).

e) Use las funciones de MATLAB angle y unwrap para crear una grafica de la fase de la DFT:
phase = unwrap(angle(y0));
plot(f0,phase*180/pi)
xlabel('Frequency (Hz)')
ylabel('Phase (Degrees)')
grid on

Las componentes de frecuencias


son en su mayoría ocultas por la alea-
toriedad en la fase en valores adya-
centes. La tendencia al alza en la grá-
fica se debe a la función unwrap
(desenvolver), que en este caso suma
a la fase 2π con más frecuencia de lo
que resta.

EJEMPLO 3
1.1.2.3 Ejemplo: Análisis espectral de la llamada de una ballena
El archive de ejemplo bluewhale.au contiene data de audio de la vocalización una ballena azul
del Océano Pacifico grabada por micrófonos bajo el agua en la costa de California. El archivo es de la
librería de las vocalizaciones de animales mantenido por el Programa de Investigación Bioacustica de
la Universidad de Cornell.

Nota. La documentación de los archivos de ejemplo para matemáticos de MATLAB está ubicados en la sub-
carpeta \help\techdoc\math\examples de la carpeta raíz de MATLAB (matlabroot). Esta subcarpeta no se
encuentra en la ruta de MATLAB en la instalación. 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 huma-
nos. La escala de tiempo en la data esta comprimido por un factor de 10 para elevar el pitch y hacer
la llamada más claramente audible.

a) El siguiente código lee, grafica,


y reproduce la data:
[x,fs] = au-
read('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 más simple y fácil de analizar.

b) Use la gráfica 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}')

c) Use la fft para calcular la DFT de la señal. Corrija el rango de frecuencias por un factor de 10
para acelerar la data:

m = length(bCall); % Window length


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

d) Grafique 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 armónicos, con el segundo armónico enfatizado.
EJEMPLO 4
1.1.2.4 Ejemplo: Interpolación de datos
Este ejemplo demuestra la FFT en un contexto diferente al del análisis espectral – la estimación
de los coeficientes de un polinomio trigonométrico que interpola un conjunto de datos espaciados
regularmente. Esta aproximación de interpolación de datos es descrito en [1].
Varias personas descubrieron algoritmos rápidos DFT de forma independiente, y muchas personas
han contribuido a su desarrollo. Un documento de 1965 por John Tukey y John Cooley [2] es gene-
ralmente reconocido como el punto de partida para el uso moderno de la FFT. Sin embargo, un tra-
bajo de Gauss publicado póstumamente en 1866 [3] (y fechado en 1805) contiene el uso indiscuti-
ble de la técnica de separación 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 artículo contiene 12 puntos de datos sobre la posición del
asteroide Pallas, a través del cual desea interpolar un polinomio trigonométrico con 12 coeficientes.
En lugar de resolver el sistema resultante de 12 por 12 de ecuaciones lineales a mano, Gauss buscó
un atajo. Descubrió cómo separar las ecuaciones en tres subproblemas que eran mucho más fáciles
de resolver, y luego cómo se recombinan las soluciones para obtener el resultado deseado. La solu-
ción es equivalente a la estimación de la DFT de los datos con un algoritmo FFT.

a) Aquí está la data que apareció en el artículo 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


trigonométrico de la forma:

b) El siguiente código usa la fft para


realizar un equivalente cálculo de Gauss:
d = fft(dec);
m = length(dec);
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;
c) 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. 297–301.
[3]. Gauss, C. F. "Theoria interpolationis methodo nova tractata." Carl Friedrich Gauss Werke. Band 3.
Göttingen: Königlichen Gesellschaft der Wissenschaften, 1866.
[4]. Heideman M., D. Johnson, and C. Burrus. "Gauss and the History of the Fast Fourier Trans-
form." Arch. Hist. Exact Sciences. Vol. 34. 1985, pp. 265–277.
[5]. Goldstine, H. H. A History of Numerical Analysis from the 16th through the 19th Century. Berlin:
Springer-Verlag, 1977.

EJEMPLO 5
1.2 Usando la FFT
Esta demostración usa la función FFT para analizar las variaciones en la actividad de las manchas
solares sobre los últimos 300 años.
La actividad de las manchas solar es cíclica, alcanzando un máximo aproximadamente cada 11
años. Vamos a confirmarlo. Aquí hay una grafica de una cantidad llamada el número relativa de
manchas solares de Zurich, que mide tanto en número y tamaño de las manchas solares.

a) Los astrónomos han tabulado este número de casi 300 años.


load sunspot.dat
year=sunspot(:,1);
relNums=sunspot(:,2);
plot(year,relNums)
title('Sunspot Data')
Aquí está una mirada más de cerca a los primeros 50 años.

plot(year(1:50),relNums(1:50),'b.-');

La herramienta fundamental de procesamiento de señales es la FFT, o la Transformada Rápida de


Fourier.

b) Para tomar la FFT de la data de las manchas solares escriba lo siguiente.


Y = fft(relNums);
Y(1)=[];

El primer componente de Y, Y(1), es simplemente la suma de los datos, y se puede quitar.

c) Una gráfica de la distribución de los coeficientes de Fourier (dada por Y) en el plano complejo es
bonito, pero difícil de interpretar. Necesitamos una forma más útil de examinar los datos en Y.
plot(Y,'ro')
title('Fourier Coefficients in the Complex Plane');
xlabel('Real Axis');
ylabel('Imaginary Axis');
d) 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')

e) La escala en ciclos/año es algo inconveniente. Podemos graficar en años/ciclo y estimar la longi-


tud de un ciclo.

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

g) Finalmente, podemos fijar la longitud del ciclo con un poco mas de precisión extrayendo la fre-
cuencia más 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;
2 FFT con MATLAB
1) >> X = fft(x)

Hace la FFT del vector x. “X” es un vector de números complejos ordenados desde k=0...N-1. 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 número primo.

2) >> X = fft(x,N)
Especifica el número 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 número 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 función reordenamos los puntos en función de la frecuencia.

Uso de la FFT para obtener simple graficas para análisis espectral


2.1 Pregunta
¿Cómo se puede escalar correctamente la salida de la función FFT para obtener una grafica significa-
tiva de la potencia versus frecuencia?
Respuesta
a) Asuma que x es un vector conteniendo su data. Un vector de muestra usado en esta nota técnica
es una señal sinusoidal de 200 Hz.
% Frecuencia de muestreo
Fs = 1024;
% Vector de teimpo de 1 segundo
t = 0:1/Fs:1;
% Crea una onda senoidal de 200 Hz.
x =sin(2*pi*t*200);

b) Primero, necesita llamar a la función FFT. Para una mayor rapidez posible de la s, tendrá que
rellenar su datos con ceros suficiente para que su longitud sea una potencia de 2. Al interior de la
función FFT lo hace de forma automática, si se le da un segundo argumento que especifica la longi-
tud total de la FFT, como se demuestra a continuación:
% Utilice la próxima potencia de 2 mas alta mayor o
% igual a length(x) para calcular la fft
nfft = 2^(nextpow2(length(x)));
% Tome la fft, rellénelos con ceros hasta
% que length(fftx)sea igual a length(nfft)
fftx = fft(x,nfft);

c) Si nfft es par (que lo será, si utiliza los dos comandos de arriba), entonces la magnitud de la
FFT será simétrica, de manera que los primeros (1 + nfft/2) puntos son únicos, y el resto son
simétricamente 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 evaluado, y el número de puntos únicos es (nfft + 1)/2. Esto puede
ser generalizado para ambos casos por ceil((nfft + 1)/2).
% Calculando el número de puntos únicos
NumUniquePts = ceil((nfft+1)/2);
% Como FFT es simétrico, deseche la segunda mitad
fftx = fftx(1:NumUniquePts);

d) Después, calculamos la magnitud de la fft:


% Tomando la magnitud de la fft de x
mx = abs(fftx);

e) Considere el hecho que MATLAB no escala la salida de la fft por la longitud de la entrada:
% Escale la fft por lo que no es una función 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 energía. La componente DC
% y la componente de Nyquist, si este existe, son únicos
% y no deberán 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;

f) Finalmente, generamos la gráfica con un título 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');

g) Juntando todo lo anterior, tendremos el siguiente archivo de MATLAB:


% Sampling frequency
Fs = 1024;
% Time vector of 1 second
t = 0:1/Fs:1;
% 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)/length(x);
% Take the square of the magnitude of fft of x.
mx = mx.^2;
% Since we dropped half the FFT, we multiply mx by 2 to keep the same energy.
% The DC component and Nyquist component, if it exists, are unique and should not be multiplied by 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
% This is an evenly spaced frequency vector with NumUniquePts points.
f = (0:NumUniquePts-1)*Fs/nfft;
% Generamos 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 6.2 agrega un nuevo objeto espectro. Objetos espectro contienen
información de los parámetros de un método particular de estimación espectral (por ejemplo,
. ℎ). Este objeto proporciona una mejor forma para ver y manipular los parámetros de
estimación espectral. Vea la página de referencia del espectro (Spectrum Objects) y las correspon-
diente páginas de referencia para el método de estimación asociado (Spectral Estimation Method)
para más información. El objeto tiene métodos para evaluar la densidad espectral de potencia para
técnicas paramétricas y no paramétricas (convencional) y el espectro cuadrático medio para las téc-
nicas no paramétricas. Para las técnicas de estimación espectral subespacio (MUSIC y EIG), sin
embargo, el objeto tiene métodos para calcular la pseudoespectro. Como un ejemplo para utilizar el
objeto del espectro, ver la demostración siguiente: Measuring the Power of Deterministic Periodic
Signals (Medida de Potencia de Señales periódicas deterministas).

Práctica 3: Transformada de Fourier en tiempo discreto


DTFT ·····>Transformada de Fourier en Tiempo Discreto
Introducción.
La transformada de Fourier X(w) de una señal en tiempo discreto x[n] se calcula mediante la ex-
presión

y su inversa es,

La DTFT X(w) toma valores complejos y es una función continua y periódica en w. El periodo es 2π,
representándose normalmente en el intervalo [-π, π]. Al evaluar numéricamente la DTFT se presen-
tan dos problemas:

a) La secuencia x[n] puede tener un número infinito de puntos.


b) X(w) es una función continua de la frecuencia w y debe ser discretizada para trabajar en un pro-
cesador digital.
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 evalúa en un numero N finito de frecuencias equi-
distantes en el intervalo [-π , π] con incrementos de 2 π/N, es decir se consideran el conjunto dis-
creto de frecuencias wk = 2πk/N con k=0,1,...N-1. Si se elige N lo suficientemente grande los valo-
res X[2πk/N] se aproximan a la función X(w) continua origen del muestreo.
Al muestrear la DTFT de esta manera se obtiene la expresión 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 la función del el archivo dtft.m que se lista (si es necesario
use help para averiguar cómo funcionan las siguientes líneas)
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: número 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 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 función 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 módulo y fase de la señal 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 señal x1[n]= exp (j(2π/5)n) y x2[n]=cos((2π /5)n).
Explique las diferencias con los apartados anteriores.

DFT y FFT····> Algoritmo FFT para calcular la Transformada Discreta de


Fourier
El algoritmo FFT es una manera eficiente de calcular la DFT. En MATLAB la función es
X = fft(x,N)

 Calcula la FFT de N puntos del vector x.


 El resultado X es un vector de números complejos ordenados con índice k=0,1,...N-1.
 Si no se da el segundo parámetro se considera como N la longitud del vector. Para que el algo-
ritmo 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 trun-
cado.
x = ifft(X)
Calcula la transformada de Fourier inversa del vector X. También se puede especificar el número
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 conti-
nua queda centrada.

Ejercicios del apartado 2:


3.2.1 (*) Sea la secuencia x[n] = cos(0.25 n) + cos(0.5 n)+ cos(0.52 n). Se pide Calcular la
DFT utilizando la función matlab ( , ) con N=L= longitud de las secuencia x[n] y representar su
módulo para diferentes valores de número 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 señal.
3.2.2 ¿Cómo están relacionados los valores de L, N y la resolución en frecuencias?
3.2.3 Compruebe que sucede en el espectro de la señal 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 función ( ) utilizando la función ( ) para recuperar la señal
en el dominio de tiempos.
3.2.5 Suponga que se desea estudiar el contenido en frecuencias usando la FFT, de la siguiente
señal.
x(t) = 0.0472 cos(2)t + 1.5077) + 0.1362 cos(2)t + 1.8769) + 0.4884 cos(2)t - 0.1852) +
0.2942 cos(2)t -1.4488) + 0.1223 cos(2)t).
¿Cuál es su frecuencia fundamental? ¿Qué frecuencia de muestreo debe usarse? Estime un valor
adecuado de N para obtener suficiente precisión en frecuencias. Represente | ( )| y la fase de ( )
en función de .
3.2.6 Calcule la inversa de la función ( ) utilizando la función ( ) para recuperar la señal en
el dominio de tiempos.

Enventanado, "Leakage" y resolución espectral.


Enventanado
Sea la secuencia x[n] = sen(2 n/5)
Limitar la secuencia de entrada al intervalo 0, L-1 es equivalente a multiplicar la señal de entrada
x[n] por una ventana rectangular w(n) de longitud L= 40 donde
w[n] = 1 para 0 <= n < L-1
w[n] = 0 para el resto
Ejercicios del apartado 3:
3.3.1 (*)-Represente el espectro de las señales w[n], x[n] y del producto y[n]=w[n]*x[n]. Utilice
la función fft calculando un número suficiente de valores (N=128) para explicar los resultados ante-
riores.
3.3.2 Explique, a partir de los espectros anteriores, la relación del valor máximo obtenido en el eje
de ordenadas al representar |Y(w)| con los parámetros L y N.
Leakage
Una consecuencia del enventanado es que el espectro de la señal no se localiza en una única fre-
cuencia. Es decir si tenemos una señal como x(t) = sen wot que solo debería tener una frecuencia
fundamental w=wo, al calcular su FFT tomando una ventana cuadrada, aparecerán componentes
adicionales la frecuencia w y su espectro se extiende por todo el intervalo de frecuencias. Este efec-
to se conoce como derrame, o bien con el término inglés "Leakage"
Para comprender este efecto y estimar un valor adecuado para el tamaño de la ventana se pide
realizar las siguientes representaciones y estudiar los comportamientos que se presentas en los si-
guientes casos.
Ejercicios :
Para todo el ejercicio se considera una señal continua infinita dada por x(t) = sen (2 ft) con f = 1
KHz. El efecto de aplicar una ventana cuadrada es equivalente a reducir el intervalo de muestreo en
0 < t < tamaño 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.3 (*) Suponga que toma N= 8 muestras considerando el intervalo 0 < t < 1 ms. ¿Cuál es la
frecuencia de muestreo Fs?
3.3.4 (*) Suponga que toma N= 8 muestras considerando el intervalo 0 < t < 0.5 ms. ¿Cuál es la
frecuencia de muestreo Fs?
3.3.5 Suponga que toma N= 24 muestras considerando el intervalo 0 < t < 1.5 ms.
3.3.6 Suponga que toma N= 64 muestras considerando el intervalo 0 < t < 4 ms.
3.3.7 (*) Explique qué valores de tamaño de la ventana son los adecuados para reducir el efecto
de "Leakage"
Resolución espectral
El enventanado reduce la resolución espectral (diferencia entre la frecuencia de dos señales para
que pueden ser distinguidas).
Para ello considerar que la señal de entrada viene dada por

[ ]= . . .
+ +
3.3.8 Representar la dtft de esta señal para N=128 y para L=25, 50 y 100. ¿Qué relación hay entre
L y la resolución en frecuencia?

Con el fin de reducir el derrame es posible elegir una ventana w(n) cuya dtft W(w) tenga lóbulos
laterales más pequeños, pero esto provoca un aumento en la anchura del lóbulo principal, lo que
provoca una disminución en la resolución espectral.
3.3.9 Comprobar este efecto para la señal x[n] anterior usando una ventana de Hamming definida
por
w(n) = 1/2(1-cos(2 n/(L-1) ) para 0<= n <L-1
w(n) = 0 en el resto
3.3.10 Comparar la dfft de una ventana rectangular y de una ventana de Hamming usando el mis-
mo valor de L=50
Analizador de Espectros.
Un analizador de espectro es un sistema que permite obtener las frecuencias que están presentes
en una señal discreta.
El sistema más simple que nos permite verificar si una señal
tiene una componente con frecuencia w1 sería el mostrado en
la figura adjunta.
Donde se multiplica la señal de entrada por e-jw1n para des-
plazar la componente con frecuencia w=w1 al origen de fre-
cuencias w=0 y al aplicar el filtro pasa bajas se obtendrá la
contribución de la componente de la señal con w= w1.
Repitiendo este proceso para cada frecuencia w= wk, se obtendría el espectro del sistema.
Un sistema como el descrito adolece de dos grandes inconvenientes:

 Implica que se conocen las frecuencias presentes en la señal.


 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 están presentes


en la señal y solo interesa la contribución de estas componentes.
Para señales periódicas de periodo N el FPBJ puede sustituirse simplemente por un acumulador que
suma L puntos
En el caso N=L el comportamiento de este siste-
ma 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 señal discreta con periodo N=10.
x[n] = 8 + 10 sen(2 /10)n
3.4.1 Represente la señal x[n] en un rango ade-
cuado de valores para verificar que es periódica
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 después de aplicar el desplazamiento
en frecuencias y su posterior filtrado.

Práctica 4: Respuesta en frecuencia de sistemas LTI - Muestreo y Reconstruc-


ción - Filtrado
Sistemas digitales (Filtros digitales)
Sea un sistema LTI descrito por una ecuación en diferencias lineal de coeficientes constantes. La
salida y[n] en función de la entrada x[n], viene dada por

En MATLAB, estas ecuaciones se representan por dos vectores an y bn, expresándose la ecuación
anterior como

La función filter(b,a,x) implementa un filtro digital caracterizado por los coeficientes a y b que filtra-
rá los datos almacenados en x.
Cuando x[n] = [n], se tiene la respuesta al impulso que denominamos h(n).

4.1.1.(*)- Respuesta al impulso de un sistema definido por su ecuación en diferencias


Crear los vectores a y b que contengan los coeficientes x[n] e y[n] de la siguiente ecuación
[ ] + 0.9 [ − 2] = 0.3 [ ] + 0.6 [ − 1] + 0.3 [ − 2]
Genere un impuso unidad con una longitud de 100 elementos, y calcule mediante el comando filter
la respuesta h(n) des sistema anterior. Represente la función h[n].
4.1.2.- Resuelva analíticamente la ecuación anterior para n=1,... 5, cuando x[n] = [n]. Suponga
las condiciones iniciales de reposo y[0] = y[-1] = 0;
4.1.3.- Respuesta estacionaria: Calcule mediante la función filter la respuesta al impulso h(n)
correspondiente al sistema descrito por la siguiente ecuación
1
[ ] − 1.8 cos [ − 1] + 0.81 [ − 2] = [ ] + [ − 1]
16 2
en el intervalo -10 < n < 100, y la repuesta a la función escalón u(n). Represente gráficamente la
salida y determine el valor constante que alcanza la salida (valor que llamaremos H0) para → ∞.
Verificar, en su caso, que coincide con el valor determinado analíticamente.
NOTA La respuesta constante, H0, cuando n->00, se denomina respuesta estacionaria.
Compruebe gráficamente usando la función diff (vease help) que la derivada de la respuesta a la
función escalón es la respuesta al pulso unitario.
4.1.4.- Respuesta en frecuencia.
Para el sistema descrito en el apartado 4.1.3, genere la respuesta a la señal de entrada (impulso en
/
frecuencia) [ ] = [ ] para -10 < n < 100. Represente gráficamente la parte real e imagina-
ria, así como la razón 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 → ∞.. El valor de H caracteriza en ré-
gimen estacionario al sistema para una frecuencia. Indica la ganancia o atenuación y el cambio de
fase para la componente de w = /3 de la señal de entrada
Repita el proceso anterior para distintos valores de w y obtenga una representación de la respuesta
en frecuencia del sistema H(w).
Compruebe que los valores coinciden con el cálculo de H(w) determinado analíticamente.
Compare los resultados con los obtenidos mediante la función freqz.

Muestreo y Reconstrucción de señales.


La reconstrucción de una señal muestreada a una frecuencia fs cumpliendo el criterio de Nyquist se
realiza de manera ideal con un filtro pasa baja, cuya función 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 amplificación del filtro As permite recuperar sin atenuación la señal, debido a que el espec-
tro de la señal original al ser muestreado con un tren de deltas de periodo Ts sufre una atenuación
que viene dada por un factor 1/Ts.
La función h(t) en el domino de tiempos se obtiene calculando la transformada de Fourier inversa de
H(w) y corresponde a la expresión.
h(t) = (wc*As/ sinc (wc*t/
4.2.1.(*)- En este ejercicio se pretende realizar la reconstrucción de la señal y(t) = cos(2* *f0*t)
con f0 =100Hz; señal muestreada con una frecuencia de muestreo fs= 250Hz
Represente la señal continua y(t) en el intervalo [-40 ms,40ms] utilizando una variable independien-
te t evaluada cada dt= 1/(10*fs) para que conseguir mediante el comando plot (t,y) una represen-
tación 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 función h(t) represente el proceso de reconstrucción que se corres-
ponde con la aplicación de un filtro pasa baja con una frecuencia de corte fc=120Hz.
Para comprobar el proceso de reconstrucción se deber representar en un gráfico simultáneamente la
señal "continua", las muestras tomadas con fs= 250 Hz, y la señal reconstruida.
4.2.2. Repita el ejercicio anterior utilizando la función conv de Matlab que permite realizar la convo-
lución lineal de dos señales.
Se pretende calcular la convolución 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.2.3. Varié la frecuencia de corte del filtro fc1= 50 Hz, fc2= 100 Hz, fc3= 150Hz, fc4=125Hz y ex-
plique los resultados.

Diseño de FILTROS digitales con MATLAB


Los filtros ideales definidos como
H( w) = constante para w < wo (banda de paso ).
H(w) = 0 para w> wo (banda de rechazo ).
no son físicamente realizables ya que no son causales, sin embargo es posible diseñar filtros causa-
les que pueden aproximarse a los ideales con tanta precisión como sea necesaria . Estos filtros cau-
sales presentaran un rizado tanto en la banda de paso como en la banda de rechazo. Por otra parte
la transición en frecuencia entre ambas bandas no se realizara de forma abrupta. La figura muestra
las características indicadas

En Matlab existen varias funciones que ayudan al diseño de un filtro indicando sus características.
Una de ellas es ellip (ver help) que permite diseñar filtros elípticos. Las salidas b y a de esta función
son los coeficientes de la ecuación de diferencias del sistema, definidos en la primera parte de la
práctica. Por otro lado el orden N del filtro se corresponde con el mayor de los valores Na o Nb em-
pleados en la ecuación de diferencias.

[ − ]= [ − ]

Unos valores razonables para los parámetros de rizado que deben introducirse en la función ellip
son Rp=0.5 y Rs=20.
4.3.1 (*) Usando la función ellip, diseñar un filtro pasabaja de orden N=4 con frecuencia de corte
de 600 Hz, suponiendo que la señal de entrada será muestrada a una frecuencia de 8192 Hz.
4.3.2 (*) Matlab incorpora la función freqz (ver help) que calcula la función de transferencia H(w).
4.3.3 A partir de los vectores b y a obtenidos, construya la función H(w) siguiendo el procedimiento
del ejercicio 4.1.4 y represente H(w) en función de w en el intervalo 0, . Compruebe que se obtie-
ne el mismo resultado que utilizando la función freqz.
4.3.4 (*) Considere que la señal de entrada está formada por la suma de dos señales sinusoidales
de frecuencia 200 y 800 Hz respectivamente. Usando la función filter compruebe que a la salida ha
desaparecido la componente de 800 Hz.
4.3.5 Manteniendo la frecuencia de corte en la función ellip modificar uno a uno los parámetros N,
Rp y Rs. Use la función freqz para representar las características H(w) del filtro y estudie su depen-
dencia con los parámetros anteriores.
4.3.6 4.3.6.- Diseñe un filtro pasa-alta de orden N=6 con frecuencia de corte de 600 Hz, supo-
niendo que la señal de entrada será muestrada a una frecuencia de 8192 Hz. Represente H(w). Con-
sidere que la señal de entrada está formada por la suma de dos señale sinusoidales de frecuencia
200 y 800 Hz respectivamente. Usando la función filter compruebe que a la salida ha desaparecido
la componente de 200Hz,
4.3.7 Diseñe un filtro pasa-banda de orden N=6 con frecuencia de paso de 300 y 500 Hz, supo-
niendo que la señal de entrada será muestrada a una frecuencia de 8192 Hz. Represente H(w). Con-
sidere que la señal de entrada está formada por la suma de tres señales sinusoidales de frecuencia
100,400 y 600 Hz respectivamente. Usando la función filter compruebe que a la salida ha desapare-
cido la componente de 100 y de 600 Hz.
4.3.8 Diseñe un filtro suprime-banda de orden N=6 con frecuencia de paso de 300 y 500 Hz, supo-
niendo que la señal de entrada será muestrada a una frecuencia de 8192 Hz. Represente H(w). Con-
sidere que la señal de entrada está formada por la suma de tres señales sinusoidales de frecuencia
100,400 y 600 Hz respectivamente. Usando la función filter se debe comprobar que a la salida ha
desaparecido la componente de 400 Hz.
REPRESENTACIONES DE FOURIER PARA LAS SEÑALES
Existen cuatro representaciones distintas de Fourier, cada una aplicable a diferentes tipos de seña-
les. Estas cuatro clases están definidas por las propiedades de periodicidad de una señal y si el
tiempo es de tipo continuo o discreto. Las señales periódicas tienen representación en series de Fou-
rier. La Serie de Fourier (FS) aplica a señales periódicas de tiempo continuo mientras que la Serie
Discreta de Fourier (DTFS) aplica a señales periódicas de tiempo discreto. Las señales no periódicas
tienen representación en forma de transformada. Si la señal es continua en el tiempo y no periódica,
la representación es llamada Transformada de Fourier (FT). Si la señal es discreta en el tiempo y no
periódica entonces la representación usada es la transformada de Fourier en tiempo discreto
(DTFT). La siguiente tabla ilustra la relación entre las propiedades de tiempo de una señal y la re-
presentación de Fourier adecuada.
Tiempo Periódicas No periódicas
Continuas Series de Fourier Transformada de Fourier
( FS ) ( FT )

Discretas Series discretas de Fourier Transformada discreta de Fourier


( DTFS ) ( DTFT)

La siguiente tabla muestra las relaciones matemáticas utilizadas para calcular las representaciones
de Fourier.
Tiempo Periódicas No periódicas
Series de Fourier Transformada de Fourier

( )= [ ] ( )= ( )

Continuas
[ ]= ( )
( )

( ) ; = ( )= ( )

Series discretas de Fourier Transformada discreta de Fourier

[ ]= [ ] [ ]= [ ]
( )

Discretas [ ]= [ ] [ ]= [ ]
( )

[ ] [ ] ; = ( )
La Transformada Discreta de Fourier (DTFS)
La DTFS es la única representación de Fourier que es de valor discreto tanto en el tiempo como
en la frecuencia y de esta manera implícitamente conveniente para una implementación compu-
tacional en MATLAB. Las expresiones utilizadas para esta representación son fácilmente implemen-
tables en MATLAB como archivos. Sin embargo los comandos built-in de MATLAB fft y ifft pueden
también ser utilizados para evaluar la DTFS. Dado un vector llamado x de longitud N representando
un periodo de una señal periódica x[n]. El comando:
>> X=fft(x)/N
Produce un vector llamado X de longitud N que contiene los coeficientes de la DTFS. Matlab asu-
me que el periodo evaluado en la señal 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 correspon-
den a x[N-1] y X[N-1]. Nótese que la división por N es completamente necesaria, debido a que el
comando fft evalúa la siguiente expresión sin realizar la división 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 señal en el tiempo. Nótese que el comando
ifft debe estar multiplicado por N para evaluar la siguiente ecuación.

[ ]= [ ]
( )
Los comandos fft e ifft son computados usando un algoritmo rápido o numéricamente eficiente,
conocido como “Fast Fourier Transform”.
Considere el siguiente ejemplo.
Determinar los coeficientes DTFS para la siguiente señal:

La señal tiene un periodo de 24, de manera que tan solo se hace necesario definir un periodo y eva-
luar sobre este periodo la DTFS. Los comandos usados para realizar dicho cálculo son:
>> n = 0:23;
>> x = ones(1,24) + sin( (n * pi / 12) + (3 * pi / 8 ) );
>> X = fft(x)/24;
El resultado teórico del ejemplo es el siguiente:

El resultado obtenido mediante los comandos presentados anteriormente es:


X =
Columns 1 through 5
1.0000 0.4619 - 0.1913i 0.0000 + 0.0000i -0.0000 + 0.0000i -0.0000 + 0.0000i
Columns 6 through 10
-0.0000 - 0.0000i 0.0000 - 0.0000i 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 -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.0000+0.0000i -0.0000+0.0000i
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 común de la transformada de Fourier, es
encontrar las componentes frecuenciales de una se-
ñal en el dominio del tiempo que está contaminada
con ruido. Considérese dos señales senoidales que
tienen frecuencias fundamentales de 50Hz y 120Hz,
luego considérese estas señales contaminadas con
ruido aleatorio. Los comandos para generar una se-
ñal 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 señal original. Sin em-
bargo al realizar la conversión de esta señal al dominio de la frecuencia, la identificación de estas
componentes se hace más sencilla. La conversión de la señal al dominio de la frecuencia se hace
calculando la Transformada Rápida de Fourier, tomando para el cálculo los primeros 512 puntos de
la señal. 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 gráfica se puede tener en
cuenta que la información que aparece en el
arreglo Pyy es por propiedades de la transfor-
mada, simétrica con respecto a la frecuencia
media, es decir que si tenemos 512 puntos de
muestra, la señal que esta almacenada en el
arreglo es simétrica con respecto a la muestra
256, por lo tanto dibujar las ultimas 256 mues-
tras del arreglo será completamente innecesario.
De manera que para visualizar el espectro de
potencia los comandos deben ser como se
muestran a continuación:
>> f = 1000*(0:256)/512;
>> plot(f,Pyy(1:257))
Para ver todas las muestras y entender la
característica de simetría descrita anteriormen-
te 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 señales de las cuales
se formo la señal contaminada con ruido tienen
estas frecuencias fundamentales.
% FFT PARA ANÁLISIS ESPECTRAL
% Este ejemplo muestra el uso de la función FFT para el análisis espectral.
% Un uso común de las FFT es encontrar los componentes de la frecuencia de
% una señal enterrada en una señal 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
% señal, 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 algún ruido aleatorio con una desviación estándar de 2 para


% producir una señal de ruido y. Dar una mirada a esta señal de ruido y
% graficándola.

y = x + 2*rand(size(t));
plot(y(1:50))
title ('Tiempo de Dominio de la Señal Ruidosa')

% Claramente, resulta dificil identificar los componentes de la frecuencia


% de la mirada a esta señal; es por eso que el análisis espectral es tan
% popular.

% Encontrar la transformada discreta de Fourier de la señal ruidosa y es


% fácil; solo usar la transformada rápida de Fourier (FFT)

Y = fft(y,256);

% Computar la densidad espectral de la energía, una medida de la energía 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 asimétricos.)

Pyy = Y.*conj(Y)/256;
f = 1000/256*(0:127);
plot(f,Pyy(1:128))
title('Densidad espectral de la energía')
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 señal original.

plot(f(1:50),Pyy(1:50))
title('Densidad espectral de la energía')
xlabel('Frecuencia (Hz)')