# HG changeset patch # User tomwalters # Date 1266345655 0 # Node ID a57b29e373c72ddf7161d128309164d48c00d4ec # Parent ce2bab04f155841b18c7366b307169a821c2fd6c - Added stub for a Slaney IIR Gammatone filterbank diff -r ce2bab04f155 -r a57b29e373c7 trunk/src/Modules/BMM/ModuleGammatone.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/trunk/src/Modules/BMM/ModuleGammatone.cc Tue Feb 16 18:40:55 2010 +0000 @@ -0,0 +1,112 @@ +// Copyright 2009-2010, Thomas Walters +// +// AIM-C: A C++ implementation of the Auditory Image Model +// http://www.acousticscale.org/AIMC +// +// 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 3 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 should have received a copy of the GNU General Public License +// along with this program. If not, see . + +/*! \file + * \brief Slaney's gammatone filterbank + * + * \author Thomas Walters + * \date created 2009/11/13 + * \version \$Id$ + */ + +#include + +#include "Modules/BMM/ModuleGammatone.h" + +namespace aimc { +using std::complex; +ModuleGammatone::ModuleGammatone(Parameters *params) : Module(params) { + module_identifier_ = "gtfb"; + module_type_ = "bmm"; + module_description_ = "Gammatone filterbank (Slaney's IIR gammatone)"; + module_version_ = "$Id$"; + + num_channels_ = parameters_->DefaultInt("gtfb.channel_count", 200); + min_frequency_ = parameters_->DefaultFloat("gtfb.min_frequency", 86.0f); + max_frequency_ = parameters_->DefaultFloat("gtfb.max_frequency", 16000.0f); +} + +bool ModuleGammatone::InitializeInternal(const SignalBank& input) { + // Calculate number of channels, and centre frequencies + + forward_.resize(num_channels_); + feedback_.resize(num_channels_); + + for (int ch = 0; ch < num_channels_; ++ch) { + float erb = Freq2ERBw(cf) + + // Sample interval + float dt = 1.0f / fs; + + // Bandwidth parameter + float b = 1.019f * 2.0f * M_PI * erb; + + // All of the following expressions are derived in Apple TR #35, "An + // Efficient Implementation of the Patterson-Holdsworth Cochlear + // Filter Bank". + + // Calculate the gain: + complex exponent(0.0f, 2.0f * cf * M_PI * T); + complex ec = exp(2.0f * complex_exponent); + complex two_cf_pi_t(2.0f * cf * M_PI * T, 0.0f); + complex two_pow(pow(2.0f, (3.0f/2.0f)), 0.0f); + + complex p = -2.0f * ec * T + 2.0f * exp(-(B * T) + exponent) * dt; + + float gain = abs( + (part1 * (cos(two_cf_pi_t) - sqrt(3.0f - twopow) * sin(two_cf_pi_t))) + * (part1 * (cos(two_cf_pi_t) + sqrt(3.0f - twopow) * sin(two_cf_pi_t))) + * (part1 * (cos(two_cf_pi_t) - sqrt(3.0f + twopow) * sin(two_cf_pi_t))) + * (part1 * (cos(two_cf_pi_t) + sqrt(3.0f + twopow) * sin(two_cf_pi_t))) + / pow(-2.0f / exp(2.0f * b * dt) - 2.0f * ec + 2.0f * (1.0f + ec) + / exp(b * dt), 4.0f)); + + // The filter coefficients themselves: + forward[ch].resize(5, 0.0f); + feedback[ch].resize(9, 0.0f); + + forward[ch][0] = pow(T, 4.0f) / gain; + forward[ch][1] = (-4.0f * pow(T, 4.0f) * cos(2.0f * cf * M_PI * dt) + / exp(b * dt) / gain); + forward[ch][2] = (6.0f * pow(T, 4.0f) * cos(4.0f * cf * M_PI * dt) + / exp(2.0f * b * dt) / gain); + forward[ch][3] = (-4.0f * pow(T, 4.0f) * cos(6.0f * cf * M_PI * dt) + / exp(3.0f * b * dt) / gain); + forward[ch][4] = (pow(T,4.0f) * cos(8.0f * cf * M_PI * dt) + / exp(4.0f * b * dt) / gain); + + feedback[ch][0] = 1.0f; + feedback[ch][1] = -8.0f * cos(2.0f * cf * M_PI * T) / exp(b * dt); + feedback[ch][2] = (4.0f * (4.0f + 3.0f * cos(4.0f * cf * M_PI * dt)) + / exp(2.0f * b * dt)); + feedback[ch][3] = (-8.0f * (6.0f * cos(2.0f * cf * M_PI * dt) + + cos(6.0f * cf * M_PI * dt)) + / exp(3.0f * b * dt)); + feedback[ch][4] = (2.0f * (18.0f + 16.0f * cos(4.0f * cf * M_PI * dt) + + cos(8.0f * cf * M_PI * dt)) + / exp(4.0f * b * dt)); + feedback[ch][5] = (-8.0f * (6.0f * cos(2.0f * cf * M_PI * T) + + cos(6.0f * cf * M_PI * T)) + / exp(5.0f * B * T)); + feedback[ch][6] = (4.0f * (4.0f + 3.0f * cos(4.0f * cf * M_PI * T)) + / exp(6.0f * B * T)); + feedback[ch][7] = -8.0f * cos(2.0f * cf * M_PI * dt) / exp(7.0f * b * dt); + feedback[ch][8] = exp(-8.0f * b * dt); + } +} +} // namespace aimc \ No newline at end of file diff -r ce2bab04f155 -r a57b29e373c7 trunk/src/Modules/BMM/ModuleGammatone.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/trunk/src/Modules/BMM/ModuleGammatone.h Tue Feb 16 18:40:55 2010 +0000 @@ -0,0 +1,48 @@ +// Copyright 2009-2010, Thomas Walters +// +// AIM-C: A C++ implementation of the Auditory Image Model +// http://www.acousticscale.org/AIMC +// +// 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 3 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 should have received a copy of the GNU General Public License +// along with this program. If not, see . + +/*! \file + * \brief Slaney's gammatone filterbank + * + * \author Thomas Walters + * \date created 2009/11/13 + * \version \$Id$ + */ + +#include + +namespace aimc { +using std::vector; +class ModuleGammatone : public Module { + public: + ModuleGammatone(Parameters *params); + virtual ~ModuleGammatone(); + //! \brief Process a buffer + virtual void Process(const SignalBank &input); + + private: + virtual bool InitializeInternal(const SignalBank& input); + virtual void ResetInternal(); + vector > forward_; + vector > feedback_; + vector centre_frequencies_; + int num_channels_; + float max_frequency_; + float min_frequency_; +}; +} // namespace aimc \ No newline at end of file