Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Transformada Rápida de Fourier (FFT) e Interpolación en Tiempo Real
Transformada Rápida de Fourier (FFT) e Interpolación en Tiempo Real
Presentado por:
D. Juan Luis Posadas Yage
Dirigido por:
D. Gins Benet Gilabert
Valencia, Julio 1.998
1. Introduccin
El trabajo que a continuacin se presenta se ha desarrollado para su aplicacin en el procesado digital
de seales procedentes de sensores de ultrasonidos.
Los objetivos han sido varios:
Para la lectura del trabajo se requieren conocimientos sobre la Transformada de Fourier y las
matemticas implicadas, stos pueden adquirirse consultando la bibliografa recomendada [Fourier] y
[DSP 1] antes de abordar la lectura.
El trabajo se divide en dos apartados coincidiendo con los dos objetivos planteados. En el primer
apartado se explica la complejidad de los clculos para realizar la Transformada Discreta de Fourier y
se detalla la teora necesaria para obtener un algoritmo eficiente basado en la Transformada Rpida de
Fourier, como resultado se presenta una implementacin en C de dicho algoritmo [TMS32C30], [FFT
1] y [FFT 2]. En el segundo apartado se explica la teora que rodea a la interpolacin senoidal en
tiempo real [DSP 2] y se implementan paso a paso una serie de algoritmos en C que la realizan.
Adems, se analizan dichos algoritmos realizando un estudio de los resultados obtenidos al ejecutarlos
obteniendo, para finalizar, una serie de conclusiones sobre cmo realizar y caracterizar una
interpolacin dada una seal con unas caractersticas de muestreo determinadas.
_ APARTADO 1 _______________________________________
2. Transformada Discreta de Fourier (DFT)
La Transformada Discreta de Fourier (DFT del ingls Discrete Fourier Transform) es el equivalente
discreto de la Transformada de Fourier donde se ha transformado la variable continua t por la
variable discreta nTs siendo Ts el periodo de muestreo. Recordemos que la Transformada de
Fourier de una seal analgica x(t) es:
X ( ) =
x (t ) e
jt
dt
X ( k ) = x ( n ) W nk
k = 0, 1, . . ., N 1
n =0
x(n) =
UPV
1
N
N 1
X (k ) W
nk
n = 0, 1, . . ., N 1
k =0
Pgina
Donde las constantes W son conocidas como factores twiddle y definidas como:
W = e j 2
Observar que W es una funcin de longitud N, por ello, tambin suele expresarse como WN.
El inconveniente de realizar unos algoritmos que implementen tal cual estas frmulas es la cantidad de
tiempo requerido para computar la salida. Esto es debido a que los ndices k y n deben variar de 0 a
N-1 para conseguir el rango de salida completo y, por tanto, se deben realizar N2 operaciones.
El primer objetivo de este trabajo ha sido implementar un algoritmo eficiente que realice la DFT. Este
algoritmo se basa en la Transformada Rpida de Fourier (FFT del ingls Fast Fourier Transform). Un
algoritmo para la FFT obtiene los mismos resultados que la DFT pero ms rpidamente debido a que
reduce el nmero de clculos requerido para realizar la DFT.
El trmino genrico Transformada Rpida de Fourier abarca distintos algoritmos con distintas
caractersticas, ventajas y desventajas.
W k = W k +N
y su simetra implica:
W k = W k + N 2
La FFT descompone la DFT de N puntos en transformadas ms pequeas. Una DFT de N puntos es
descompuesta en dos DFTs de (N/2) puntos. Cada DFT de (N/2) puntos se descompone a su vez en
dos DFTs de (N/4) puntos y as sucesivamente. Al final de la descomposicin se obtienen (N/2)
DFTs de 2 puntos cada una. La transformada ms pequea viene determinada por la base de la FFT.
Para una FFT de base 2, N debe ser una potencia de 2 y la transformada ms pequea es la DFT de 2
puntos. Para implementar la FFT existen dos procedimientos: diezmado en frecuencia (DIF del ingls
Decimation In Frequency) y diezmado en el tiempo (DIT del ingls Decimation In Time). En este
trabajo se ha utilizado un algoritmo DIF.
DISCA
X ( k ) = x ( n ) W nk
k = 0, 1, . . ., N 1
n =0
x (0), x (1),...., x 1
2
N N
x , x + 1,...., x (N 1)
2 2
la ecuacin para la Transformada Discreta de Fourier tambin podemos separarla en dos sumatorios:
X (k ) =
( N 2 )1
x(n) W nk +
n =0
N 1
x (n ) W
nk
n=N 2
x(n) W
X (k ) =
nk
+W
kN 2
( N 2 )1
n =0
x(n) W
nk
n =0
donde WkN/2 se saca fuera del segundo sumatorio porque no depende de n. Adems tenemos que:
W kN 2 = e jk = (e j ) = (cos j sen ) = ( 1)
k
X (k ) =
( N 2 )1
n =0
N nk
k
x (n ) + ( 1) x n + 2 W
Debido a que (-1)k = 1 para k pares y 1 para k impares, la ecuacin anterior puede ser dividida en dos
ecuaciones, una para los k pares y otra para los k impares:
X (k ) =
( N 2 )1
n =0
X (k ) =
( N 2 )1
n =0
N nk
x ( n ) + x n + 2 W
N nk
x ( n ) x n + 2 W
para k par
para k impar
Sustituyendo k = 2k para los k pares, y k = 2k+1 para los k impares, podemos escribir la ecuaciones
como:
UPV
Pgina
X ( 2k ) =
(N 2 )1
n =0
X (2k + 1) =
(N 2 )1
n =0
N 2 nk
x ( n ) + x n + 2 W
N
k = 0,1, . . ., 1
2
N n
2 nk
x ( n ) x n + 2 W W
N
k = 0, 1, . . ., 1
2
Debido a que W es una funcin de longitud N, puede escribirse como WN y, de la misma manera,
(WN)2 puede escribirse como WN/2. Esto va a permitir escribir de forma ms clara la ecuaciones
anteriores. Adems, llamaremos a(n) y b(n) a las expresiones:
b( n ) = x ( n ) x n +
2
a ( n ) = x (n ) + x n +
2
X ( 2k ) =
(N 2 )1
a(n) W
nk
N 2
n =0
X (2k + 1) =
(N 2 )1
b( n ) W
n =0
n
N
N
k = 0,1, . . ., 1
2
WNnk2
N
k = 0,1, . . ., 1
2
X ( k ) = x ( n ) WNnk
k = 0, 1, . . ., N 1
n =0
y la hemos descompuesto en dos ecuaciones correspondientes a dos transformadas de N/2 puntos. Si,
por ejemplo, la secuencia inicial de puntos fuera de tamao 8 (N=8) siendo los puntos: x(0), x(1),
x(3), x(4), x(5), x(6) y x(7), al realizar la primera descomposicin ahora tendremos dos transformadas
de 4 puntos. En la primera transformada los nuevos puntos x(n) sern los a(n) que desarrollando su
expresin tenemos:
Mientras que en la segunda transformada los nuevos puntos vienen dados por b(n)*(WN)n :
Pgina
lo llamaremos: x(4)
lo llamaremos: x(5)
lo llamaremos: x(6)
lo llamaremos: x(7)
DISCA
X ( k ) = x (n ) W nk
k = 0,1
n =0
donde:
W 1 = e j 2
= 1
Los valores X(0), X(4), X(2), ....., X(7) son la secuencia de salida de la Transformada Discreta de
Fourier de la secuencia inicial x(n) para N=8 que tenamos. Observemos que mediante este algoritmo
UPV
Pgina
la secuencia de salida se obtiene de forma desordenada por lo que habr que reordenarla, para ello se
aplica un algoritmo conocido como bit-reversal que veremos ms adelante.
Es importante observar que en el desarrollo expuesto para el ejemplo de la transformada de 8 puntos
slo se han empleado en los clculos 4 factores twiddle que han sido: W0, W1, W2 y W3 para N=8. De
manera que antes de realizar la transformada se pueden calcular a priori los factores que vamos a
necesitar que dependern solamente de N. Para realizar una transformada de N puntos se necesitarn
slo los N/2 factores twiddle primeros.
Bien, pues el algoritmo que a continuacin veremos hace exactamente lo mismo que acabamos de ver.
En el caso del ejemplo, en una primera fase calcular a partir de los puntos x(n) los puntos x(n), en
una segunda fase calcular a partir de los puntos x(n) los puntos x(n) y en una ltima fase obtendr
a partir de los puntos x(n) la secuencia de salida X(k) desordenada que finalmente reordenar.
Este algoritmo es conocido como diezmado en frecuencia (DIF) debido a que la secuencia de salida
X(k) es descompuesta, o diezmada, en subsecuencias ms pequeas. El nmero de fases o estados
para llegar a la secuencia de salida viene dado por M donde N=2M.
Un Procesador Digital de Seales (DSP del ingls Digital Signal Processing) es ideal para realizar
FFTs ya que puede ejecutar las matemticas implicadas en stas muy rpidamente. Los DSP estn
diseados para ello.
A continuacin se documenta la implementacin en C del algoritmo.
Pgina
DISCA
fprintf(fptr,"
}");
fprintf(fptr," w[]={");
for(i=0;i<N;i++)
{
fprintf(fptr,"%8.5f,%8.5f,\n",cosval[i],sinval[i]);
fprintf(fptr,"
");
}
fclose(fptr);
return 0;
}
La implementacin en C para el DSP TMS320C30 del algoritmo de la FFT es la siguiente:
/*FFT.C-FFT RADIX-2 USING DIF. FOR UP TO 128 POINTS
#include "fft.h"
#include "twid64.h"
*/
*/
UPV
Pgina
for (upper_leg=j;upper_leg<N;upper_leg+=(2*leg_diff))
{ /*tantas iteraciones como puntos en cada transformada*/
lower_leg=upper_leg+leg_diff;
temp1.real=(Y[upper_leg]).real + (Y[lower_leg]).real;
temp1.imag=(Y[upper_leg]).imag + (Y[lower_leg]).imag;
temp2.real=(Y[upper_leg]).real - (Y[lower_leg]).real;
temp2.imag=(Y[upper_leg]).imag - (Y[lower_leg]).imag;
(Y[lower_leg]).real=temp2.real*(w[index]).realtemp2.imag*signo*(w[index]).imag;
(Y[lower_leg]).imag=temp2.real*signo*(w[index]).imag+
temp2.imag*(w[index]).real;
(Y[upper_leg]).real=temp1.real;
(Y[upper_leg]).imag=temp1.imag;
}
index+=step;
}
leg_diff=leg_diff/2;
step*=2;
}
/* bit reversal for resequencing data */
j=0;
for (i=1;i<(N-1);i++)
{
k=N/2;
while (k<=j)
{
j=j-k;
k=k/2;
}
j=j+k;
if (i<j)
{
temp1.real=(Y[j]).real;
temp1.imag=(Y[j]).imag;
(Y[j]).real=(Y[i]).real;
(Y[j]).imag=(Y[i]).imag;
(Y[i]).real=temp1.real;
(Y[i]).imag=temp1.imag;
}
}
if (signo==-1)
{
scale = (float)(1.0/N);
for (i = 0; i < N; i++)
{
(Y[i]).real = scale*(Y[i]).real;
(Y[i]).imag = scale*(Y[i]).imag;
};
};
return;
}
El algoritmo se ha implementado mediante la funcin: FFT donde el significado de los parmetros
es el siguiente:
Pgina
10
DISCA
COMPLEX *Y: se especifica la direccin del vector donde se encuentra la secuencia de puntos a
la que hay que aplicar la Transformada.
Int N: se especifica el nmero de puntos de la secuencia.
Int signo: se especifica si hay que realizar la FFT (signo = 1) o la IFFT (signo = -1).
Si observamos la funcin FFT comprobaremos que realiza exactamente los pasos descritos
anteriormente.
Destacar que esta funcin realiza la FFT para secuencias de valores de N puntos complejos, pudiendo
valer N hasta 128 puntos. N siempre debe ser una potencia de 2 (recordemos que esto era una
condicin necesaria para poder realizar la FFT).
Los factores twiddle necesarios se obtienen del vector W[] definido en el fichero twid64.h, este
vector posee los 64 factores twiddle que se utilizan cuando N=128. En el caso en que N sea menor
que 128 no ser necesario disponer de otro vector con los factores twiddle correspondientes sino que
stos ya se encuentran en el vector actual aunque separados unos de otros 128/N posiciones. Para
localizar dentro del vector dichos factores el algoritmo utiliza dos variables: la variable step que
indica la distancia entre los factores (se inicializa con el valor 128/N y a medida que se
descomponen la transformadas en otras con la mitad de puntos se actualiza multiplicndose por 2) y la
variable index que se utiliza para indexar el vector y acceder de uno en uno a los factores
necesarios en una transformada (index se inicializa a 0 para obtener el primer factor twiddle y se le
suma la variable step para obtener cada uno de los siguientes).
Tambin destacar que la funcin FFT despus de obtener la secuencia de salida la reordena
mediante un algoritmo conocido como bit-reversal. Este algoritmo, como puede observarse,
se encuentra implementado al final de la funcin.
Por ltimo, comentar que esta funcin adems de realizar la FFT tambin realiza su inversa o IFFT,
para ello se dispone del parmetro signo que se pasa como argumento en la llamada a la funcin.
Cuando signo vale 1 se realiza la FFT mientras que cuando vale 1 se realiza la IFFT. Para
realizar la Transformada Inversa de Fourier slo hace falta cambiar el signo de unos factores twiddle y
efectuar al final un escalado de la secuencia de salida dividiendo cada valor por N.
La funcin FFT ha sido probada y utilizada en el DSP TMS320C30 obtenindose los resultados
deseados.
_ APARTADO 2 _______________________________________
5. Interpolacin
Supongamos una seal muestreada a una frecuencia determinada, la interpolacin consiste en
introducir puntos de muestreo entre las muestras ya adquiridas.
Existen muchas tcnicas para interpolar, como por ejemplo la interpolacin lineal que consiste
simplemente en unir los puntos de muestreo con lneas rectas, evidentemente sta no es la mejor
solucin. Otro tipo de interpolacin es la polinomial, en la cual se utilizan polinomios de distintos
grados (segn la precisin requerida) para reconstruir la seal. Pero las tcnicas ms interesantes para
nosotros son la interpolacin a partir del espectro en frecuencia de una seal y la interpolacin
senoidal, las cuales aseguran que si la seal original ha sido muestreada cumpliendo el teorema del
muestreo sta ser reconstruida con gran exactitud.
UPV
Pgina
11
x (t ) =
x (n )
n =
sen ( 0 (t nT ))
0 (t nT )
Pgina
12
DISCA
Atendiendo de nuevo a la frmula, se puede concluir que la interpolacin senoidal reconstruye la seal
mediante un sumatorio de la seal senoidal SINC desplazada. La seal SINC viene dada por la
frmula:
sinc(x ) =
sen (x )
x
4
3
Figura 1
En la figura 1 slo se representa la funcin SINC para los valores positivos del eje de las abscisas, esta
funcin es simtrica para los valores negativos.
En la interpolacin senoidal se tiene una seal SINC por cada punto muestreado y la manera en que se
desplazan dichas seales puede observarse en la figura 2.
Puntos
muestreados
Figura 2
La seal SINC de una muestra cualquiera vale 1 en la abscisa de dicha muestra, abscisa que para la
seal SINC vale 0 (ya que SINC(0)=1). En las abscisas de todas las dems muestras dicha seal SINC
vale 0, por lo que los valores para estas abscisas son iguales a n siendo n distinto de cero (ya que
SINC(n) = 0 para n distinto de 0). De esta manera se observa que una seal SINC entre dos muestras
UPV
Pgina
13
debe desplazarse sobre el eje de las abscisas unidades. Resumiendo, la muestra que determina la
seal SINC est en la abscisa 0 y las muestras siguientes se encuentran en las abscisas , 2, 3, ..., n
siendo n el nmero de muestras siguientes. Este razonamiento es igual para las muestras anteriores
cuyas abscisas son -, -2, -3, ..., -n siendo n el nmero de muestras anteriores (la seal SINC es
simtrica).
Para calcular un nuevo punto interpolado se multiplica cada uno de los puntos muestreados por el
valor que tenga su correspondiente SINC en la abscisa del punto nuevo a calcular. Despus se realiza
la suma de estos productos obtenindose as el nuevo punto interpolado.
Como ya se ha comentado, a la hora de calcular un nuevo punto interpolado se tienen en cuenta slo
las muestras ms cercanas a dicho punto pues son las que ms influencia ejercen. El resto de muestras
ms lejanas no se tienen en cuenta porque el despreciarlas no se comete un error suficientemente
significativo en el clculo del nuevo punto.
El nmero de muestras a considerar se toma simtrico, es decir, el mismo nmero de muestras
anteriores que posteriores al punto nuevo que se va a obtener. El conjunto de muestras que se utilizan
para determinar un nuevo punto forman lo que se conoce como ventana de interpolacin.
Habr una seal senoidal SINC para cada una de las muestras de la ventana de interpolacin.
En el clculo de todos los puntos nuevos que se deseen obtener entre dos muestras consecutivas la
ventana de interpolacin a utilizar ser, lgicamente, la misma.
Esta ventana habr que actualizarla sucesivamente con nuevas muestras para as ir obteniendo los
puntos interpolados entre todas las muestras.
Como ya se coment, esta tcnica de interpolacin se puede aplicar en tiempo real ya que no hace
falta tener toda la seal muestreada para obtener los nuevos puntos sino que a medida que se van
obteniendo nuevas muestras se van calculando algunos de los nuevos puntos (recordemos que en la
interpolacin basada en la FFT esto no era posible pues en este caso se deba tener toda la seal antes
de poder interpolar).
El tamao de la ventana de interpolacin determina el rango de valores para los cuales se necesita
calcular el valor de la funcin SINC. Si, por ejemplo, se consideran 4 muestras anteriores y 4
muestras posteriores para la obtencin de un nuevo punto (ventana de interpolacin de tamao 8),
entonces se necesitarn valores para la seal SINC(x) desde x=0 hasta x=4.
El nmero de valores a obtener para la SINC en un rango dado depende del nmero de puntos nuevos
que se deseen obtener entre dos muestras.
Los puntos nuevos que se interpolen cada dos muestras tienen que guardar siempre la misma distancia
entre ellos y entre las muestras, dado que el resultado de interpolar ha de ser el de reconstruir la seal
como si se hubiera muestreado a una frecuencia mayor.
Llamaremos Intervalo entre los valores a la siguiente expresin:
Intervalo entre los valores = /(nmero de puntos nuevos entre muestras +1)
De esta manera, continuando con el ejemplo, si se desea obtener un punto nuevo cada dos muestras el
Intervalo ser igual a /2, lo cual quiere decir que en el rango [0..4] se deben obtener los valores de
la seal SINC(x) para x = 0, /2, , 3/2, 2, 5/2, 3, 7/2 y 4. (Los valores para las x negativas
son los mismos).
Los valores que de esta manera se obtengan para la seal SINC sern los mismos para todas las
seales SINC que intervengan en el clculo de un nuevo punto. Para cada seal SINC habr que
Pgina
14
DISCA
emplear un valor u otro dependiendo de cmo est desplazada dicha seal o, lo que es lo mismo, de la
distancia al punto nuevo a la que se encuentre la muestra asociada a la correspondiente seal SINC.
De este modo se podr obtener de forma anticipada una tabla con los valores de la seal SINC
necesarios para realizar una interpolacin con un tamao determinado de ventana de interpolacin y
con un nmero determinado de puntos nuevos a obtener entre cada dos muestras.
Si por ejemplo ahora se desean obtener dos puntos (en lugar de uno) cada dos muestras con una
ventana de interpolacin del mismo tamao que antes (8 muestras), el Intervalo ser igual a /3 y los
valores de la seal SINC(x) que se tendrn que utilizar sern los correspondientes a x = 0, /3, 2/3,
, 4/3, 5/3, 2, 7/3, 8/3, 3, 10/3, 11/3, 4. De estos valores se utilizarn con la 4 muestras
anteriores para obtener el primer punto nuevo entre dos muestras los correspondientes a cuando x =
/3, 4/3, 7/3 y 10/3, y para obtener el segundo punto nuevo entre las mismas muestras los
correspondientes a x = 2/3, 5/3, 8/3 y 11/3. En el caso de las 4 muestras posteriores los valores
de la SINC a utilizar para obtener el primer punto nuevo son los valores que utilizan las muestras
anteriores para el clculo del segundo punto nuevo y para obtener el segundo punto los valores que
utilizan las muestras anteriores para el clculo del primero, esto es debido a la simetra de la funcin
SINC.
El algoritmo que se ha desarrollado para generar la tabla de valores citada anteriormente se
implementa en la siguiente funcin en C:
#include <math.h>
#define true 1
#define false 0
int gen_valores_sinc (int tam_ventana, int num_puntos_nuevos,
double *vector_valores_sinc)
{
//El tamao del vector tiene que ser:
//vector_valores_sinc >= (tam_ventana*num_puntos_nuevos)
double pi, auxiliar, intervalo, X;
int num_muestras, indice, i, j;
if (((tam_ventana%2) != 0) //"%" obtiene el resto de la divisin
||(num_puntos_nuevos<1)) return false;
num_muestras = tam_ventana/2; //tam_ventana es par.
//pi = 4.0 * atan(1.0);
pi = 3.14159265359;
auxiliar = 1/(((double)num_puntos_nuevos)+1);
intervalo = pi*auxiliar;
indice = 0;
X = intervalo;
for (i=0; i<num_muestras; i++)
{
for (j=0; j<num_puntos_nuevos; j++)
{
auxiliar = 1/X;
vector_valores_sinc[indice] = auxiliar*((double)sin(X));
indice++;
X = X + intervalo;
};
X = X + intervalo;
};
UPV
Pgina
15
return true;
}
Donde el significado de los parmetros es el siguiente:
Si se observa la funcin implementada puede apreciarse que ha sido implementada para minimizar el
nmero de productos necesarios. La funcin consta principalmente de dos bucles: en el primero se
realiza un nmero de iteraciones igual al tamao de la ventana de interpolacin y en el segundo,
dentro del primero, se realiza un nmero de iteraciones igual al nmero de puntos nuevos a obtener.
De esta manera el segundo bucle se ejecuta un nmero de veces igual al tamao de la ventana de
interpolacin. Antes de la ejecucin de los bucles se obtiene el Intervalo entre los valores
(/[nmero de puntos nuevos entre muestras +1]) que se utilizar para ir obteniendo los valores de X
en el clculo de los valores de la funcin SINC(X). Cada uno de los valores de la funcin SINC(X)
se obtiene en cada una de las iteraciones del segundo bucle. Como vimos en la teora el primer valor
para X se corresponde con el valor del Intervalo entre los valores y los siguientes valores para X
se pueden obtener sumando al valor actual dicho Intervalo entre los valores. Para ello, se inicializa
X con el valor del Intervalo y despus en cada iteracin del segundo bucle se calcula el valor de la
funcin SINC(X) y se actualiza el valor de X sumndole el Intervalo entre los valores. Es
importante observar como despus del segundo bucle y antes de una nueva iteracin del primer bucle
se vuelve a sumar a X el Intervalo entre los valores, esto es debido a que en ese momento X tiene
un valor igual a n siendo n distinto de 0 y para este caso la funcin SINC(X) vale 0, valor que
conocemos y que adems no ser utilizado por corresponder al valor que la seal SINC tiene en la
posicin de las muestras, no en la posicin de los puntos nuevos que es lo que nos interesa.
Despus de obtener una tabla con los valores de la seal SINC que se necesitarn en la interpolacin
se debe realizar sta. Para ello se han implementado dos algoritmos ms: el primero realiza el clculo
de los puntos nuevos entre dos muestras a partir de la ventana de interpolacin y los valores para la
seal SINC, y el segundo realiza la actualizacin de la ventana de interpolacin y llama al primer
algoritmo para cada muestra de la seal a interpolar que se vaya obteniendo en tiempo real. Adems,
el segundo algoritmo se encarga de completar la interpolacin de todos los puntos cuando la seal a
interpolar tiene un nmero de muestras finito que adems se repite en el tiempo.
El primer algoritmo se presenta a continuacin implementado en la siguiente funcin en C. Esta
funcin slo ser utilizada por el segundo algoritmo que veremos ms adelante.
void interpolar (double *vector_valores_sinc,
double *vector_ventana, int tam_ventana,
double *vector_puntos_nuevos,
int num_puntos_nuevos)
{
double auxiliar;
int i, j, indice, num_muestras;
Pgina
16
DISCA
num_muestras = tam_ventana/2;
double *vector_valores_sinc: se especifica la direccin del vector donde se encuentran los valores
para la funcin SINC necesarios en el clculo de los nuevos puntos.
double *vector_ventana: se especifica la direccin de la ventana de interpolacin donde se
encuentran las muestras que se deben utilizar para el clculo de los nuevos puntos.
int tam_ventana: se especifica el tamao de la ventana de interpolacin, es decir, el nmero de
muestras que se considern en el clculo de cada punto nuevo.
double *vector_puntos_nuevos: se especifica la direccin del vector donde se almacenarn los
puntos nuevos calculados.
int num_puntos_nuevos: se especifica el nmero de puntos nuevos a calcular. El tamao del
vector para almacenar los puntos nuevos tiene que ser igual o mayor que num_puntos_nuevos.
El algoritmo consta principalmente de dos bucles: el primer bucle tiene un nmero de iteraciones igual
al nmero de puntos nuevos a calcular, de manera que en cada iteracin de este bucle se calcular un
punto nuevo, y dentro de este primero se encuentra el segundo bucle con un nmero de iteraciones
igual a la mitad del tamao de la ventana de interpolacin. De esta manera, para el clculo de cada
punto nuevo se ejecuta el segundo bucle donde lo que se realizan son los productos de los valores que
la seales SINC tienen en la posicin del punto nuevo a calcular con las muestras correspondientes de
la ventana de interpolacin y la suma de todos estos productos, obtenindose, como se explic
anteriormente, el nuevo punto. La suma de todos los productos no se realiza al final sino que stos se
van sumando a la vez que van obtenindose. En cada iteracin del segundo bucle se realizan dos del
total de productos necesarios correspondientes a dos muestras de la ventana de interpolacin, por ello
el nmero de iteraciones es la mitad del tamao de la ventana de interpolacin. Cada muestra de esta
ventana tiene que multiplicarse por el valor que su seal SINC tenga en la posicin del punto nuevo
que toque calcular. Lo que se hace es que en cada iteracin del segundo bucle se toma una muestra
anterior y la simtrica posterior de la ventana, entendindose como muestra simtrica aquella que se
encuentra en la misma posicin pero opuesta dentro de la ventana y tomndose como centro de la
ventana la mitad de sta, es decir, en la primera iteracin se toma la primera muestra anterior de la
ventana (que es la muestra con posicin: num_muestras-1 siendo num_muestras la mitad
del tamao de la ventana de interpolacin) y la primera muestra posterior de la ventana (que es la
muestra con posicin: num_muestras siendo num_muestras la mitad del tamao de la
ventana de interpolacin), en la segunda iteracin se toma la segunda muestra anterior (con posicin:
UPV
Pgina
17
Pgina
18
DISCA
vector_ventana[i] = vector_ventana[i+1];
vector_ventana[tam_ventana-1] = punto;
for (i=0; i<=num_puntos_nuevos; i++)
vector_puntos_a_obtener[i] = 0.0;
if (numero_punto >= (tam_ventana-1))
{
vector_puntos_a_obtener[0] = vector_ventana[num_muestras-1];
interpolar(vector_valores_sinc, vector_ventana, tam_ventana,
&(vector_puntos_a_obtener[1]), num_puntos_nuevos);
};
if (senal_se_repite == 1)
{
pos_punto = (num_puntos_nuevos+1)*numero_punto;
vector_senal_interpolada[pos_punto] = punto;
if (numero_punto >= (tam_ventana-1))
{
distancia = (num_puntos_nuevos+1)*num_muestras;
pos_puntos_a_obtener = pos_punto - distancia;
for (i=1; i<=num_puntos_nuevos; i++)
vector_senal_interpolada[pos_puntos_a_obtener+i] =
vector_puntos_a_obtener[i];
if (numero_punto == (max_numero_puntos-1))
{
ultima_posicion =
(max_numero_puntos*(num_puntos_nuevos+1))-1;
pos_punto_fin = (tam_ventana-2)*(num_puntos_nuevos+1);
for (pos_punto=0; pos_punto<=pos_punto_fin;
pos_punto=pos_punto+(num_puntos_nuevos+1))
{
for (i=0; i<(tam_ventana-1); i++)
vector_ventana[i] = vector_ventana[i+1];
vector_ventana[tam_ventana-1] =
vector_senal_interpolada[pos_punto];
pos_puntos_a_obtener = pos_punto - distancia;
//Como vector_senal_interpolada es una cola cclica:
if (pos_puntos_a_obtener<0)
pos_puntos_a_obtener = ultima_posicion +
pos_puntos_a_obtener + 1;
interpolar(vector_valores_sinc, vector_ventana,
tam_ventana,
&(vector_senal_interpolada[pos_puntos_a_obtener+1]),
num_puntos_nuevos);
};
};
};
};
return true;
}
Donde el significado de los parmetros es el siguiente:
UPV
Pgina
19
20
DISCA
exactamente esto, genera mediante la funcin interpolar los puntos nuevos que faltan por
obtener. Para ello va actualizando la ventana de interpolacin con las nuevas muestras que sern otra
vez las primeras de todas (el nmero de muestras a utilizar depende del tamao de la ventana) y llama
para cada nueva muestra a la funcin interpolar obtenindose nuevos puntos que se almacenan
en las posiciones reservadas correspondientes del vector: vector_senal_interpolada.
Figura 3
<math.h>
<stdio.h>
<string.h>
<stdlib.h>
"Func.h"
UPV
Pgina
21
#define MAX_NUM_MUESTRAS 80
#define MAX_NUM_PUNTOS_NUEVOS 40
//MAX_TAM_VENTANA/2;
//Puntos nuevos por cada punto de
//la seal original.
double vector_senal_interpolada[MAX_NUM_VALORES];
double
vector_valores_sinc[(MAX_NUM_MUESTRAS*MAX_NUM_PUNTOS_NUEVOS)];
double vector_ventana[MAX_NUM_MUESTRAS*2];
double vector_puntos_a_obtener[(MAX_NUM_PUNTOS_NUEVOS+1)];
//****************************************************************
//************** CARACTERSTICAS CONFIGURABLES *******************
#define tam_senal_a_diezmar 1024
#define puntos_por_periodo_senal_a_diezmar 32 //Entre 0 y 2PI (el
//periodo) tienen que haber al menos dos valores para que la seal
//est bien muestreada. Luego se va a hacer un diezmado de la
//seal que se genere para posteriormente interpolar los valores y
//comprobar que coinciden con los originales. Este diezmado hay
//que tenerlo en cuenta. Ya que si ahora se obtienen 8 puntos por
//periodo y luego se hace un diezmado obteniendo un punto cada
//4, la seal resultante tedra dos puntos por periodo que se
//corresponde con la mnima frecuencia de muestreo. No estara
//mal pero es conveniente que la seal a interpolar haya sido
//muestreada a una frecuencia superior a la de Nyquist para
//obtener un error no significativo mediante la interpolacin
//senoidal (basada en la funcin SINC) que es la utilizada en las
//pruebas.
#define amplitud_senal_a_diezmar 1000
#define diezmado 8
22
DISCA
}
main()
{
double senal_a_diezmar[tam_senal_a_diezmar];
double senal_a_interpolar[tam_senal_a_interpolar];
double error, media_error, varianza_error,
desviacion_tipica_error;
//double media_porcent_error, varianza_porcent_error,
//
desviacion_tipica_porcent_error;
int tam_ventana, i, j, tam_final;
char nom_fichero[20];
char buffer[10];
FILE *fptr1, *fptr2;
int senal_continua = 0;
int ficheros_independientes = 1;
//Se genera la seal en la que luego se har un diezmado y
//seguidamente la interpolacin.
if (senal_continua == 1) for (i=0; i<tam_senal_a_diezmar; i++)
senal_a_diezmar[i]=amplitud_senal_a_diezmar;
else gen_seno(senal_a_diezmar, tam_senal_a_diezmar,
puntos_por_periodo_senal_a_diezmar,
amplitud_senal_a_diezmar);
//Se realiza el diezmado:
j=0;
for (i=0; i<tam_senal_a_interpolar; i++)
{
senal_a_interpolar[i] = senal_a_diezmar[j];
j = j+diezmado;
};
fptr1=fopen("results.txt","a");
fprintf(fptr1,"\n*********************************************");
fprintf(fptr1,"\n**** SENO VALORES: entre -1000 y +1000 ****");
fprintf(fptr1,"\n*******************************************\n");
fclose(fptr1);
for(tam_ventana=2; tam_ventana<=ultimo_tam_ventana;
tam_ventana=tam_ventana+2)
{
//Se obtienen los valores necesarios de la funcin SINC:
gen_valores_sinc (tam_ventana, num_puntos_nuevos,
vector_valores_sinc);
//Se realiza la interpolacin:
for (i=0; i<tam_senal_a_interpolar; i++)
{
gen_nuevos_puntos (senal_a_interpolar[i],
i, // >=0
num_puntos_nuevos,
vector_ventana,
tam_ventana,
vector_valores_sinc,
vector_puntos_a_obtener, // Tamao >=
UPV
Pgina
23
//num_puntos_nuevos+1
senal_se_repite, // Si la seal no se
//repite, tam_senal_a_interpolar y
//vector_senal_interpolada se ignoran.
tam_senal_a_interpolar,
vector_senal_interpolada);
};
tam_final = tam_senal_a_interpolar*(num_puntos_nuevos+1);
//tam_final es igual a tam_senal_a_diezmar
//Se generan los resultados y estadsticas:
media_error = 0.0;
for(i=0;i<tam_final;i++)
{
if ((i%diezmado) != 0)
{
error = senal_a_diezmar[i] - vector_senal_interpolada[i];
media_error = media_error + error;
};
};
media_error = media_error/(tam_final-tam_senal_a_interpolar);
varianza_error = 0.0;
for(i=0;i<tam_final;i++)
{
if ((i%diezmado) != 0)
{
error = senal_a_diezmar[i] - vector_senal_interpolada[i];
varianza_error = varianza_error + pow((error-media_error),2);
};
};
varianza_error=varianza_error/(tam_final-tam_senal_a_interpolar-1);
desviacion_tipica_error = sqrt(varianza_error);
nom_fichero[0] = 0;
strcpy(nom_fichero, "RESULT_" );
itoa(tam_ventana, buffer, 10 );
strcat(nom_fichero, buffer);
strcat(nom_fichero, "V.txt");
fptr1=fopen("results.txt","a");
fprintf(fptr1,"\n/*************** %s ***************/",
nom_fichero);
fprintf(fptr1,"\nNmero puntos seal original: %i",
tam_senal_a_diezmar);
fprintf(fptr1,"\nDiezmado de la seal original: %i", diezmado);
fprintf(fptr1,"\nNmero puntos seal a interpolar: %i",
tam_senal_a_interpolar);
fprintf(fptr1,"\nTamao ventana interpolacin: %i", tam_ventana);
fprintf(fptr1,"\nPuntos a obtener entre dos muestras: %i",
num_puntos_nuevos);
fprintf(fptr1,"\nTamao final seal interpolada: %i", tam_final);
fprintf(fptr1,"\n_______________ RESULTADOS _______________");
fprintf(fptr1,"\nMEDIA del ERROR: %8.8f", media_error);
fprintf(fptr1,"\nDESVIACIN TPICA del error: %8.8f",
desviacion_tipica_error);
Pgina
24
DISCA
Pgina
25
El programa, en primer lugar, genera una seal senoidal muestreada mediante la funcin
gen_seno. Esta funcin tiene como parmetros la direccin de un vector donde se almacenarn
los puntos que se generen para que el programa principal pueda disponer de ellos, el nmero total de
puntos a obtener de la funcin seno, los puntos a obtener por periodo de dicha funcin y la amplitud
del seno.
Una vez generada la seal senoidal el programa realiza un diezmado de sta para posteriormente
proceder a interpolar mediante el uso de los algoritmos antes descritos. De esta manera se podrn
comparar los resultados obtenidos en la interpolacin con los valores correctos.
En el diezmado se indica el nmero de puntos a eliminar por cada punto, despus, en la interpolacin,
habr que indicar el mismo nmero de puntos a obtener por cada punto para as poder realizar
posteriormente las comparaciones. En una interpolacin ideal, los valores de los puntos que se
interpolen deberan ser iguales a los valores de los puntos que se eliminaron en el diezmado.
Los algoritmos implementados realizan la interpolacin en tiempo real, lo que quiere decir que a
medida que se van obteniendo las muestras se van generando nuevos puntos. No hace falta tener toda
la seal muestreada para realizar la interpolacin, como suceda cuando usbamos la FFT. Para
simular este comportamiento, el programa ejemplo implementado proporciona de uno en uno,
mediante un bucle, los puntos de la seal seno (una vez diezmada) a la funcin gen_nuevos_puntos.
El programa supone que los puntos muestreados de la seal a interpolar se corresponden con un
periodo completo de la seal real, repitindose sta en el tiempo. De manera que cuando se obtiene la
seal seno se ha de procurar que los puntos muestreados correspondan a periodos completos de la
seal seno para que la suposicin de la que parte el programa sea correcta. Por ejemplo, si deseamos
interpolar una seal seno muestreada con 8 muestras por periodo, el nmero de muestras totales de
esta seal tendr que ser mltiplo de 8 para disponer de periodos completos de la seal. De esta
manera, cuando el programa supone toda la seal muestreada como un solo periodo, el programa
supone de forma acertada que despus del ltimo punto muestreado comienza otra vez el primero
(repitindose en el tiempo toda la seal muestreada).
Como primer caso, para probar el correcto funcionamiento de los algoritmos, vamos a suponer que
tenemos 128 puntos correspondientes al muestreo de una seal continua de valor 1000. A partir de
estos puntos se desean interpolar nuevos puntos de la seal hasta obtener un total de 1024 puntos (7
puntos nuevos por cada punto muestreado). Es obvio que todos los puntos nuevos que se obtengan
deberan valer 1000 por lo que esta prueba permitir obtener una primera valoracin del
funcionamiento y precisin de los algoritmos. En este caso el programa de prueba se configura
(senal_continua = 1) para que todos los puntos que proporciona a la funcin gen_nuevos_puntos
tengan el mismo valor (no se genera la seal seno antes comentada puesto que sta no se necesita).
Realizamos la interpolacin con diferentes tamaos de la ventana de interpolacin. La primera
ejecucin corresponde a un tamao de ventana igual a 2, es decir, para la obtencin de un nuevo punto
slo se tienen en cuenta las muestras anterior y posterior a ste. En dicha interpolacin se obtiene una
media del error igual a 201,56908400 con una desviacin tpica igual a 61,25119165.
En la segunda ejecucin se aumenta el tamao de la ventana de interpolacin a 4 y se obtiene una
media del error igual a 109,56770064 con una desviacin tpica de 35,08369094. Se observa que el
error cometido, como era de esperar, es menor.
Pasemos ahora a realizar un estudio con ms detalle de la interpolacin de diferentes seales donde se
vara el tamao de la ventana de interpolacin desde 2 hasta 100 muestras. Para ello se han realizado
varias pruebas con seales continuas y senoidales obtenindose una serie de grficas donde se
presenta la media y desviacin tpica del error de interpolacin en funcin del tamao de la ventana de
interpolacin. En el caso de las seales continuas se han realizado pruebas con seales de distintos
valores obtenindose como resultado que la media y desviacin tpica del error de interpolacin son
linealmente proporcionales al valor de la seal. Tambin se ha hecho lo mismo con seales senoidales
Pgina
26
DISCA
de diferente amplitud en donde se concluye que la media y desviacin tpica del error de interpolacin
son linealmente proporcionales a la amplitud y no al valor mximo o mnimo que puedan tener las
seales senoidales. Debido a esto, en todas la grficas se expresarn la media y desviacin tpica en
forma de tanto por cien del valor o amplitud de la seal. As, dichos resultados, pueden extenderse y
aplicarse a seales con diferentes valores y amplitudes.
Las seales a interpolar estn formadas por 128 muestras que se repiten en el tiempo donde (en el caso
de las seales senoidales) cada 4 muestras pertenecen a un periodo diferente. A partir de estos puntos
se desean interpolar nuevos puntos de la seal hasta obtener un total de 1024 puntos (7 puntos nuevos
por cada punto muestreado).
En todas las grficas el tamao de la ventana de interpolacin se representa en el eje de las abscisas
variando su valor desde 2 hasta 100 con incrementos de 2 hasta un tamao igual a 40 y a partir de ste
con incrementos de 10.
De momento continuemos con las seales continuas y veamos que sucede cuando seguimos
aumentando el tamao de la ventana de interpolacin:
Desviacin Tpica
% Valor de la Seal
15,00000
10,00000
5,00000
0,00000
-5,00000
-10,00000
-15,00000
-20,00000
-25,00000
2
10
14
18
22
26
30
34
38
50
70
90
Grfica 1
En la grfica 1 se puede observar cmo la media del error cometido disminuye a medida que aumenta
la ventana de interpolacin alternndose valores positivos y negativos para sta con cada incremento
del tamao de dicha ventana. La media del error converge a cero oscilando sobre dicho valor.
Cuando el nmero de muestras anteriores y el de muestras posteriores son par, el error cometido es
siempre positivo, mientras que cuando el nmero de stas es impar es siempre negativo. Esto es
lgico si se observan los valores de la funcin SINC, al considerar slo dos muestras se obtiene un
error negativo ya que los valores de la seal SINC son positivos, al considerar dos muestras ms los
valores de la seal SINC son negativos y restamos un valor al anterior obteniendo un error positivo
aunque en valor absoluto ms pequeo que antes y as sucesivamente.
UPV
Pgina
27
Se puede concluir que, para seales positivas, cuando la mitad del tamao de la ventana de
interpolacin es impar el error es negativo y cuando es par el error es positivo. En el caso de que el
valor de la funcin continua a interpolar fuera negativo, el error cometido hubiera sido positivo para
un tamao impar y negativo para un tamao par.
En cuanto a la desviacin tpica del error se observa que converge a cero a medida que aumenta el
tamao de la ventana de interpolacin pero en este caso sin oscilar (ver tambin la grfica 2).
% del Valor de la
Seal
Desviacin Tpica
7,00000
6,00000
5,00000
4,00000
3,00000
2,00000
1,00000
0,00000
2
10
14
18
22
26
30
34
38
50
70
90
Grfica 2
Como resultado de esta prueba podemos concluir que los algoritmos de interpolacin se comportan,
hasta el momento, de la forma prevista.
Veamos que sucede cuando la seal a interpolar no es continua sino que se corresponde a una seal
senoidal. Inicialmente consideraremos los valores de la seal seno siempre positivos.
En la grfica 3 podemos observar como, al igual que suceda con las seales continuas, a medida que
aumenta el tamao de la ventana de interpolacin la media del error disminuye tendiendo a cero y lo
hace oscilando sobre dicho valor.
Igualmente se observa que cuando la mitad del tamao de la ventana de interpolacin es impar el error
es negativo y cuando es par el error es positivo, esto sucedera al contrario si los valores del seno
fueran todos negativos.
En la grfica 4 se aprecia que la media obtenida es idntica a la de las seales continuas.
Pgina
28
DISCA
Media
Desviacin Tpica
15,00000
10,00000
5,00000
0,00000
-5,00000
-10,00000
-15,00000
-20,00000
-25,00000
2
10
14
18
22
26
30
34
38
50
70
90
Grfica 3
15,00000
% Valor o Amplitud
10,00000
5,00000
0,00000
-5,00000
-10,00000
-15,00000
-20,00000
-25,00000
2
10
14
18
22
26
30
34
38
50
70
90
Grfica 4
Respecto a la desviacin tpica puede verse (grficas 3 y 5) que no disminuye con el incremento del
tamao de la ventana de interpolacin de la misma forma en que lo haca con seales continuas. En
este caso la desviacin tpica tambin tiende a cero pero no de forma continua, sino que sigue una
trayectoria decreciente con intervalos ascendentes que se repiten de forma peridica, estos intervalos
son cada vez de menor amplitud.
UPV
Pgina
29
Desviacin Tpica
14,00000
12,00000
10,00000
8,00000
6,00000
4,00000
2,00000
0,00000
2
10
14
18
22
26
30
34
38
50
70
90
Grfica 5
En la grfica 6 pueden compararse las desviaciones tpicas obtenidas para las seales continuas y
senoidales positivas.
% Valor o Amplitud de la
Seal
10 14 18 22 26 30 34 38 50 70 90
Tamao Ventana Interpolacin
Grfica 6
Pgina
30
DISCA
Se observa que existen valores para el tamao de la ventana de interpolacin donde la el valor de la
desviacin tpica del error de interpolacin en las seales continuas y senoidales coincide.
Ahora consideraremos la seal seno simtrica al valor cero, con valores positivos y negativos. En este
caso para la obtencin de un nuevo punto pueden tenerse en cuenta muestras tanto positivas como
negativas.
Media
Desviacin Tpica
12,00000
10,00000
8,00000
6,00000
4,00000
2,00000
0,00000
2
10
14
18
22
26
30
34
38
50
70
90
Grfica 7
Lo primero que hay que resaltar en la grfica 7 es que la media del error de interpolacin es cero para
todos los tamaos de ventana de interpolacin. Esto es lgico debido a que ahora tenemos una seal
senoidal pura con muestras positivas y negativas, as que los errores positivos que se cometen al
obtener unos puntos se compensan con los errores negativos al obtener otros, de manera que al final la
media del error es cero.
Hasta ahora hemos visto que las medias de los errores de interpolacin para las seales continuas y
senoidales con valores siempre del mismo signo coinciden mientras que la media para las senoidales
puras es cero. Si consideramos para una seal cualquiera que el caso mejor (cuando se obtiene menos
error de interpolacin) es cuando la seal es senoidal pura y que el caso peor es cuando la seal es
continua, podemos concluir que al interpolar una seal cometeremos un error con una media
comprendida entre 0 (si la seal es senoidal pura) y el valor de la media del error que se cometera si
se interpolase una seal continua con un valor igual a la amplitud de la seal a interpolar, dependiendo
este error del tamao de la ventana de interpolacin.
A continuacin vamos a profundizar en el estudio del promedio de las desviaciones de los errores
respecto a su media, lo haremos mediante la desviacin tpica.
En el caso de las seales senoidales puras (ver grfica 7) se observa que la desviacin tpica
disminuye hacia cero a medida que aumenta el tamao de la ventana de interpolacin pero lo hace
siguiendo una trayectoria semejante a la trayectoria seguida por la desviacin tpica para la seales
senoidales positivas. Observemos la grfica 8 donde se comparan estas desviaciones.
UPV
Pgina
31
% Valor o Amplitud
14,00000
12,00000
10,00000
8,00000
6,00000
4,00000
2,00000
0,00000
2
6 10 14 18 22 26 30 34 38 50 70 90
Desviacin
Tpica en
Seales
Senoidales
Positivas
Desviacin
Tpica en
Seales
Senoidales
Puras
Desviacin
Tpica en
Seales
Continuas
Grfica 8
En la grfica 8 pueden verse varias cosas. Se observa que en torno a la desviacin tpica del error de
interpolacin en las seales continuas se sitan las desviaciones tpicas para las seales senoidales.
Como ya se coment, para las seales senoidales la desviacin tpica sigue una trayectoria decreciente
con intervalos ascendientes que se repiten de forma peridica y con una amplitud cada vez menor. En
esta grfica puede verse que cuando las seales senoidales son positivas estos intervalos tienen
siempre valores superiores a los valores de la trayectoria de la desviacin tpica para las seales
continuas, mientras que cuando las seales son senoidales puras se observa que la trayectoria de la
desviacin para las seales continuas pasa por la mitad de estos intervalos ascendentes. Puede
concluirse que la desviacin tpica para las seales continuas marca la media de las desviaciones
tpicas que se sufrirn con seales senoidales.
En la grfica 8 tambin podemos apreciar que para las seales senoidales los intervalos ascendentes
antes comentados se repiten cada cuatro aumentos de la ventana de interpolacin. Si seguimos la
trayectoria de la desviacin tpica primero se produce un decremento de sta en los dos primeros
tamaos de la ventana de interpolacin (2 y 4 muestras), seguidamente se produce un aumento de la
desviacin y sta no vuelve a tener un valor menor al mnimo obtenido hasta cuatro aumentos
posteriores de la ventana de interpolacin (hasta una ventana de 12 muestras) y entonces vuelve a
repetirse un aumento de la desviacin tpica de manera que, aunque este aumento es de menor
amplitud que el anterior, la desviacin no vuelve a rebasar el valor mnimo obtenido hasta los
siguientes cuatro aumentos de la ventana (hasta 20 muestras), y as sucesivamente la desviacin tpica
va decreciendo convergiendo a cero. De esta forma tenemos que los tamaos de la ventana de
interpolacin en los que se han ido obteniendo desviaciones tpicas menores son: 4, 12, 20, 28, 36,
etc., es decir, que a partir de un tamao de la ventana de interpolacin igual a 4 muestras se va
mejorando la desviacin tpica del error de interpolacin cada aumento de dicha ventana con 8
muestras ms.
Veamos ahora por qu se produce este comportamiento en la desviacin tpica del error de
interpolacin. Para ello se han realizado pruebas donde la seal senoidal a interpolar de 128 muestras
tiene un nmero de muestras por periodo diferente a 4 (hasta ahora todas las seales utilizadas tenan
4 muestras por periodo).
Si la seal a interpolar est formada por 8 muestras por periodo podemos observar la trayectoria que
presenta la desviacin tpica del error de interpolacin respecto al tamao de la ventana de
interpolacin en la grfica 9.
Pgina
32
DISCA
% Amplitud Seno
10
14
18
22
26
30
34
38
50
70
90
Grfica 9
En este caso tenemos que los tamaos de la ventana de interpolacin en los que se obtienen
desviaciones tpicas menores son: 8, 24, 40, 56, etc., es decir, que a partir de un tamao de la ventana
de interpolacin igual a 8 muestras se va mejorando la desviacin tpica del error de interpolacin
cada aumento de dicha ventana con 16 muestras ms.
Puede concluirse que para realizar una interpolacin de una seal cualquiera con N muestras por
periodo, el mejor tamao para la ventana de interpolacin es N muestras y a partir de ste cada 2N
muestras ms.
Veamos si sucede lo mismo cuando la seal a interpolar est formada por 2 muestras por periodo.
10,00000
8,00000
6,00000
4,00000
2,00000
0,00000
2
10
14
18
22
26
30
34
38
50
70
90
Grfica 10
UPV
Pgina
33
En la grfica 10 se observa que los resultados de la interpolacin de la seal senoidal con 2 muestras
por periodo se ajustan a las conclusiones obtenidas. En este caso los mejores tamaos para la ventana
de interpolacin son: 2, 6, 10, 14, 18, etc.
Comparemos todos los resultados obtenidos (ver grfica 11).
% Amplitud Seno
10
14
18
22
26
30
34
38
50
70
90
Grfica 11
El error que se comete al interpolar depende del tamao de la ventana de interpolacin y de la relacin
de ste con el nmero de muestras por periodo de que dispone la seal a interpolar.
El tamao ms pequeo de la ventana de interpolacin para obtener un error pequeo es igual al
nmero de muestras por periodo de la seal a interpolar, de manera que la ventana utilizada para
obtener nuevos puntos estar formada exactamente por las muestras correspondientes a un periodo
completo de la seal. El error obtenido se puede reducir an ms incrementando dicho tamao en un
nmero de muestras igual al doble del nmero de muestras por periodo de la seal, as se aumenta la
ventana con un nmero de muestras anteriores correspondientes a un periodo completo y un nmero
de muestras posteriores correspondientes tambin a otro periodo completo.
Tambin comentar que al interpolar una seal cuantos ms puntos o muestras por periodo se tengan de
dicha seal a interpolar menos error se cometer. Esto es lgico, sin embargo, en el caso en que la
seal sea senoidal pura esto no ocurre, ya que con slo dos muestras por periodo (que es lo mnimo
permitido, la frecuencia de Nyquist) obtemos errores semejantes a los que se obtienen con un mayor
nmero de muestras por periodo (ver grfica 11). Esto es debido a que la interpolacin basada en la
funcin SINC tiende a interpolar la seal como senoidal pura, por eso, en el caso en que la seal sea
senoidal pura, con slo dos muestras por periodo ya se obtiene un error mnimo. Sin embargo, si la
seal a interpolar no fuera senoidal no ocurrira lo mismo, en este caso cuantas ms muestras por
periodo se tuvieran menor sera el error. Como el error cometido siempre tiende a reconstruir la seal
como senoidal pura, cuantas menos muestras por periodo se tengan de la seal a interpolar ms se
parecer la seal interpolada resultante a una senoidal pura y ms error se cometer en el caso de que
dicha seal a interpolar no se parezca a una senoidal pura.
Pgina
34
DISCA
9. Conclusiones
En este trabajo se ha desarrollado:
El error de interpolacin cometido siempre tiende a reconstruir la seal como senoidal pura.
El error de interpolacin es menor cuantas ms muestras por periodo se obtengan de la seal a
interpolar.
El error de interpolacin depende del tamao de la ventana de interpolacin. Generalmente
cuanto mayor es la ventana menor es el error. El objetivo es obtener un error aceptable con una
ventana lo ms pequea posible. El estudio realizado concluye que el mejor tamao de la ventana
de interpolacin que garantiza un error pequeo es igual al nmero de muestreas por periodo que
se obtengan de la seal a interpolar. Se pueden conseguir errores menores incrementando el
tamao de la ventana un nmero de muestras igual al doble de muestras que se obtengan por
periodo.
Para un tamao de ventana determinado, al interpolar una seal cometeremos un error con una
media comprendida entre 0 (si la seal es senoidal pura) y el valor de la media del error que se
cometera si se interpolase una seal continua con un valor igual a la amplitud de la seal a
interpolar.
Estas conclusiones son el resultado de un primer estudio sobre la interpolacin de seales senoidales,
en trabajos futuros se debe extender el estudio a otros tipos de seales para as poder demostrar el
carcter general de dichas conclusiones o bien aportar nuevas caractersticas.
10. Bibliografa
[Fourier]:
[DSP 1]:
UPV
Pgina
35
Pgina
[FFT 2]:
[DSP 2]:
36
DISCA