Sunday, September 16, 2012

Convolucion de Señales Discretas

En esta entrada vamos a profundizar mas en la suma de convolucion discreta. De manera general, esta se calcula como el resultado de desplazamientos de la respuesta h[n] del sistema, que se genera cuando la entrada corresponde al impulso unitario d[n].


El siguiente codigo Matlab puede utilizarse para graficar la convolucion de dos señales y permitirnos ver el comportamiento a media que se genera la salida y[n]:

clear
clc
pause on
x=[1 1 1 1 1 1];        %cualquier vector menor de 10 elementos
h=[1 1 0 0 0 1 1 2 ];   %cualquier vector menor de 10 elementos
m=length(x);
n=length(h);
%invierte el vector h
hi=fliplr(h);
k=20;
X=[x,zeros(1,40-m)];
X= X([ end-k+1:end 1:end-k ]);
H=[h,zeros(1,40-n)];
H= H([ end-k+1:end 1:end-k ]);
xn=-20:20-1;
Y=zeros(1,40);
p=zeros(1,40);
h1=subplot(3,1,1);
stem(xn,X,'MarkerFaceColor','red')
% set(h1,'YLim',[a b])
h2=subplot(3,1,2);
stem(xn,H,'MarkerFaceColor','blue')
% set(h2,'YLim',[a b])
pause(3)
h2=subplot(3,1,3);
stem(xn,Y,'MarkerFaceColor','green')
%
Hi=[hi,zeros(1,40-n)];
for i=1:40-n
    p=X.*Hi;
    Y(i+n-1)=sum(p);
    subplot(3,1,2);
    stem(xn,Hi,'MarkerFaceColor','blue')
    subplot(3,1,3)
    stem(xn,Y,'r','MarkerFaceColor','green')
    Hi= Hi([ end 1:end-1 ]);
    pause(0.5)
end
pause off
salida=Y(abs(Y)>0);
salida2=conv(x,h);
[salida',salida2']


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
El codigo anterior reproduce graficamente la secuencia de convolucion de las señales x[n] y h[n], como se puede observar en las siguientes imagenes:


------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------





7 comments:

  1. disculpa sera podrías explicarnos lo q hace cada linea de tu código? es que estamos intentando entender tu código para poder adaptarlo a nuestro ejercicio

    ReplyDelete
  2. Lo lógico es invertir el vector mas sencillo.
    % http://romansarmiento.blogspot.pe/
    % OCTAVE
    clear
    clc
    h=[1 1 1 1 1 1]; %cualquier vector menor de 10 elementos
    x=[1 1 0 0 0 1 1 2 ]; %cualquier vector menor de 10 elementos
    m=length(x);
    n=length(h);
    %invierte el vector h
    hi=fliplr(h);
    k=20;
    X=[x,zeros(1,40-m)];
    X= X([ end-k+1:end 1:end-k ]);
    H=[h,zeros(1,40-n)];
    H= H([ end-k+1:end 1:end-k ]);
    xn=-20:20-1;
    Y=zeros(1,40);
    p=zeros(1,40);
    h1=subplot(3,1,1);
    stem(xn,X,'MarkerFaceColor','red')
    % set(h1,'YLim',[a b])
    h2=subplot(3,1,2);
    stem(xn,H,'MarkerFaceColor','blue')
    % set(h2,'YLim',[a b])
    pause(3)
    h2=subplot(3,1,3);
    stem(xn,Y,'MarkerFaceColor','green')
    %
    Hi=[hi,zeros(1,40-n)];
    for i=1:40-n
    p=X.*Hi;
    Y(i+n-1)=sum(p);
    subplot(3,1,2);
    stem(xn,Hi,'MarkerFaceColor','blue')
    subplot(3,1,3)
    stem(xn,Y,'r','MarkerFaceColor','green')
    Hi= Hi([ end 1:end-1 ]);
    pause(0.5)
    end
    salida=Y(abs(Y)>0);
    salida2=conv(x,h);
    [salida',salida2']

    ReplyDelete
    Replies
    1. Vemos que en OCTAVE no se usa pause on ni pause off, y que el resultado es el mismo intercambiando x por h.

      Delete
    2. Vemos que en OCTAVE no se usa pause on ni pause off, y que el resultado es el mismo intercambiando x por h.

      Delete
  3. Lo lógico es invertir el vector mas sencillo.
    % http://romansarmiento.blogspot.pe/
    % OCTAVE
    clear
    clc
    h=[1 1 1 1 1 1]; %cualquier vector menor de 10 elementos
    x=[1 1 0 0 0 1 1 2 ]; %cualquier vector menor de 10 elementos
    m=length(x);
    n=length(h);
    %invierte el vector h
    hi=fliplr(h);
    k=20;
    X=[x,zeros(1,40-m)];
    X= X([ end-k+1:end 1:end-k ]);
    H=[h,zeros(1,40-n)];
    H= H([ end-k+1:end 1:end-k ]);
    xn=-20:20-1;
    Y=zeros(1,40);
    p=zeros(1,40);
    h1=subplot(3,1,1);
    stem(xn,X,'MarkerFaceColor','red')
    % set(h1,'YLim',[a b])
    h2=subplot(3,1,2);
    stem(xn,H,'MarkerFaceColor','blue')
    % set(h2,'YLim',[a b])
    pause(3)
    h2=subplot(3,1,3);
    stem(xn,Y,'MarkerFaceColor','green')
    %
    Hi=[hi,zeros(1,40-n)];
    for i=1:40-n
    p=X.*Hi;
    Y(i+n-1)=sum(p);
    subplot(3,1,2);
    stem(xn,Hi,'MarkerFaceColor','blue')
    subplot(3,1,3)
    stem(xn,Y,'r','MarkerFaceColor','green')
    Hi= Hi([ end 1:end-1 ]);
    pause(0.5)
    end
    salida=Y(abs(Y)>0);
    salida2=conv(x,h);
    [salida',salida2']

    ReplyDelete
  4. Que tal, como puedo cambiar el valor del eje x?

    ReplyDelete
  5. Amigo me podria decir como graficar funciones como a^n

    ReplyDelete