⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filtbank.m

📁 关于倍频程和三分之一倍频程滤波器设计程序
💻 M
字号:
function [p,f] = filtbank(x,Fs,T,arg4); % FILTBANK One-third-octave band frequency analyser. %    [P,F] = FILTBANK(X,Fs) computes the one-third-octave spectrum %    of X, assuming sampling frequency Fs (in Hz). P is a row vector  %    containing RMS powers computed for each 1/3-octave band and expressed %    in dB with 1 as reference level. F contains the corresponding preferred  %    labeling frequencies (standard ANSI S1.6-1984). %%    Plots can be obtained, e.g., with BANKDISP. %    Example: (spectrum of white noise)%               X = rand(1,100000); %		[P,F] = filtbank(X,44100);% 		bankdisp(P,F,-40,-20);%%    The frequency range covered is the standard 'restricted' audio range:%    from 100 Hz to 5000 Hz. %%    [P,F] = FILTBANK(X,Fs,T) computes a sequence of one-third-octave %    spectra with integration time T (in s). P is a matrix of size%    (LENGTH(X)/(T*Fs)) x LENGTH(F). If T = [] (default), the integration %    time is equal to the length of X. %%    [P,F] = FILTBANK(X,Fs,T,'extended') covers the 'extended' audio range:%    from 25 Hz to 20 000 Hz. Note that depending on the value of Fs %    the frequency range might be automatically reduced. Warnings will be %    issued if this is the case. 	%			%    See also BANKDISP, LEQ.		 % Author: Christophe Couvreur, Faculte Polytechnique de Mons (Belgium)%         couvreur@thor.fpms.ac.be% Last modification: Aug. 26, 1997, 3:30pm.% References: %    [1] ANSI S1.1-1986 (ASA 65-1986): Specifications for%        Octave-Band and Fractional-Octave-Band Analog and%        Digital Filters, Acoustical Society of America, NY, 1993.%    [2] S. J. Orfanidis, Introduction to Signal Processing, %        Prentice Hall, Englewood Cliffs, 1996.if (nargin < 2) | (nargin > 4)   error('Invalid number of arguments'); endpi = 3.14159265358979; Fref = [ 25 31.5 40, 50 63 80, 100 125 160, 200 250 315, 400 500 630, ...          800 1000 1250, 1600 2000 2500, 3150 4000 5000, 6300 8000 10000, ...          12500 16000 20000 ];             % Preferred labeling freq. Fc = 1000*((2^(1/3)).^[-16:1:13]);        % Exact center freq. 	N = 3;  				  % Order of analysis filters. extended = 0; U = 2^(1/3); % Integration time. if (nargin>=3)  if isempty(T)     T = length(x);     P = zeros(1,length(Fref));  else 					% Convert T to number of samples.     T = floor(Fs*T);     P = zeros(floor(length(x)/T),length(Fref));  endelse    T = length(x);     P = zeros(1,length(Fref));end    if (nargin >= 4)  if strcmp(lower(arg4),'extended')  % Extended (25 Hz to 20000 Hz)      extended = 1;   endend% Frequency range.if (extended) 				% extended (25 Hz to 20 000 Hz).  i_up = 30;  i_low = 1;else 					% restricted (100 Hz to 5000 Hz).  i_up = 24; 				  i_low = 7;end  % Check sampling frequencies and issue warnings.  if (Fs/2) < Fref(i_low)*1.5   error('Sampling frequency Fs too low.'); elseif (Fs/2) < Fref(i_up)*1.5  disp('Warning: frequency range must be reduced (Fs too low).');   i_up = max(find(Fc<=Fs/3));end% Compute 'pivot' frequency for multirate filter implementation% All filters below Fs/20 will be implemented after a decimation. if (Fc(i_low) > Fs/20)  i_dec = 0; else  i_dec = max(find(Fc<=Fs/20)); end% Design filters and compute RMS powers in 1/3-oct. bands.% Higher frequencies, direct implementation of filters. for i = i_up:-1:i_dec+1  [B,A] = oct3dsgn(Fc(i),Fs,N);  y = filter(B,A,x);   P(:,i) = leq(y,T);end% Lower frequencies, decimation by series of 3 bands.if (i_dec > 0)  [Bu,Au] = oct3dsgn(Fc(i_dec),Fs/2,N); % Upper 1/3-oct. band in last octave.   [Bc,Ac] = oct3dsgn(Fc(i_dec)/U,Fs/2,N); % Center 1/3-oct. band in last octave.   [Bl,Al] = oct3dsgn(Fc(i_dec)/(U^2),Fs/2,N); % Lower 1/3-oct. band in last octave.   i = i_dec;   while  i >= i_low+2     x = decimate(x,2);      T = T/2;     y = filter(Bu,Au,x);      P(:,i) =  leq(y,T);         y = filter(Bc,Ac,x);      P(:,i-1) =  leq(y,T);         y = filter(Bl,Al,x);      P(:,i-2) =  leq(y,T);      i = i-3;   end   if (i == (i_low+1))     x = decimate(x,2);      T = T/2;     y = filter(Bu,Au,x);      P(:,i) =  leq(y,T);         y = filter(Bc,Ac,x);      P(:,i-1) =  leq(y,T);      elseif (i == (i_low))     x = decimate(x,2);      T = T/2;     y = filter(Bu,Au,x);      P(:,i) =  leq(y,T);      endendf = Fref(i_low:i_up);p = P(:,i_low:i_up);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -