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
|