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: a la señal de entrada:
.
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:
Ejemplo 2: Calcular la respuesta del sistema caracterizado por: a la señal de entrada:
.
La función escalón unitario () 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)