Transformada Discreta del Seno

Anuncio
DST
TRANSFORMADA DISCRETA DEL SENO
Gustavo Abel Monteagudo Becerra
La transformada discreta del seno (DST) de una secuencia x[n] se define:
N 1
Cu    au n  xn
n 0
au n 
2
 n  1u  1 
 sen

N 1
N 1

Este es el listado de un programa en MATLAB que calcula la DST de cualquier
secuencia x[n] de tamaño N (se ha aplicado estrictamente la definición de DST):
function y=dstunid(x)
% Esta función calcula la transformada discreta del seno de una
secuencia.
% DST unidimensional.
N=length(x);
for u=1:N,
suma=0;
for n=1:N,
suma=suma+(x(n)*sin((n*u*pi)/(N+1)));
end
y(u)=round((sqrt(2/(N+1)))*suma);
end
Teniendo en cuenta que el vector de coeficientes se obtiene multiplicando el vector
de entrada por la matriz de transformación de la DST (C=A X), la matriz de transformación
será de tamaño N x N, siendo N el tamaño de x[n].
A partir de la definición anterior se puede obtener la matriz de transformación de la
DST (A) para cualquier N. Un programa que realiza esta función es:
function A=matriz_transformacion_DSTu(N)
% Esta función calcula la matriz de transformación de la transformada
% discreta del seno unidimensional, para cualquier secuencia x(n), en
% función de su tamaño N.
A=zeros(N,N);
for u=1:N,
for n=1:N,
A(u,n)=sin((n*u*pi)/(N+1));
end
end
A=(sqrt(2/(N+1)))*A;
Los vectores base de esta matriz de transformación para N=8 se calculan y dibujan
en el siguiente programa:
function vectores_base_DSTu()
% Esta función calcula y dibuja los vectores base de la DST
unidimensional
% para tamaño N=8 de la secuencia de entrada.
N=8;
A=zeros(N,N);
for u=1:N,
for n=1:N,
A(u,n)=sin((n*u*pi)/(N+1));
end
end
A=(sqrt(2/(N+1)))*A;
figure(1),
subplot(4,2,1),
subplot(4,2,2),
subplot(4,2,3),
subplot(4,2,4),
subplot(4,2,5),
subplot(4,2,6),
subplot(4,2,7),
subplot(4,2,8),
bar(A(1,:));
bar(A(2,:));
bar(A(3,:));
bar(A(4,:));
bar(A(5,:));
bar(A(6,:));
bar(A(7,:));
bar(A(8,:));
axis
axis
axis
axis
axis
axis
axis
axis
([0
([0
([0
([0
([0
([0
([0
([0
9
9
9
9
9
9
9
9
-1
-1
-1
-1
-1
-1
-1
-1
1]);
1]);
1]);
1]);
1]);
1]);
1]);
1]);
En la página siguiente se presentan los resultados de esta función, los ocho
vectores base de la DST unidimensional (N=8).
La función anterior que calcula la DST está implementada siguiendo estrictamente
la definición. Se puede realizar una función que haga lo mismo pero a través de la matriz
de transformación, la ventaja que se obtiene de esta forma es reducir el tiempo de
cómputo. El listado de este programa es:
function y=DSTuMatricial(x)
% Esta función calcula la DST de la secuencia x(n) a través de la
% matriz de transformación.
N=length(x);
A=zeros(N,N);
for u=1:N,
for n=1:N,
A(u,n)=sin((n*u*pi)/(N+1));
end
end
A=(sqrt(2/(N+1)))*A;
y=x*A;
Ahora se van a realizar los mismos cálculos para transformada bidimensional. La
definición de DST bidimensional es:
M 1 N 1
Ck , l   
m 0
ak ,l m, n 
 a m, n xm, n
n 0
k ,l
2
 m  1k  1 
 n  1l  1 
 sen
 sen


M 1
N 1
M  1N  1



