Está en la página 1de 2

function y=circonv(h,x)

% Circular convolution of equal length sequences


N=length(x); y=zeros(N,1);
x=circfold(x,N);
y(1)=h'*x;
for n=2:N
x=cirshift0(x,1,N);
y(n)=h'*x;
end

function y=circfold(x,N)
% Circular time reversal (folding)
if length(x) > N; error('N < length(x)'); end
x=[x zeros(1,N-length(x))];
n=(0:1:N-1);
y=x(mod(-n,N)+1);

function y=cirshift0(x,k,N)
% Circular shift of a sequence
if length(x) > N; error('N < length(x)');
end
x=[x zeros(1,N-length(x))];
n=(0:1:N-1); y=x(mod(n-k,N)+1);

function hd = ideal_lp(wc,M);
% Cálculo del filtro pasa bajo ideal
% [hd] = ideal_lp(wc,M)
% hd = respuesta de impulso ideal entre 0 y M-1
% wc = frecuencia de corte en radianes
% M = longitud del filtro ideal
%
alpha = (M-1)/2;
n = [0:1:(M-1)];
m = n - alpha + eps;
hd = sin(wc*m) ./ (pi*m);

function [db,mag,pha,grd,w] = freqz_m(b,a)

% Versión modificada de la subrutina freqz


% [db,mag,pha,grd,w] = freqz_m(b,a);
% db = Magnitud relativa en dB calculada sobre 0 a pi radianes
% mag = magnitud absoluta calculada sobre 0 a pi radianes
% pha = Respuesta de fase en radianes sobre 0 a pi radianes
% grd = Retardo de grupo sobre 0 a pi radianes
% w = 501 muestras de frecuencia entre 0 y pi radianes
% b = polinomio numerador de H(z) (para FIR: b=h)
% a = polinomio del denominador de H(z) (para FIR: a=[1])

[H,w] = freqz(b,a,1000,'whole');
H = (H(1:1:501))'; w = (w(1:1:501))';
mag = abs(H);
db = 20*log10((mag+eps)/max(mag));
pha = angle(H);
% pha = unwrap(angle(H));
grd = grpdelay(b,a,w);

% grd = diff(pha);
% grd = [grd(1) grd];
% grd = [0 grd(1:1:500); grd; grd(2:1:501) 0];
% grd = median(grd)*500/pi;

También podría gustarte