matlab程序中的fir1和fir2有什么不同
最近看到一个matlab程序中同时出现fir1,fir2,但是我在help里面搜索有什么区别时,我却没发现二者有什么不同。谁能告诉我一下,fir1和fir2有什么不同,谢谢[ 本帖最后由 eight 于 2008-4-29 21:10 编辑 ] 原帖由 byrsky 于 2008-4-29 20:40 发表 http://www.chinavib.com/forum/images/common/back.gif
最近看到一个matlab程序中同时出现fir1,fir2,但是我在help里面搜索有什么区别时,我却没发现二者有什么不同。谁能告诉我一下,fir1和fir2有什么不同,谢谢 这是自定义的变量或者函数吧?matlab 自带的库中应该没有 fir1、fir2 的。若确实如此,请附上代码
[ 本帖最后由 eight 于 2008-4-30 21:48 编辑 ]
回复 2楼 的帖子
我的matlabR14(V7.04)里确实有fir1和fir2,在Signal Processing Toolbox里。eight院长没有可能是matlab的版本问题吧。另外,楼主,关于二者的区别就在help文档的Note里写的很清楚了啊。Note Use fir2 for windowed filters with arbitrary frequency response.
Note Use fir1 for windows-based standard lowpass, bandpass, highpass, and bandstop configurations
fir1
Wwindow-based finite impulse response filter design
Syntax
b = fir1(n,Wn)
b = fir1(n,Wn,'ftype')
b = fir1(n,Wn,window)
b = fir1(n,Wn,'ftype',window)
b = fir1(...,'normalization')
Description
fir1 implements the classical method of windowed linear-phase FIR digital filter design . It designs filters in standard lowpass, highpass, bandpass, and bandstop configurations. By default the filter is normalized so that the magnitude response of the filter at the center frequency of the passband is 0 dB.
Note Use fir2 for windowed filters with arbitrary frequency response.
fir2
Ffrequency sampling-based finite impulse response filter design
Syntax
b = fir2(n,f,m)
b = fir2(n,f,m,window)
b = fir2(n,f,m,npt)
b = fir2(n,f,m,npt,window)
b = fir2(n,f,m,npt,lap)
b = fir2(n,f,m,npt,lap,window)
Description
fir2 designs frequency sampling-based digital FIR filters with arbitrarily shaped frequency response.
Note Use fir1 for windows-based standard lowpass, bandpass, highpass, and bandstop configurations.
fir1.mfunction = fir1(N,Wn,varargin)
%FIR1 FIR filter design using the window method.
% B = FIR1(N,Wn) designs an N'th order lowpass FIR digital filter
% and returns the filter coefficients in length N+1 vector B.
% The cut-off frequency Wn must be between 0 < Wn < 1.0, with 1.0
% corresponding to half the sample rate.The filter B is real and
% has linear phase.The normalized gain of the filter at Wn is
% -6 dB.
%
% B = FIR1(N,Wn,'high') designs an N'th order highpass filter.
% You can also use B = FIR1(N,Wn,'low') to design a lowpass filter.
%
% If Wn is a two-element vector, Wn = , FIR1 returns an
% order N bandpass filter with passbandW1 < W < W2. You can
% also specify B = FIR1(N,Wn,'bandpass').If Wn = ,
% B = FIR1(N,Wn,'stop') will design a bandstop filter.
%
% If Wn is a multi-element vector,
% Wn = ,
% FIR1 returns an order N multiband filter with bands
% 0 < W < W1, W1 < W < W2, ..., WN < W < 1.
% B = FIR1(N,Wn,'DC-1') makes the first band a passband.
% B = FIR1(N,Wn,'DC-0') makes the first band a stopband.
%
% B = FIR1(N,Wn,WIN) designs an N-th order FIR filter using
% the N+1 length vector WIN to window the impulse response.
% If empty or omitted, FIR1 uses a Hamming window of length N+1.
% For a complete list of available windows, see the help for the
% WINDOW function. KAISER and CHEBWIN can be specified with an
% optional trailing argument.For example, B = FIR1(N,Wn,kaiser(N+1,4))
% uses a Kaiser window with beta=4. B = FIR1(N,Wn,'high',chebwin(N+1,R))
% uses a Chebyshev window with R decibels of relative sidelobe
% attenuation.
%
% For filters with a gain other than zero at Fs/2, e.g., highpass
% and bandstop filters, N must be even.Otherwise, N will be
% incremented by one.In this case the window length should be
% specified as N+2.
%
% By default, the filter is scaled so the center of the first pass band
% has magnitude exactly one after windowing. Use a trailing 'noscale'
% argument to prevent this scaling, e.g. B = FIR1(N,Wn,'noscale'),
% B = FIR1(N,Wn,'high','noscale'), B = FIR1(N,Wn,wind,'noscale').You
% can also specify the scaling explicitly, e.g. FIR1(N,Wn,'scale'), etc.
%
% See also KAISERORD, FIRCLS1, FIR2, FIRLS, FIRCLS, CFIRPM,
% FIRPM, FREQZ, FILTER, WINDOW.
% FIR1 is an M-file implementation of program 5.2 in the IEEE
% Programs for Digital Signal Processing tape.
% Author(s): L. Shure
% L. Shure, 4-5-90, revised
% T. Krauss, 3-5-96, revised
% Copyright 1988-2004 The MathWorks, Inc.
% $Revision: 1.15.4.3 $$Date: 2004/10/18 21:08:06 $
% Reference(s):
% "Programs for Digital Signal Processing", IEEE Press
% John Wiley & Sons, 1979, pg. 5.2-1.
error(nargchk(2,5,nargin));
% Parse optional input arguments
= parseoptargs(Wn,varargin{:});
error(msg);
% Compute the frequency vector
= desiredfreq(Wn,Ftype);
error(msg);
% Compute the magnitude vector
= desiredmag(Ftype,nbands);
% Check for appropriate filter order, increase when necessary
= firchk(N,ff(end),aa);
error(msg1);
warning(msg2);
% Work with filter length (= order + 1)
L = N + 1;
% Check for valid window, or assign default if empty
= chkwindow(Wind,L);
error(msg);
% Compute unwindowed impulse response
hh = firls(L-1,ff,aa);
% Window impulse response to get the filter
b = hh.*Wind(:)';
a = 1;
if SCALING,
% Scale so that passband is approx 1
b = scalefilter(b,First_Band,ff,L);
end
%-------------------------------------------------------------------------
function = parseoptargs(Wn,varargin)
%PARSEOPTARGS Parse optional input arguments.
% Up to 3 optional input arguments, always in this order:
% 1 - Filter type flag, can be 'low','high','bandpass','stop','DC-0','DC-1'
% 2 - Window vector
% 3 - 'noscale' flag
% Initialize output args.
SCALING = [];
= assignoptargs(Wn,varargin{:});
= validateargs(Wn,Ftype,Wind,Scale);
if ~isempty(msg),
return
end
switch lower(Scale),
case 'noscale';
SCALING = 0;
case 'scale';
SCALING = 1;
end
%--------------------------------------------------------------------------
function = assignoptargs(Wn,varargin)
%ASSIGNOPTARGSAssign optional input arguments to the appropriate variables.
% default optional parameter values:
Wind = [];
Scale = 'scale';
Ftype = defaultftype(Wn);
switch length(varargin)
case 1
if ischar(varargin{1}) && (length(varargin{1})>0),
s = upper(varargin{1});
switch upper(s)
case {'SCALE','NOSCALE'}
Scale = s;
otherwise
Ftype = s;
end
else
Wind = varargin{1};
end
case 2
if ischar(varargin{1})
Ftype = varargin{1};
else
Wind = varargin{1};
end
if ischar(varargin{2})
Scale = varargin{2};
else
Wind = varargin{2};
end
case 3
Ftype = varargin{1};
Wind = varargin{2};
Scale = varargin{3};
end
%--------------------------------------------------------------------------
function = validateargs(Wn,Ftype,Wind,Scale)
%VALIDATEARGSTest if arguments are valid.
msg = '';
% Assign a default Ftype when an empty is given. Backwards compatibility
if isempty(Ftype),
Ftype = defaultftype(Wn);
end
Ftypeopts = {'LOW','HIGH','BANDPASS','STOP','DC-0','DC-1'};
Scaleopts = {'NOSCALE','SCALE'};
indx = find(strncmpi(Ftype, Ftypeopts, length(Ftype)));
if isempty(indx),
msg = 'Unrecognized or ambiguous filter type specified.';
return
else
Ftype = Ftypeopts{indx};
end
scaleindx = find(strncmpi(Scale, Scaleopts, length(Scale)));
if isempty(scaleindx),
msg = 'Scaling option must be ''noscale'' or ''scale''.';
return
else
Scale = Scaleopts{scaleindx};
end
if ~any(size(Wind) <= 1),
msg = 'The window specified must be a vector';
return
else
Wind = Wind(:).'; % Make it a row vector
end
%--------------------------------------------------------------------------
function = desiredfreq(Wn,Ftype)
%DESIREDFREQCompute the vector of frequencies to pass to FIRLS.
%
% Inputs:
% Wn - vector of cutoff frequencies.
% Ftype - string with desired response ('low','high',...)
%
% Outputs:
% nbands - number of frequency bands.
% ff - vector of frequencies to pass to FIRLS.
% Ftype- converted filter type (if it's necessary to convert)
% Initialize output args.
nbands = [];
ff = [];
msg = '';
ifany( Wn<0 | Wn>1 ),
msg = 'Frequencies must fall in range between 0 and 1.';
return
end
ifany(diff(Wn)<0),
msg = 'Frequencies must be increasing';
return
end
Wn = Wn(:)';
nbands = length(Wn) + 1;
if (nbands > 2) && strcmpi(Ftype,'bandpass'),
Ftype = 'DC-0';% make sure default 3 band filter is bandpass
end
ff = ;
ff = ff(:);
%-------------------------------------------------------------------------
function = desiredmag(Ftype,nbands)
%DESIREDMAGCompute the magnitude vector to pass to FIRLS.
First_Band = isempty(findstr('DC-0',Ftype)) && isempty(findstr('HIGH',Ftype));
mags = rem( First_Band + (0:nbands-1), 2);
aa = ;
aa = aa(:);
%--------------------------------------------------------------------------
function = chkwindow(Wind,L)
%CHKWINDOW Check if specified window is valid, assign default if empty.
msg = '';
if isempty(Wind),
% Replace the following with the default window of your choice.
Wind = hamming(L);
end
if length(Wind) ~= L
msg = 'The window length must be the same as the filter length.';
end
%
% to use Kaiser window, beta must be supplied
% att = 60; % dB of attenuation desired in sidelobe
% beta = 0.1102*(att-8.7);
% wind = kaiser(L,beta);
%---------------------------------------------------------------------------
function b = scalefilter(b,First_Band,ff,L)
%SCALEFILTER Scale fitler to have passband approx. equal to one.
if First_Band
b = b / sum(b);% unity gain at DC
else
if ff(4)==1
% unity gain at Fs/2
f0 = 1;
else
% unity gain at center of first passband
f0 = mean(ff(3:4));
end
b = b / abs( exp(-j*2*pi*(0:L-1)*(f0/2))*(b.') );
end
%----------------------------------------------------------------------------
function Ftype = defaultftype(Wn)
%DEFAULTFTYPEAssign default filter type depending on number of bands.
if length(Wn) == 1,
Ftype = 'low';
elseif length(Wn) == 2,
Ftype = 'bandpass';
elseif length(Wn) >= 3,
Ftype = 'dc-0';
endfir2.mfunction = fir2(nn, ff, aa, npt, lap, wind)
%FIR2 FIR arbitrary shape filter design using the frequency sampling method.
% B = FIR2(N,F,A) designs an N'th order FIR digital filter with the
% frequency response specified by vectors F and A, and returns the
% filter coefficients in length N+1 vector B.Vectors F and A specify
% the frequency and magnitude breakpoints for the filter such that
% PLOT(F,A) would show a plot of the desired frequency response.
% The frequencies in F must be between 0.0 < F < 1.0, with 1.0
% corresponding to half the sample rate. They must be in increasing
% order and start with 0.0 and end with 1.0.
%
% The filter B is real, and has linear phase, i.e., symmetric
% coefficients obeying B(k) =B(N+2-k), k = 1,2,...,N+1.
%
% By default FIR2 windows the impulse response with a Hamming window.
% Other available windows, including Boxcar, Hann, Bartlett, Blackman,
% Kaiser and Chebwin can be specified with an optional trailing argument.
% For example,
% B = FIR2(N,F,A,bartlett(N+1)) uses a Bartlett window.
% B = FIR2(N,F,A,chebwin(N+1,R)) uses a Chebyshev window.
%
% For filters with a gain other than zero at Fs/2, e.g., highpass
% and bandstop filters, N must be even.Otherwise, N will be
% incremented by one.In this case the window length should be
% specified as N+2.
%
% See also FIR1, FIRLS, CFIRPM, FIRPM, BUTTER, CHEBY1, CHEBY2, YULEWALK,
% FREQZ, FILTER.
% Author(s): L. Shure, 3-27-87
% C. Denham, 7-26-90, revised
% Copyright 1988-2004 The MathWorks, Inc.
% $Revision: 1.12.4.4 $$Date: 2004/10/18 21:08:07 $
% Optional input arguments (see the user's guide):
% npt - number for interpolation
% lap - the number of points for jumps in amplitude
nargchk(3,6,nargin);
= firchk(nn,ff(end),aa);
error(msg1);
warning(msg2);
% Work with filter length instead of filter order
nn = nn + 1;
if (nargin > 3)
if nargin == 4
if length(npt) == 1
if (2 ^ round(log(npt)/log(2))) ~= npt
% NPT is not an even power of two
npt = 2^ceil(log(npt)/log(2));
end
wind = hamming(nn);
else
wind = npt;
if nn < 1024
npt = 512;
else
npt = 2.^ceil(log(nn)/log(2));
end
end
lap = fix(npt/25);
elseif nargin == 5
if length(npt) == 1
if (2 ^ round(log(npt)/log(2))) ~= npt
% NPT is not an even power of two
npt = 2.^ceil(log(npt)/log(2));
end
if length(lap) == 1
wind = hamming(nn);
else
wind = lap;
lap = fix(npt/25);
end
else
wind = npt;
npt = lap;
lap = fix(npt/25);
end
end
elseif nargin == 3
if nn < 1024
npt = 512;
else
npt = 2.^ceil(log(nn)/log(2));
end
wind = hamming(nn);
lap = fix(npt/25);
end
if nn ~= length(wind)
error('The specified window must be the same as the filter length')
end
= size(ff);
= size(aa);
if ma ~= mf || na ~= nf
error('You must specify the same number of frequencies and amplitudes')
end
nbrk = max(mf,nf);
if mf < nf
ff = ff';
aa = aa';
end
if abs(ff(1)) > eps || abs(ff(nbrk) - 1) > eps
error('The first frequency must be 0 and the last 1')
end
% interpolate breakpoints onto large grid
H = zeros(1,npt);
nint=nbrk-1;
df = diff(ff'); %#ok
if (any(df < 0))
error('Frequencies must be non-decreasing')
end
npt = npt + 1; % Length of frequencies.
nb = 1;
H(1)=aa(1);
for i=1:nint
if df(i) == 0
nb = nb - lap/2;
ne = nb + lap;
else
ne = fix(ff(i+1)*npt);
end
if (nb < 0 || ne > npt)
error('Too abrupt an amplitude change near end of frequency interval')
end
j=nb:ne;
if nb == ne
inc = 0;
else
inc = (j-nb)/(ne-nb);
end
H(nb:ne) = inc*aa(i+1) + (1 - inc)*aa(i);
nb = ne + 1;
end
% Fourier time-shift.
dt = 0.5 .* (nn - 1);
rad = -dt .* sqrt(-1) .* pi .* (0:npt-1) ./ (npt-1);
H = H .* exp(rad);
H = ; % Fourier transform of real series.
ht = real(ifft(H)); % Symmetric real series.
b = ht(1:nn); % Raw numerator.
b = b .* wind(:).'; % Apply window.
a = 1; % Denominator.
[ 本帖最后由 sogooda 于 2008-4-29 21:52 编辑 ] 原帖由 sogooda 于 2008-4-29 21:45 发表 http://www.chinavib.com/forum/images/common/back.gif
我的matlabR14(V7.04)里确实有fir1和fir2,在Signal Processing Toolbox里。eight院长没有可能是matlab的版本问题吧。另外,楼主,关于二者的区别就在help文档的Note里写的很清楚了啊。
Note Use fir2 for w ... 呵呵,最近比较忙,所以没有时间打开matlab查证:lol
回复 3楼 的帖子
前辈可不可以用中文简单的介绍一下这两个函数的区别呀,英文看不大懂:@L回复 2楼 的帖子
谢谢院长同志帮我解决问题:@)回复 5楼 的帖子
看不懂可以查字典吧:@L
页:
[1]