Function: warpedfilters
WARPEDFILTERS   Frequency-warped band-limited filters
  Usage:  [g,a,fc]=warpedfilters(freqtoscale,scaletofreq,fs,fmin,fmax,bins,Ls);

  Input parameters:
     freqtoscale  : Function converting frequency (Hz) to scale units
     scaletofreq  : Function converting scale units to frequency (Hz)
     fs           : Sampling rate (in Hz).
     fmin         : Minimum frequency (in Hz)
     fmax         : Maximum frequency (in Hz)
     bins         : Vector consisting of the number of bins per octave.
     Ls           : Signal length.
  Output parameters:
     g            : Cell array of filters.
     a            : Downsampling rate for each channel.
     fc           : Center frequency of each channel (in Hz).
     L            : Next admissible length suitable for the generated filters.

  [g,a,fc]=WARPEDFILTERS(freqtoscale,scaletofreq,fs,fmin,fmax,bins,Ls)
  constructs a set of band-limited filters g which cover the required 
  frequency range fmin-fmax with bins filters per scale unit. The 
  filters are always centered at full (fractional k/bins) scale units, 
  where the first filter is selected such that its center is lower than 
  fmin. 

  By default, a Hann window on the frequency side is choosen, but the
  window can be changed by passing any of the window types from
  FIRWIN as an optional parameter.
  Run getfield(getfield(arg_firwin,'flags'),'wintype') to get a cell
  array of window types available.

  With respect to the selected scale, all filters have equal bandwidth 
  and are uniformly spaced on the scale axis, e.g. if freqtoscale is 
  log(x), then we obtain constant-Q filters with geometric spacing. 
  The remaining frequency intervals not covered by these filters are 
  captured one or two additional filters (high-pass always, low-pass if 
  necessary). The signal length Ls is required in order to obtain the 
  optimal normalization factors.
  
  Attention: When using this function, the user needs to be aware of a 
  number of things: 

      a)  Although the freqtoscale and scaletofreq can be chosen
          freely, it is assumed that freqtoscale is an invertible,
          increasing function from {R} or {R}^+ onto
          {R} and that freqtoscale is the inverse function.
      b)  If freqtoscale is from {R}^+ onto {R}, then
          necessarily freqtoscale(0) = -infty.
      c)  If the slope of freqtoscale is (locally) too steep, then
          there is the chance that some filters are effectively 0 or
          have extremely low bandwidth (1-3 samples), and consequently
          very poor localization in time. If freqtoscale is from 
          {R}^+ onto {R} then this usually occurs close
          to the DC component and can be alleviated by increasing fmin.
      d)  Since the input parameter bins is supposed to be integer, 
          freqtoscale and scaletofreq have to be scaled
          appropriately. Note that freqtoscale(fs) is in some sense
          proportional to the resulting number of frequency bands and
          inversely proportional to the filter bandwidths. For example,
          the ERB scale defined by 21.4log_{10}(1+f/228.8) works
          nicely out of the box, while the similar mel scale
          2595log_{10}(1+f/700) most likely has to be rescaled in
          order not to provide a filter bank with 1000s of channels.

  If any of these guidelines are broken, this function is likely to break
  or give undesireable results.  

  By default, a Hann window is chosen as the transfer function prototype, 
  but the window can be changed by passing any of the window types from
  FIRWIN as an optional parameter.

  The integer downsampling rates of the channels must all divide the
  signal length, FILTERBANK will only work for input signal lengths
  being multiples of the least common multiple of the downsampling rates.
  See the help of FILTERBANKLENGTH. 
  The fractional downsampling rates restrict the filterbank to a single
  length L=Ls.

  [g,a]=WARPEDFILTERS(...,'regsampling') constructs a non-uniform
  filterbank with integer subsampling factors. 

  [g,a]=WARPEDFILTERS(...,'uniform') constructs a uniform filterbank
  where the the downsampling rate is the same for all the channels. This
  results in most redundant representation, which produces nice plots.

  [g,a]=WARPEDFILTERS(...,'fractional') constructs a filterbank with
  fractional downsampling rates a. This results in the
  least redundant system.

  [g,a]=WARPEDFILTERS(...,'fractionaluniform') constructs a filterbank
  with fractional downsampling rates a, which are uniform for all filters
  except the "filling" low-pass and high-pass filters can have different
  fractional downsampling rates. This is usefull when uniform subsampling
  and low redundancy at the same time are desirable.

  The filters are intended to work with signals with a sampling rate of
  fs.

  WARPEDFILTERS accepts the following optional parameters:

      'bwmul',bwmul 
                          Bandwidth variation factor. Multiplies the
                          calculated bandwidth. Default value is 1.
                          If the value is less than one, the
                          system may no longer be painless.

      'complex'            
                          Construct a filterbank that covers the entire
                          frequency range. When missing, only positive
                          frequencies are covered.

      'redmul',redmul      
                          Redundancy multiplier. Increasing the value of
                          this will make the system more redundant by
                          lowering the channel downsampling rates. Default
                          value is 1. If the value is less than one,
                          the system may no longer be painless.

  Examples:
  ---------

  In the first example, we use the ERB scale functions freqtoerb and
  erbtofreq to construct a filter bank and visualize the result:

    [s,fs] = gspi; % Get a test signal
    Ls = numel(gspi);

    % Fix some parameters
    fmax = fs/2;
    bins = 1;

    % Compute filters, using fractional downsampling
    [g,a,fc]=warpedfilters(@freqtoerb,@erbtofreq,fs,0,fmax,bins,...
                           Ls,'bwmul',1.5,'real','fractional');

    % Plot the filter transfer functions
    figure(1); 
    filterbankfreqz(g,a,Ls,'plot','linabs','posfreq');
    title('ERBlet filter transfer functions');

    % Compute the frame bounds
    gf=filterbankresponse(g,a,Ls,'real'); framebound_ratio = max(gf)/min(gf);
    disp(['Painless system frame bound ratio of ERBlets: ',...
         num2str(framebound_ratio)]);
     
    % Plot the filter bank coefficients of the test signal
    figure(2);
    c=filterbank(s,g,a);
    plotfilterbank(c,a,fc,fs,60);
    title('ERBlet transform of the test signal');

  In the second example, we look at the same test signal using a 
  constant-Q filter bank with 4 bins per scale unit and the standard 
  (semi-regular) sampling scheme:

    [s,fs] = gspi; % Get a test signal
    Ls = numel(gspi);

    % Fix some parameters
    fmax = fs/2;
    bins = 1;

    % Define the frequency-to-scale and scale-to-frequency functions
    warpfun_log = @(x) 10*log(x);
    invfun_log = @(x) exp(x/10);

    bins_hi = 4; % Select bins/unit parameter
    fmin = 50; % The logarithm's derivative 1/x tends to Inf for x towards 0

    % Compute filters, using fractional downsampling
    [g,a,fc]=warpedfilters(warpfun_log,invfun_log,fs,fmin,fmax,bins_hi,Ls,'bwmul',1,'real');

    % Plot the filter transfer functions
    figure(1); 
    filterbankfreqz(g,a,Ls,'plot','linabs','posfreq');
    title('constant-Q filter transfer functions (4 bins)');

    % Compute the frame bounds
    gf=filterbankresponse(g,a,Ls,'real'); framebound_ratio = max(gf)/min(gf);
    disp(['Painless system frame bound ratio (constant-Q - 4 bins): ', num2str(framebound_ratio)]);

    % Plot the filter bank coefficients of the test signal
    figure(2); 
    c=filterbank(s,g,a);
    plotfilterbank(c,a,fc,fs,60);
    title('constant-Q transform of the test signal (4 bins)');


  References:
    N. Holighaus, Z. Průša, and C. Wiesmeyr. Designing tight filter bank
    frames for nonlinear frequency scales. Sampling Theory and Applications
    2015, submitted, 2015.
    

Url: http://ltfat.github.io/doc/filterbank/warpedfilters.html

See also: erbfilters, cqtfilters, firwin, filterbank, warpedblfilter.

Package: ltfat