annotate toolboxes/MIRtoolbox1.3.2/AuditoryToolbox/ERBFilterBank.m @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
rev   line source
wolffd@0 1 function output = ERBFilterBank(x, fcoefs)
wolffd@0 2 % function output = ERBFilterBank(x, fcoefs)
wolffd@0 3 % Process an input waveform with a gammatone filter bank. This function
wolffd@0 4 % takes a single sound vector, and returns an array of filter outputs, one
wolffd@0 5 % channel per row.
wolffd@0 6 %
wolffd@0 7 % The fcoefs parameter, which completely specifies the Gammatone filterbank,
wolffd@0 8 % should be designed with the MakeERBFilters function. If it is omitted,
wolffd@0 9 % the filter coefficients are computed for you assuming a 22050Hz sampling
wolffd@0 10 % rate and 64 filters regularly spaced on an ERB scale from fs/2 down to 100Hz.
wolffd@0 11 %
wolffd@0 12
wolffd@0 13 % Malcolm Slaney @ Interval, June 11, 1998.
wolffd@0 14 % (c) 1998 Interval Research Corporation
wolffd@0 15 % Thanks to Alain de Cheveigne' for his suggestions and improvements.
wolffd@0 16
wolffd@0 17 if nargin < 1
wolffd@0 18 error('Syntax: output_array = ERBFilterBank(input_vector[, fcoefs]);');
wolffd@0 19 end
wolffd@0 20
wolffd@0 21 if nargin < 2
wolffd@0 22 fcoefs = MakeERBFilters(22050,64,100);
wolffd@0 23 end
wolffd@0 24
wolffd@0 25 if size(fcoefs,2) ~= 10
wolffd@0 26 error('fcoefs parameter passed to ERBFilterBank is the wrong size.');
wolffd@0 27 end
wolffd@0 28
wolffd@0 29 A0 = fcoefs(:,1);
wolffd@0 30 A11 = fcoefs(:,2);
wolffd@0 31 A12 = fcoefs(:,3);
wolffd@0 32 A13 = fcoefs(:,4);
wolffd@0 33 A14 = fcoefs(:,5);
wolffd@0 34 A2 = fcoefs(:,6);
wolffd@0 35 B0 = fcoefs(:,7);
wolffd@0 36 B1 = fcoefs(:,8);
wolffd@0 37 B2 = fcoefs(:,9);
wolffd@0 38 gain= fcoefs(:,10);
wolffd@0 39
wolffd@0 40 output = zeros(size(gain,1), length(x));
wolffd@0 41 for chan = 1: size(gain,1)
wolffd@0 42 y1=filter([A0(chan)/gain(chan) A11(chan)/gain(chan) ...
wolffd@0 43 A2(chan)/gain(chan)], ...
wolffd@0 44 [B0(chan) B1(chan) B2(chan)], x);
wolffd@0 45 y2=filter([A0(chan) A12(chan) A2(chan)], ...
wolffd@0 46 [B0(chan) B1(chan) B2(chan)], y1);
wolffd@0 47 y3=filter([A0(chan) A13(chan) A2(chan)], ...
wolffd@0 48 [B0(chan) B1(chan) B2(chan)], y2);
wolffd@0 49 y4=filter([A0(chan) A14(chan) A2(chan)], ...
wolffd@0 50 [B0(chan) B1(chan) B2(chan)], y3);
wolffd@0 51 output(chan, :) = y4;
wolffd@0 52 end
wolffd@0 53
wolffd@0 54 if 0
wolffd@0 55 semilogx((0:(length(x)-1))*(fs/length(x)),20*log10(abs(fft(output))));
wolffd@0 56 end