Home > voicebox > v_windows.m

v_windows

PURPOSE ^

WINDOWS Generate a standard windowing function (TYPE,N,MODE,P,H)

SYNOPSIS ^

function w = v_windows(wtype,n,mode,p,ov)

DESCRIPTION ^

WINDOWS Generate a standard windowing function (TYPE,N,MODE,P,H)

 Inputs:   WTYPE  is a string specifying the window type (see below)
           N      is the number of output points to generate (actually FLOOR(N))
                  and also determines the period of the underlying window [default 256]
           MODE   is a string specifying various options (see below)
           P      is a vector of parameters required for some window types
           OV      is the overlap in samples between succesive windows (must be H<=N/2 and
                  used only for the 'o' option) [default floor(N/2)]

 Outputs:  W(N)   is the output window. If no output is specified, a graph
                  of the window and its frequency response will be drawn.

 The WTYPE input specifies one of the following window types (see [1]):

       Name      Params
    'blackman'
    'cauchy'        1
    'cos'           1      cos window to the power P [default P=1]
    'dolph'         1      Dolph-Chebyshev window with sideband attenuation P dB [default P=50]
    'gaussian'         1      truncated at +-P std deviations [default P=3]
    'hamming'
    'hanning'              also called "hann" or "von hann"
    'harris3'                3-term blackman-harris with 67dB sidelobes
    'harris4'                4-term blackman-harris with 92dB sidelobes
    'kaiser'         1      with parameter P (often called beta) [default P=8]
    'rectangle'
    'triangle'      1      triangle to the power P [default P=1]
    'tukey'         1      cosine tapered 0<P<1 [default P=0.5]
    'vorbis'               perfect reconstruction window from [2] (use mode='sE2')
    'rsqvorbis'            raised squared vorbis with lower sidelobes (use mode='sdD2')

 Window equivalences:

    'hanning'   =    cos(2) = tukey(1)
    'rectangle' =    tukey(0)
    'reisz'     =    triangle(2)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 The MODE input determines the scaling and sampling of the window function and
     is a text string with characters whose meanings are given below. The
     default is 'ubw' for window functions whose end points are non-zero and 'unw'
     for window functions whose end points are zero (e.g. hanning window)

         scaling:
                1-9 = set target gain to G = 1/n in scaling options [default n=1 so G=1]
                  u = unscaled  with the peak of the underlying continuous
                      window equalling G. [default]
                  p = scaled to make the actual peak G
                  d = scaled to make DC gain equal to G (summed sample values).
                  D = scaled to make average value equal G
                  e = scaled to make energy = G (summed squared sample values).
                  E = scaled to make mean energy = G (mean squared sample values).
                  q = take square root of the window after scaling

         first and last samples (see note on periodicity below):
                  b [both]    = The first and last samples are at the extreme ends of
                                the window [default for most windows].
                  n [neither] = The first and last samples are one sample away from the ends
                                of the window [default for windows having zero end points].
                  s [shifted] = The first and last samples are half a sample away from the
                                ends of the window .
                  l [left]    = The first sample is at the end of the window while the last
                                is one sample away from the end .
                  r [right]   = The first sample is one sample away from the end while the
                                last is at the end of the window .

         whole/half window (see note on periodicity below):
                  w = The whole window is included [default]
                  c = The first sample starts in the centre of the window
                  h = The first sample starts half a sample beyond the centre

         convolve with rectangle
                  o = convolve w(n) with a rectangle of length N-H [default floor(N/2)]
                      This can be used to force w(n) to satisfy the Princen-Bradley condition

 Periodicity:
     The underlying period of the window function depends on the chosen mode combinations and
     is given in the table below. For overlapping windows with perfect reconstruction choose
     N to be an integer and modes 'ws', 'wl' or 'wr'.

        Whole/half window -->     w         h         c

        End points:       b      N-1      2N-1      2N-2
                          n      N+1      2N+1       2N
                          s       N        2N       2N-1
                          l       N       2N+1       2N
                          r       N       2N-1      2N-2

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 To obtain unity gain for windowed overlap-add processing you can use
 the following. Bandwidths have been multiplied by the window length.
 For perfect reconstruction, you can use any multiple of the overlap factors
 shown assuming the same window is used for both analysis and synthesis.
 These are the Princen-Bradley conditions: fliplr(w)=w, w(i)^2+w(i+n/2)^2=1
 Any symmetric window will satisfy the conditions with mode 'boqD2' [3].

   Window     Mode Overlap-Factor Sidelobe  3dB-BW  6dB-BW Equiv-noise-BW
   rsqvorbis  sqD2     2           -26dB     1.1      1.5      1.1
   hamming    sqD2     2,3,5       -24dB     1.1      1.5      1.1
   hanning    sqD2     2,3,5       -23dB     1.2      1.6      1.2 =cos('sE2')
   cos        sE2      2,3,5       -23dB     1.2      1.6      1.2 used in MP3
   kaiser(5)  boqD2    2           -23dB     1.2      1.7      1.3 used in AAC [4]
   vorbis     sE2      2,9,15      -21dB     1.3      1.8      1.4 used in Vorbis
   hamming    sE4      3,4,5       -43dB     1.3      1.8      1.4
   hanning    sE4      3,4,5       -31dB     1.4      2.0      1.5

 References:
  [1]  F. J. Harris. On the use of windows for harmonic analysis with the
       discrete fourier transform. Proc IEEE, 66 (1): 5183, Jan. 1978.
  [2]    L. D. Fielder, M. Bosi, G. Davidson, M. Davis, C. Todd, and S. Vernon.
       AC-2 and AC-3: Low-complexity transform-based audio coding.
       In Audio Engineering Society Conference: Collected Papers on Digital Audio Bit-Rate Reduction, May 1996.
  [3]    J. Princen, A. Johnson, and A. Bradley. Subband/transform coding using filter
       bank designs based on time domain aliasing cancellation.
       In Proc. IEEE Intl Conf. Acoustics, Speech and Signal Processing, volume 12,
       pages 21612164, 1987. doi: 10.1109/ICASSP.1987.1169405.
  [4]    T. Sporer, K. Brandenburg, and B. Edler.
       The use of multirate filter banks for coding of high quality digital audio.
       In Proc EUSIPCO, volume 1, pages 211214, 1992.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      Copyright (C) Mike Brookes 2002-2015
      Version: $Id: v_windows.m 10477 2018-06-03 16:16:45Z dmb $

   VOICEBOX is a MATLAB toolbox for speech processing.
   Home page: http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/voicebox.html

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You can obtain a copy of the GNU General Public License from
   http://www.gnu.org/copyleft/gpl.html or by writing to
   Free Software Foundation, Inc.,675 Mass Ave, Cambridge, MA 02139, USA.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function w = v_windows(wtype,n,mode,p,ov)
