DST TRANSFORMADA DISCRETA DEL SENO Gustavo Abel Monteagudo Becerra La transformada discreta del seno (DST) de una secuencia x[n] se define: N 1 Cu au n xn n 0 au n 2 n 1u 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 Ck , l m 0 ak ,l m, n a m, n xm, n n 0 k ,l 2 m 1k 1 n 1l 1 sen sen M 1 N 1 M 1N 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 1N 1 k m 1k 1 n 1l 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: Ck , l M 1 2 M 1N 1 m0 N 1 a m b n xm, n n 0 k l N 1 W m, l bl n xm, n n 0 C k , l M 1 2 a k m W m, l M 1N 1 m0 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.