Este es el listado de un programa en MATLAB que calcula la DST de cualquier
imagen x[m,n] de tamaño M x N (se ha aplicado estrictamente la definición de DST):
function y=dstbid(x)
% function y=dstbid(x)
% Esta función devuelve la DST de la matriz x, habiéndola calculado a
% través de la definición de DST bidimensional.
[M,N]=size(x);
for k=1:M
for l=1:N
s2=0;
for m=1:M
s1=0;
for n=1:N
s1=x(m,n)*sin((n*l*pi)/(N+1))+s1;
end
s2=sin((m*k*pi)/(M+1))*s1+s2;
end
y(k,l)=round(2/(sqrt((M+1)*(N+1)))*s2);
end
end
Como en el caso unidimensional, también se puede calcular la matriz de
transformación para bidimensional. En unidimensional se obtiene una matriz de N
vectores base con N elementos cada uno, siendo N el tamaño de la secuencia de entrada.
En bidimensional tendremos M x N imagenes base de M x N elementos cada una.
Un programa capaz de calcular todas las funciones base para todo M y todo N es el que
aparece a continuación:
function A=matriz_transformacion_DST(M,N)
% function A=matriz_transformacion_DST(M,N)
% Esta función devuelve la DST de la matriz x, habiéndola calculado a
% través de la definición de DST bidimensional.
A=zeros(M,N,M,N);
for k=1:M
for l=1:N
for m=1:M
for n=1:N
A(k,l,m,n)=sin((m*k*pi)/(M+1))*sin((n*l*pi)/(N+1));
end
end
end
end
A=(2/(sqrt((M+1)*(N+1))))*A;
Esta función tiene el inconveniente de que genera una matriz de cuatro
dimensiones, pero esta es la única forma de representar numéricamente todas las
imagenes base y todos los elementos que las componen. Gráficamente, las imagenes
base se pueden ver de forma más sencilla, ya que en el papel (2 dimensiones) se puede
representar la posición que ocupa la imagen base (k,l), y en cada imagen se puede
representar la posición que ocupa cada pixel en la imagen (m,n).
El siguiente programa realiza la presentación de todas las imagenes base en una
sola imagen, para M=8, N=8.
function imagenes_base=imagenes_base_DST()
% function imagenes_base_DST()
% Esta función calcula y dibuja las imagenes base de la DST para tamaño
% M=8, N=8 de la iamgen de entrada.
M=8; N=8;
A=zeros(M,N,M,N);
for k=1:M
for l=1:N
for m=1:M
for n=1:N
A(k,l,m,n)=sin((m*k*pi)/(M+1))*sin((n*l*pi)/(N+1));
end
end
end
end
A=abs((2/(sqrt((M+1)*(N+1))))*A);
imagenes_base=zeros(64,64);
for k=1:M
for l=1:N
auxiliar=A(k,l,:,:);
for m=1:M
for n=1:N
imagenes_base((M*(k-1))+m,(N*(l-1))+n)=auxiliar(1,1,m,n);
end
end
end
end
figure(1),
imshow(imagenes_base,[])
La imagen calculada por este programa tendrá tamaño 64 x 64, que es el resultado
de poner todas las imagenes base seguidas en horizontal y vertical. Para conseguir un
tamaño mayor basta con ampliar la imagen obtenida mediante repetición de muestras.
Al igual que se hizo para el caso unidimensional, también se puede implementar
un programa que calcule la DST bidimensional a través de la matriz de transformación.
Sin embargo, la DST tiene la propiedad de separabilidad, lo que hace aún más sencillo el
cálculo. La matriz de transformación se puede descomponer en :
a k ,l m, n 
2
 a m  bl n
M  1N  1 k
 m  1k  1 
 n  1l  1 
a k m  sen
, bl n  sen


M 1
N 1




En este caso, la matriz de coeficientes se calcula de la forma siguiente:
Ck , l  
M 1
2

M  1N  1 m0
N 1
 a m b n xm, n
n 0
k
l
N 1
W m, l    bl n  xm, n
n 0
C k , l  
M 1
2
  a k m  W m, l 
M  1N  1 m0
C  BT  X  A;
A  B  C  AT  X  A
Con esta propiedad no es necesario calcular la matriz de transformación de la DST
bidimensional para obtener la matriz de coeficientes a partir de la imagen de entrada, sólo
se necesita calcular la matriz de la transformación unidimensional y multiplicarla por su
transpuesta, ya que A=B.
El siguiente programa calcula la DST de una imagen siguiendo este razonamiento,
para que funcione correctamente también se exige M=N, ya que sólo así A=B, de lo
contrario habría que calcular A y B por separado y multiplicar la primera por la transpuesta
de la segunda. Por lo tanto, este programa sólo vale para imágenes cuadradas.
function y=dstbid2(x)
% function A=matriz_transformacion_DST(M,N)
% Esta función devuelve la DST de la matriz x, habiéndola calculado a
% través de la definición de DST bidimensional.
[M N]=size(x);
A=zeros(M,N);
for k=1:M
for l=1:N
A(k,l)=sin((k*l*pi)/(N+1));
end
end
A=(sqrt(2/(N+1)))*A;
y=A'*x*A;
EJEMPLO DE DST
CONCLUSIONES
La matriz de transformación de la DST es separable, por lo tanto, la transformada
se puede calcular como dos transformadas unidimensionales, pero además, si M=N, en
imágenes cuadradas, entonces A=B, con lo que el cálculo se simplifica aún más.
La matriz de transformación de la DST también es simétrica, lo que hace que su
matriz inversa sea igual a su conjugada transpuesta (unitaria), y además, igual a la misma
matriz. El hecho de que la matriz inversa de la DST sea igual a la misma matriz implica
que la DST directa es exactamente la misma que la DST inversa, o sea, que una vez
hallada la DST de una imagen, al aplicarle al resultado de nuevo la DST se obtiene la
imagen original.
La transformada discreta del seno puede aplicarse para comprimir imágenes,
aunque no es tan efectiva como la del coseno. Esta falta de eficiencia de la DST para
trabajar en compresión se debe fundamentalmente a que el componente 0,0 no lleva la
información de continua de la imagen, como sí sucede en la DCT. Esto puede apreciarse
en los vectores base de la DST, ya que como “sen 0º = 0”, si se pretendiese que el
coeficiente 0,0 llevase la información de continua éste quedaría ponderado por un factor
de 0, es decir, no se obtendría señal de salida. Es por este motivo que, en la expresión de
la DST, se ajusta el valor cuyo seno se va a calcular para que en 0,0 ya aparezca señal,
quedando el primer vector base con la forma de una función tipo seno. Este fenómeno
puede comprobarse con facilidad hallando la DST de una imagen que sólo tenga
componente continua, se observa que la transformada tiene señal en las cercanías del
coeficiente 0,0, pero no sólo en dicho coeficiente.
La DST tiene significado espectral, aunque no es exactamente la parte imaginaria
de la transformada de Fourier. Sin embargo, es posible obtener la DST a partir de la
transformada de Fourier, de aquí que exista una DST rápida basada en el algoritmo de
cálculo FFT.
Descargar