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