Está en la página 1de 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));

plot(Fs*t(1:50),y(1:50)); title('Signal Corrupted with Zero-Mean Random Noise')

xlabel('time (milliseconds)')

% Sinusoide más ruido

title('Signal Corrupted with Zero-Mean Random Noise') xlabel('time (milliseconds)') % Sinusoide más ruido

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)|')

xlabel('Frequency (Hz)') ylabel('|Y(f)|') La principal razón del porque las amplitudes no son

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 = N 1 N 2 ), la libreria FFTW descompone el problema usando el algoritmo de Cooley-Tukey [1], el cual primero calcula N 1 transformadas de tamaño N 2 , y luego calcula N 2 transformadas de tamaño N 1 . La

descomposición es aplicada recursivamente tanto para las DFT de N 1 y N 2 -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].

[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

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

1.1 Transformada Rápida de Fourier (FFT)

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 2n 2 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(n 2 ). Si n es una potencia de 2, una FFT de una dimensión de longitud n

requerirá menos que 3nlog 2 n 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 2n 2 .

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.

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.

La siguiente figura ilustra las dos longitudes. El tiempo de ejecución de un algoritmo FFT depende

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

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

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);

f0 = (-n/2:n/2-1)*(fs/n); % Rango de frecuencia centrado en 0

power0 = y0.*conj(y0)/n;

plot(f0,power0)

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

% Re arregla los valores de y

% Potencia centrado en 0

% Re arregla los valores de y % Potencia centrado en 0 El re arreglo hace

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.

suma a la fase 2 π con más frecuencia de lo que resta. EJEMPLO 3 1.1.2.3

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)

title('{\bf Blue Whale Call}') sound(x,fs) Una A "trill" es seguido por una serie de B

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}')

title('{\bf Blue Whale B Call}') c) Use la fft para calcular la DFT de la señal.

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}')

Component Frequencies of a Blue Whale B Call}') La llamada B está compuesto de una frecuencia

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

Position of the Asteroid Pallas}') grid on Gauss deseaba interpolar un polinomio trigonométrico de la

Gauss deseaba interpolar un polinomio trigonométrico de la forma:

deseaba interpolar un polinomio trigonométrico de la forma: b) El siguiente código usa la fft para

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;

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')

Interpolant','Location','NW') Referencias [1]. Briggs, W. and V.E. Henson. The DFT: An

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.-' );

Aquí está una mirada más de cerca a los primeros 50 años.

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

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

50 años. plot(year(1:50),relNums(1:50), 'b.-' ); La herramienta fundamental de procesamiento de señales es

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 = fft(relNums); Y(1)=[];
Y = fft(relNums); Y(1)=[];

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');

'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

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')

nyquist = 1/2; freq = (1:n/2)/(n/2)*nyquist; plot(freq,power) xlabel( 'cycles/year' ) title('Periodogram')
'cycles/year' ) title('Periodogram') e) La escala en ciclos/año es algo inconveniente. Podemos

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))

plot(freq(1:40),power(1:40)) xlabel( 'cycles/year' )
plot(freq(1:40),power(1:40)) xlabel( 'cycles/year' )

xlabel('cycles/year')

f) Ahora graficaremos la potencia frente al periodo por conveniencia (donde periodo= 1/frecuencia). Como esperábamos,

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)');

); xlabel( 'Period (Years/Cycle)' ); g) Finalmente, podemos fijar la longitud del ciclo con un

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) Se recomienda que la longitud del

2

FFT con MATLAB

1)

>> X = fft(x)

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)

Hace la FFT del vector x. “X” es un vector de números complejos ordenados desde k=0

N-1.

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:

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).

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

en tiempo discreto x[n] se calcula mediante la ex- presión y su inversa es, La DTFT

y su inversa es,

x[n] se calcula mediante la ex- presión y su inversa es, La DTFT X(w) toma valores

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 w k = 2πk/N con k=0,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).

N-1.

algoritmo conocido como FFT (Fast Fourier Transform). N-1. Para evitar problemas de muestreo insuficiente se debe

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

%

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.88 n *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)

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 w o t que solo debería tener una frecuencia fundamental w=w o , 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) )

w(n) = 0

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 w 1 sería el mostrado en la figura adjunta. Donde se multiplica la señal de entrada por e -jw 1 n para des- plazar la componente con frecuencia w=w 1 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= w 1 . Repitiendo este proceso para cada frecuencia w= w k , se obtendría el espectro del sistema. Un sistema como el descrito adolece de dos grandes inconvenientes:

para 0<= n <L-1

en el resto

grandes inconvenientes: para 0<= n <L-1 en el resto  Implica que se conocen las frecuencias

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
En el caso N=L el comportamiento de este siste- ma es un filtro pasa baja

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,

L puntos distintos de 0 y su H(w) para L=10 es

1] con

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.

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

salida y[n] en función de la entrada x[n], viene dada por En MATLAB, estas ecuaciones se

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

vectores an y bn, expresándose la ecuación anterior como La función filter(b,a,x) implementa un filtro digital

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].

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

4.1.2.- Resuelva analíticamente la ecuación anterior para n=1,

[ ] − 1.8 cos 16 [ − 1] + 0.81 [ − 2] = [ ] +

1 2 [ − 1]

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 H 0 ) 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

real e imagina-

ria, así como la razón entre ambas. Dividendo la respuesta por x(n) se obtiene H(w) para w = /3 ,

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 f s cumpliendo el criterio de Nyquist se realiza de manera ideal con un filtro pasa baja, cuya función de transferencia es H(w) = A s para |w|< w c H(w) = 0 para el resto de frecuencias siendo w c la frecuencia de corte . Nota: La amplificación del filtro A s 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/T s. 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) = (w c *A s / sinc (w c *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.

determine el valor constante, en modulo y fase, de H para → ∞

frecuencia) [ ] = / [ ] para -10 < n < 100. Represente gráficamente la parte

Diseño 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 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

abrupta. La figura muestra las características indicadas En Matlab existen varias funciones que ayudan al diseño

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:

Determinar los coeficientes DTFS para la siguiente señal: La señal tiene un periodo de 24, de

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 teórico del ejemplo es el siguiente: El resultado obtenido mediante los comandos presentados

El resultado obtenido mediante los comandos presentados anteriormente es:

X = Columns 1 through 5

1.0000 0.4619 - 0.1913i

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 Columns 16 through 20

0.0000 + 0.0000i -0.0000 + 0.0000i -0.0000 + 0.0000i

0

-0.0000 + 0.0000i

-0.0000 + 0.0000i

-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:

anteriormen- te se pueden utilizar los siguientes comandos: >> f = 1000*(0:511)/512; >> plot(f,Pyy) Del
anteriormen- te se pueden utilizar los siguientes comandos: >> f = 1000*(0:511)/512; >> plot(f,Pyy) Del
anteriormen- te se pueden utilizar los siguientes comandos: >> f = 1000*(0:511)/512; >> plot(f,Pyy) Del

>> 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)')