function [B,Ap,As]=firfs1(N,fp,fs,fm,type,wtype) % Determinar los coeficientes de la ventana odd=rem(N+1,2); wnd=wtype(1:4); ft=type(1:2); if (ft=='bs' | ft=='hp') & odd==0, disp('Para los filtros parabanda y pasaalta el orden del filtro debe ser par'); return end if wnd=='boxc', w=boxcar(N+1)'; elseif wnd=='hamm', w=hamming(N+1)'; elseif wnd=='hann', w=hanning(N+1)'; elseif wnd=='blac', w=blackman(N+1)'; else, disp('Error. Ventana desconocida');return end % Transformar las frecuencias a frecuencias digitales % de pasobajo FFp=fp/fm;FFs=fs/fm; if ft=='lp', Fp=FFp;Fs=FFs;tipo=1; % Filtro Pasobajo elseif ft=='bp' % Filtro Pasabanda % Hay que hacer que la pasabanda y la parabanda tenga la misma frecuencia central F0=(FFp(1)+FFp(2))/2; % Habrá que modificar alguno de las especificaciones para obtener una misma frecuencia % con la menor banda de transición [minimum,idx]=min([FFp(1)-FFs(1) FFs(2)-FFp(2)]); if idx==1, FFs(2)=FFp(2)+minimum; else FFs(1)=FFp(1)-minimum; end Fp=(FFp(2)-FFp(1))/2;Fs=(FFs(2)-FFs(1))/2; elseif ft=='hp' % Filtro Pasoalto Fp=FFs;Fs=FFp; elseif ft=='bs' % Filtro Parabanda % Lo mismo que en el caso de pasabanda F0=(FFs(2)+FFs(1))/2; [minimum,idx]=min([FFs(1)-FFp(1) FFp(2)-FFs(2)]); if idx==1, FFp(2)=FFs(2)+minimum; else FFp(1)=FFs(1)-minimum; end Fp=(FFs(2)-FFs(1))/2;Fs=(FFp(2)-FFp(1))/2; else disp('Error. Tipo de filtro desconocido');return end % Cálculo de coeficientes del filtro pasobajo ideal % Tomamos una frecuencia de corte % Fc=Fp+0.2(Fs-Fp)=0.8Fp+0.2Fs Fc=0.8*Fp+0.2*Fs; n=[-(N/2):N/2]; hLP=2*Fc*sinc(2*n*Fc); % Pasar al filtro requerido con la ventana espectral especificada unos=ones(1,N+1); if ft=='lp', % Pasobajo B=hLP.*w; elseif ft=='bp', % Pasabanda B=2*cos(2*pi*n*F0).*hLP.*w; elseif ft=='hp', % Pasoalto delta=zeros(1,N+1);delta((N+2)/2)=1; B=(delta-hLP).*w; elseif ft=='bs', % Parabanda delta=zeros(1,N+1);delta((N+2)/2)=1; B=(delta-2*cos(2*pi*n*F0).*hLP).*w; end [H,F]=freqz(B,1,500,fm); Hdb=20*log10(abs(H)); plot(F,Hdb);grid;zoom;hold on; A=freqz(B,1,[fp fs],fm); A=-20*log10(abs(A)); if (ft=='lp' | ft=='hp'), Ap=A(1);As=A(2); plot([fp fs],-[Ap As],'r*'); else Ap=A(1:2);As=A(3:4); plot([fp fs],-[Ap As],'r*'); end hold off; return