0002 %WINDOWS Generate a standard windowing function (TYPE,N,MODE,P,H)
0003 %
0004 % Inputs:   WTYPE  is a string specifying the window type (see below)
0005 %           N      is the number of output points to generate (actually FLOOR(N))
0006 %                  and also determines the period of the underlying window [default 256]
0007 %           MODE   is a string specifying various options (see below)
0008 %           P      is a vector of parameters required for some window types
0009 %           OV      is the overlap in samples between succesive windows (must be H<=N/2 and
0010 %                  used only for the 'o' option) [default floor(N/2)]
0011 %
0012 % Outputs:  W(N)   is the output window. If no output is specified, a graph
0013 %                  of the window and its frequency response will be drawn.
0014 %
0015 % The WTYPE input specifies one of the following window types (see [1]):
0016 %
0017 %       Name      Params
0018 %    'blackman'
0019 %    'cauchy'        1
0020 %    'cos'           1      cos window to the power P [default P=1]
0021 %    'dolph'         1      Dolph-Chebyshev window with sideband attenuation P dB [default P=50]
0022 %    'gaussian'         1      truncated at +-P std deviations [default P=3]
0023 %    'hamming'
0024 %    'hanning'              also called "hann" or "von hann"
0025 %    'harris3'                3-term blackman-harris with 67dB sidelobes
0026 %    'harris4'                4-term blackman-harris with 92dB sidelobes
0027 %    'kaiser'         1      with parameter P (often called beta) [default P=8]
0028 %    'rectangle'
0029 %    'triangle'      1      triangle to the power P [default P=1]
0030 %    'tukey'         1      cosine tapered 0<P<1 [default P=0.5]
0031 %    'vorbis'               perfect reconstruction window from [2] (use mode='sE2')
0032 %    'rsqvorbis'            raised squared vorbis with lower sidelobes (use mode='sdD2')
0033 %
0034 % Window equivalences:
0035 %
0036 %    'hanning'   =    cos(2) = tukey(1)
0037 %    'rectangle' =    tukey(0)
0038 %    'reisz'     =    triangle(2)
0039 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0040 %
0041 % The MODE input determines the scaling and sampling of the window function and
0042 %     is a text string with characters whose meanings are given below. The
0043 %     default is 'ubw' for window functions whose end points are non-zero and 'unw'
0044 %     for window functions whose end points are zero (e.g. hanning window)
0045 %
0046 %         scaling:
0047 %                1-9 = set target gain to G = 1/n in scaling options [default n=1 so G=1]
0048 %                  u = unscaled  with the peak of the underlying continuous
0049 %                      window equalling G. [default]
0050 %                  p = scaled to make the actual peak G
0051 %                  d = scaled to make DC gain equal to G (summed sample values).
0052 %                  D = scaled to make average value equal G
0053 %                  e = scaled to make energy = G (summed squared sample values).
0054 %                  E = scaled to make mean energy = G (mean squared sample values).
0055 %                  q = take square root of the window after scaling
0056 %
0057 %         first and last samples (see note on periodicity below):
0058 %                  b [both]    = The first and last samples are at the extreme ends of
0059 %                                the window [default for most windows].
0060 %                  n [neither] = The first and last samples are one sample away from the ends
0061 %                                of the window [default for windows having zero end points].
0062 %                  s [shifted] = The first and last samples are half a sample away from the
0063 %                                ends of the window .
0064 %                  l [left]    = The first sample is at the end of the window while the last
0065 %                                is one sample away from the end .
0066 %                  r [right]   = The first sample is one sample away from the end while the
0067 %                                last is at the end of the window .
0068 %
0069 %         whole/half window (see note on periodicity below):
0070 %                  w = The whole window is included [default]
0071 %                  c = The first sample starts in the centre of the window
0072 %                  h = The first sample starts half a sample beyond the centre
0073 %
0074 %         convolve with rectangle
0075 %                  o = convolve w(n) with a rectangle of length N-H [default floor(N/2)]
0076 %                      This can be used to force w(n) to satisfy the Princen-Bradley condition
0077 %
0078 % Periodicity:
0079 %     The underlying period of the window function depends on the chosen mode combinations and
0080 %     is given in the table below. For overlapping windows with perfect reconstruction choose
0081 %     N to be an integer and modes 'ws', 'wl' or 'wr'.
0082 %
0083 %        Whole/half window -->     w         h         c
0084 %
0085 %        End points:       b      N-1      2N-1      2N-2
0086 %                          n      N+1      2N+1       2N
0087 %                          s       N        2N       2N-1
0088 %                          l       N       2N+1       2N
0089 %                          r       N       2N-1      2N-2
0090 %
0091 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0092 % To obtain unity gain for windowed overlap-add processing you can use
0093 % the following. Bandwidths have been multiplied by the window length.
0094 % For perfect reconstruction, you can use any multiple of the overlap factors
0095 % shown assuming the same window is used for both analysis and synthesis.
0096 % These are the Princen-Bradley conditions: fliplr(w)=w, w(i)^2+w(i+n/2)^2=1
0097 % Any symmetric window will satisfy the conditions with mode 'boqD2' [3].
0098 %
0099 %   Window     Mode Overlap-Factor Sidelobe  3dB-BW  6dB-BW Equiv-noise-BW
0100 %   rsqvorbis  sqD2     2           -26dB     1.1      1.5      1.1
0101 %   hamming    sqD2     2,3,5       -24dB     1.1      1.5      1.1
0102 %   hanning    sqD2     2,3,5       -23dB     1.2      1.6      1.2 =cos('sE2')
0103 %   cos        sE2      2,3,5       -23dB     1.2      1.6      1.2 used in MP3
0104 %   kaiser(5)  boqD2    2           -23dB     1.2      1.7      1.3 used in AAC [4]
0105 %   vorbis     sE2      2,9,15      -21dB     1.3      1.8      1.4 used in Vorbis
0106 %   hamming    sE4      3,4,5       -43dB     1.3      1.8      1.4
0107 %   hanning    sE4      3,4,5       -31dB     1.4      2.0      1.5
0108 %
0109 % References:
0110 %  [1]  F. J. Harris. On the use of windows for harmonic analysis with the
0111 %       discrete fourier transform. Proc IEEE, 66 (1): 5183, Jan. 1978.
0112 %  [2]    L. D. Fielder, M. Bosi, G. Davidson, M. Davis, C. Todd, and S. Vernon.
0113 %       AC-2 and AC-3: Low-complexity transform-based audio coding.
0114 %       In Audio Engineering Society Conference: Collected Papers on Digital Audio Bit-Rate Reduction, May 1996.
0115 %  [3]    J. Princen, A. Johnson, and A. Bradley. Subband/transform coding using filter
0116 %       bank designs based on time domain aliasing cancellation.
0117 %       In Proc. IEEE Intl Conf. Acoustics, Speech and Signal Processing, volume 12,
0118 %       pages 21612164, 1987. doi: 10.1109/ICASSP.1987.1169405.
0119 %  [4]    T. Sporer, K. Brandenburg, and B. Edler.
0120 %       The use of multirate filter banks for coding of high quality digital audio.
0121 %       In Proc EUSIPCO, volume 1, pages 211214, 1992.
0122 %
0123 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0124 %      Copyright (C) Mike Brookes 2002-2015
0125 %      Version: $Id: v_windows.m 10477 2018-06-03 16:16:45Z dmb $
0126 %
0127 %   VOICEBOX is a MATLAB toolbox for speech processing.
0128 %   Home page: http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/voicebox.html
0129 %
0130 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0131 %   This program is free software; you can redistribute it and/or modify
0132 %   it under the terms of the GNU General Public License as published by
0133 %   the Free Software Foundation; either version 2 of the License, or
0134 %   (at your option) any later version.
0135 %
0136 %   This program is distributed in the hope that it will be useful,
0137 %   but WITHOUT ANY WARRANTY; without even the implied warranty of
0138 %   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0139 %   GNU General Public License for more details.
0140 %
0141 %   You can obtain a copy of the GNU General Public License from
0142 %   http://www.gnu.org/copyleft/gpl.html or by writing to
0143 %   Free Software Foundation, Inc.,675 Mass Ave, Cambridge, MA 02139, USA.
0144 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0145 
0146 kk=[-1 1 1 -1; 0 0 2 -2; 0 1 2 -1;   % mode  w,  h,  c  [normal windows]
0147     -1 0 1 0; 0 0 2 0; 0 1 2 1;       % modes lw, lh, lc
0148     -1 2 1 0; 0 0 2 -2; 0 1 2 -1;     % modes rw, rh, rc
0149     -1 1 1 -1; 0 0 2 -2; 0 1 2 -1;    % modes bw, bh, bc
0150     -1 1 1 1; 0 0 2 0; 0 1 2 1;       % modes nw, nh, nc
0151     -1 1 1 0; 0 0 2 -1; 0 1 2 0;];    % modes sw, sh, sc
0152 
0153 if nargin<2
0154     n=256;
0155 end
0156 if nargin<3 || isempty(mode) || ~ischar(mode)
0157     mode='uw';
0158 end;
0159 mm=zeros(1,length(mode)+1);
0160 ll='hc lrbns';
0161 for i=1:8
0162     mm(mode==ll(i))=i-3;
0163 end
0164 wtype=lower(wtype);
0165 k=1+3*max(mm)-min(mm);
0166 if k<4
0167     switch wtype                % check if window goes all the way to zero
0168         case {'hanning','triangle','blackman','cos','tukey','vorbis'}
0169             k=k+12;
0170     end
0171 end
0172 if any(mode=='o') % need to convolve with rectangle
0173     if nargin<5 || ~numel(h)
0174         ov=floor(n/2);
0175     end
0176     n=n-ov+1; % shorten baseline window
0177 else
0178     ov=0;
0179 end
0180 
0181 % determine the sample points
0182 % the number of points corresponding to a full period is (kk(k,3)*n+kk(k,4))
0183 fn=floor(n);
0184 kp=(kk(k,3)*n+kk(k,4));
0185 ks=kk(k,1)*fn+kk(k,2);
0186 v=((0:2:2*fn-2)+ks)/kp;
0187 
0188 % now make the window
0189 np=0;
0190 switch wtype
0191     case 'hanning'
0192         w = 0.5+0.5*cos(pi*v);
0193         
0194     case 'cos'
0195         if nargin<4, p=1; end;
0196         np=1;               % number of parameters = 1
0197         w = cos(0.5*pi*v).^p(1);
0198         
0199     case 'dolph'
0200         if nargin<4, p=50; end;
0201         np=1;               % number of parameters = 1
0202         if rem(ks+kp,2)     % for shifted windows, we generate twice as many points
0203             w=chebwin(2*kp+1,abs(p(1)));
0204             w=w((1:2:2*fn)+round(ks+kp));
0205         else
0206             w=chebwin(kp+1,abs(p(1)));
0207             w=w((1:fn)+round((ks+kp)/2));
0208         end
0209         
0210     case 'tukey'
0211         if nargin<4, p=0.5; end;
0212         np=1;               % number of parameters = 1
0213         if p(1)>0
0214             p(1)=min(p(1),1);
0215             w = 0.5+0.5*cos(pi*max(1+(abs(v)-1)/p(1),0));
0216         else
0217             w = ones(size(v));
0218         end
0219         
0220     case 'cauchy'
0221         if nargin<4, p=1; end;
0222         np=1;               % number of parameters = 1
0223         w = (1+(p(1)*v).^2).^-1;
0224         
0225     case 'rectangle'
0226         w = ones(size(v));
0227         
0228     case 'triangle'
0229         if nargin<4, p=1; end;
0230         np=1;               % number of parameters = 1
0231         w = 1-abs(v).^p(1);
0232         
0233     case 'gaussian'
0234         if nargin<4, p=3; end;
0235         w=exp(-0.5*p(1)^2*(v.*v));
0236         np=1;
0237         
0238     case 'kaiser'
0239         if nargin<4, p=8; end;
0240         w=besseli(0,p*sqrt(1-v.^2))/besseli(0,p(1));
0241         np=1;
0242         
0243     case 'hamming'
0244         w = 0.54+0.46*cos(pi*v);
0245         
0246     case 'blackman'
0247         w = 0.42+0.5*cos(pi*v) + 0.08*cos(2*pi*v);
0248         
0249     case 'harris3'
0250         w = 0.42323 + 0.49755*cos(pi*v) + 0.07922*cos(2*pi*v);
0251         
0252     case 'harris4'
0253         w = 0.35875 + 0.48829*cos(pi*v) + 0.14128*cos(2*pi*v) + 0.01168*cos(3*pi*v);
0254         
0255     case 'vorbis'
0256         w = sin(0.25*pi*(1+cos(pi*v)));
0257         
0258     case 'rsqvorbis'
0259         w = 0.571-0.429*cos(0.5*pi*(1+cos(pi*v)));
0260         
0261     otherwise
0262         error(sprintf('Unknown window type: %s', wtype));
0263 end;
0264 % now convolve with rectangle
0265 if ov
0266     %     w=filter(ones(1,ov),1,w); % more adds but might be just as efficient as cumsum
0267     w=cumsum(w);
0268     w(n+1:n+ov-1)=w(n)-w(n-ov+1:n-1);
0269     w(ov+1:n)=w(ov+1:n)-w(1:n-ov);
0270     n=n+ov-1; % restore original value of n
0271 end
0272 % scale if required
0273 mk=find(mode>='1' & mode<='9',1);
0274 if numel(mk)
0275     g=1/(mode(mk)-'0');
0276 else
0277     g=1;
0278 end
0279 if any(mode=='d')
0280     w=w*(g/sum(w));
0281 elseif any(mode=='D') || any(mode=='a')
0282     w=w*(g/mean(w));
0283 elseif any(mode=='e')
0284     w=w*sqrt(g/sum(w.^2));
0285 elseif any(mode=='E')
0286     w=w*sqrt(g/mean(w.^2));
0287 elseif any(mode=='p')
0288     w=w*(g/max(w));
0289 end
0290 if any(mode=='q')
0291     w=sqrt(w);
0292 end
0293 
0294 if ~nargout
0295     v_windinfo(w,n);
0296     if np>0
0297         title(sprintf('%s (%s ) window  - mode=''%s''',wtype,sprintf(' %g',p(1:np)),mode));
0298     else
0299         title(sprintf('%s window - mode=''%s''',wtype,mode));
0300     end
0301 end;
0302

Generated on Mon 06-Aug-2018 14:48:32 by m2html © 2003