Convolución y(n)=x(n)*h(n)

Convolución y(n)=x(n)*h(n)

El siguiente programa en Matlab calcula la convolución de dos señales en tiempo discreto.

clc, clear all, close all

disp(‘Variable independiente -tiempo (nx = nxi:nxf) para la señal x(n)’);

nx=input(nxi:nxf :  );

disp(‘Ingrese las muestras de la señal x(n)’);

x=input(‘Utilizar corchetes [x(nxi) … x(nxf)]: ‘);

disp(‘Variable independiente -tiempo (nh = nhi:nhf) para la señal h(n)’);

nh=input(nhi:nhf :  );

disp(‘Ingrese las muestras de la señal h(n)’);

h=input(‘Utilizar corchetes [h(nhi) … h(nhf)]: ‘);

[y,ny] = convm(x,nx,h,nh)

xdn=sx(ny,nx,x); hdn=sh(ny,nh,h);

 

subplot(3,1,1), stem(ny,xdn,‘LineWidth’,2),

axis([min(ny)-1,max(ny)+1,min(xdn)-2,max(xdn)+2]);

xlabel(‘n’); ylabel(‘x(n)’); title(‘Señal x(n)’);

ntick = [ny(1):ny(length(ny))];

set(gca,‘XtickMode’,‘manual’,‘XTick,ntick,‘FontSize’,10)

 

subplot(3,1,2), stem(ny,hdn,‘LineWidth’,2),

axis([min(ny)-1,max(ny)+1,min(hdn)-2,max(hdn)+2]);

xlabel(‘n’); ylabel(‘h(n)’); title(Señal h(n)’);

ntick = [ny(1):ny(length(ny))];

set(gca,‘XtickMode’,‘manual’,‘XTick,ntick,‘FontSize’,10)

 

subplot(3,1,3), stem(ny,y,‘LineWidth’,2),

axis([min(ny)-1,max(ny)+1,min(y)-2,max(y)+2]);

xlabel(‘n’); ylabel(‘y(n)’); title(‘Señal y(n)=x(n)*h(n)’);

ntick = [ny(1):ny(length(ny))];

set(gca,‘XtickMode’,‘manual’,‘XTick,ntick,‘FontSize’,10)

 

% Señal x(n) expresada con la función delta(n)

function y=sx(ny,nx,x),

y=zeros(1,length(ny));

 for k=1:length(x);

     y = y + x(k)*delta(ny-nx(k));

 end

end

% Señal h(n) expresada con la función delta(n)

function y=sh(ny,nh,h),

y=zeros(1,length(ny));

 for p=1:length(h);

     y = y + h(p)*delta(ny-nh(p));

 end

end

% Operación de convolución modificada de las señales x(n) y h(n)

% Fuente:

% Proakis, J. G., & Manolakis, D. G. (2004). Digital signal processing.

% PHI Publication: New Delhi, India.

function [y,ny] = convm(x,nx,h,nh)

% Modified convolution routine for signal processing

% ————————————————–

% [y,ny] = conv_m(x,nx,h,nh)

%  y = convolution result

% ny = support of y

%  x = first signal on support nx

% nx = support of x

%  h = second signal on support nh

% nh = support of h

%

nyb = nx(1)+nh(1); nye = nx(length(x)) + nh(length(h));

ny = [nyb:nye];

y = conv(x,h);

end

function y=delta(n)

    y = 1.*(n==0);

end

Nota. Cambiar la comilla simple por apóstrofe en la hoja de editor de Matlab.

Ejemplo 1: Calcular la respuesta del sistema caracterizado por:
h(n) = [1*, -1.5, -1, 2.5, -0.5] a la señal de entrada:
x(n) = [1, 0.5*, 1, 1.5, 0.5].

En el programa se especifican:

Variable independiente -tiempo (nx = nxi:nxf) para la señal x(n)
nxi:nxf : -1:3
Ingrese las muestras de la señal x(n)
Utilizar corchetes [x(nxi) … x(nxf)]: [1 0.5 1 1.5 0.5]
Variable independiente -tiempo (nh = nhi:nhf) para la señal h(n)
nhi:nhf : 0:4
Ingrese las muestras de la señal h(n)
Utilizar corchetes [h(nhi) … h(nhf)]: [1 -1.5 -1 2.5 -0.5]

Resultado: y(n)=[1, -1*, -0.75, 2, -2, 0, 2.75, 0.5, -0.25]

Ejemplo 2: Calcular la respuesta del sistema caracterizado por:
h(n) = u(n-3) - u(n-12) a la señal de entrada:
x(n) = u(n)-u(n-11).

La función escalón unitario (u(n)) de tiempo discreto se introduce hasta el final del código matlab, de esta manera:

function y=escalon(n),

    y=1.*(n>=0);

end

En el programa se especifican:

Variable independiente -tiempo (nx = nxi:nxf) para la señal x(n)
nxi:nxf : -2:15
Ingrese las muestras de la señal x(n)
Utilizar corchetes [x(nxi) … x(nxf)]: escalon(nx)-escalon(nx-11)
Variable independiente -tiempo (nh = nhi:nhf) para la señal h(n)
nhi:nhf : -2:15
Ingrese las muestras de la señal h(n)
Utilizar corchetes [h(nhi) … h(nhf)]: escalon(nh-3)-escalon(nh-12)

El resultado obtenido verifica la solución analítica:

y2a = 0 .* (ny<3);
y2b = (ny-2) .* (ny>=3 & ny<11);
y2c = 9 .* (ny>=11 & ny<=13);
y2d = (22-ny) .* (ny>13 & ny<=21);
y2e = 0 .* (ny>21);
y2 = y2a+y2b+y2c+y2d+y2e;
figure, stem(ny,y2)

No Comments Yet.