function [B, h, H]=firmf(N,F,M,wtype) % function [B]=firmf(N,F,M,wtype) % N es el tamaño del filtro % F es un vector de frecuencias 0<=F<=0.5 dadas en orden creciente % El primer valor de F debe ser 0 y el ultimo 0.5 % M es un vector de magnitudes a las frecuencias especificadas por F % wtype es el tipo de ventana espectral: boxcar, hamming, hanning o blackman type=wtype(1:4); odd=rem(N,2); Nn=512; NF = length(F); LF = Nn/2; Fi=[0:LF]; df=1/Nn; Fi=Fi*df; DF=diff(F); % Interpolar el vector M (N puntos) a 512 puntos Ff=0;f=0;k=1; for i=1:NF-1, while f<=Ff+DF(i), Mi(k)=M(i)+(f-F(i))*(M(i+1)-M(i))/(F(i+1)-F(i)); f=f+df; k=k+1; end i=i+1; Ff=F(i); end H=Mi.*exp(-sqrt(-1)*2*pi*Fi*(Nn-1)/2); H = [H conj(H(LF:-1:2))]; h=real(ifft(H)); % Aplicar la ventana escogida if type=='boxc', w=boxcar(N)'; elseif type=='hamm', w=hamming(N)'; elseif type=='hann', w=hanning(N)'; elseif type=='blac', w=blackman(N)'; else disp(['El tipo de ventana especificado no existe']); return end B = h(LF-N/2+1:LF+N/2).*w; % Si N es impar, el punto medio de la serie de 512 puntos está en el índice 257 % Si N es par, los puntos medio están en los índices 257 y 258 [Ht,Wt]=freqz(B,1,512); Htdb=20*log10(abs(Ht)); plot(Wt/(2*pi),abs(Ht), F, M, 'or');zoom;grid; return