diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolboxes/MIRtoolbox1.3.2/AuditoryToolbox/ERBFilterBank.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,56 @@
+function output = ERBFilterBank(x, fcoefs)
+% function output = ERBFilterBank(x, fcoefs)
+% Process an input waveform with a gammatone filter bank. This function 
+% takes a single sound vector, and returns an array of filter outputs, one 
+% channel per row.
+%
+% The fcoefs parameter, which completely specifies the Gammatone filterbank,
+% should be designed with the MakeERBFilters function.  If it is omitted,
+% the filter coefficients are computed for you assuming a 22050Hz sampling
+% rate and 64 filters regularly spaced on an ERB scale from fs/2 down to 100Hz.
+%
+
+% Malcolm Slaney @ Interval, June 11, 1998.
+% (c) 1998 Interval Research Corporation  
+% Thanks to Alain de Cheveigne' for his suggestions and improvements.
+
+if nargin < 1
+	error('Syntax: output_array = ERBFilterBank(input_vector[, fcoefs]);');
+end
+
+if nargin < 2
+	fcoefs = MakeERBFilters(22050,64,100);
+end
+
+if size(fcoefs,2) ~= 10
+	error('fcoefs parameter passed to ERBFilterBank is the wrong size.');
+end
+
+A0  = fcoefs(:,1);
+A11 = fcoefs(:,2);
+A12 = fcoefs(:,3);
+A13 = fcoefs(:,4);
+A14 = fcoefs(:,5);
+A2  = fcoefs(:,6);
+B0  = fcoefs(:,7);
+B1  = fcoefs(:,8);
+B2  = fcoefs(:,9);
+gain= fcoefs(:,10);	
+
+output = zeros(size(gain,1), length(x));
+for chan = 1: size(gain,1)
+	y1=filter([A0(chan)/gain(chan) A11(chan)/gain(chan) ...
+		   A2(chan)/gain(chan)], ...
+				[B0(chan) B1(chan) B2(chan)], x);
+	y2=filter([A0(chan) A12(chan) A2(chan)], ...
+				[B0(chan) B1(chan) B2(chan)], y1);
+	y3=filter([A0(chan) A13(chan) A2(chan)], ...
+				[B0(chan) B1(chan) B2(chan)], y2);
+	y4=filter([A0(chan) A14(chan) A2(chan)], ...
+				[B0(chan) B1(chan) B2(chan)], y3);
+	output(chan, :) = y4;
+end
+
+if 0
+	semilogx((0:(length(x)-1))*(fs/length(x)),20*log10(abs(fft(output))));
+end