annotate src/Support/Module.cc @ 16:2a5354042241

-Updated the Slaney IIR gammatone to use a cascase of four second-order filters as per the implementtion in Slaney's auditory toolbox. This is more numerically stable at high sample rates and low centre frequencies.
author tomwalters
date Sat, 20 Feb 2010 17:56:40 +0000
parents 3078854c634a
children fff25824d1d1
rev   line source
tomwalters@0 1 // Copyright 2010, Thomas Walters
tomwalters@0 2 //
tomwalters@0 3 // AIM-C: A C++ implementation of the Auditory Image Model
tomwalters@0 4 // http://www.acousticscale.org/AIMC
tomwalters@0 5 //
tomwalters@0 6 // This program is free software: you can redistribute it and/or modify
tomwalters@0 7 // it under the terms of the GNU General Public License as published by
tomwalters@0 8 // the Free Software Foundation, either version 3 of the License, or
tomwalters@0 9 // (at your option) any later version.
tomwalters@0 10 //
tomwalters@0 11 // This program is distributed in the hope that it will be useful,
tomwalters@0 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
tomwalters@0 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
tomwalters@0 14 // GNU General Public License for more details.
tomwalters@0 15 //
tomwalters@0 16 // You should have received a copy of the GNU General Public License
tomwalters@0 17 // along with this program. If not, see <http://www.gnu.org/licenses/>.
tomwalters@0 18
tomwalters@0 19 /*! \file
tomwalters@0 20 * \brief Base class for all AIM-C modules.
tomwalters@0 21 */
tomwalters@0 22
tomwalters@0 23 /*! \author: Thomas Walters <tom@acousticscale.org>
tomwalters@0 24 * \date 2010/01/23
tomwalters@0 25 * \version \$Id$
tomwalters@0 26 */
tomwalters@0 27
tomwalters@0 28 #include "Support/Module.h"
tomwalters@0 29
tomwalters@0 30 #include <utility>
tomwalters@0 31
tomwalters@0 32 namespace aimc {
tomwalters@0 33 using std::pair;
tomwalters@0 34 Module::Module(Parameters *parameters) {
tomwalters@0 35 initialized_ = false;
tomwalters@0 36 targets_.clear();
tomwalters@0 37 parameters_ = parameters;
tomwalters@0 38 module_identifier_ = "MODULE IDENTIFIER NOT SET";
tomwalters@0 39 module_type_ = "MODULE TYPE NOT SET";
tomwalters@0 40 module_description_ = "MODULE DESCRIPTION NOT SET";
tomwalters@0 41 module_version_ = "MODULE VERSION NOT SET";
tomwalters@0 42 };
tomwalters@0 43
tomwalters@0 44 Module::~Module() {
tomwalters@0 45 };
tomwalters@0 46
tomwalters@0 47 bool Module::Initialize(const SignalBank &input) {
tomwalters@6 48 LOG_INFO_NN(_T("-> %s "), module_identifier_.c_str());
tomwalters@0 49 // Validate the input
tomwalters@0 50 if (!input.Validate()) {
tomwalters@6 51 LOG_ERROR(_T("Input SignalBank not valid"));
tomwalters@0 52 return false;
tomwalters@0 53 }
tomwalters@1 54 if (!InitializeInternal(input)) {
tomwalters@6 55 LOG_ERROR(_T("Initialization failed in module %s"),
tomwalters@6 56 module_identifier_.c_str());
tomwalters@0 57 return false;
tomwalters@0 58 }
tomwalters@0 59 // If the module has an output bank, then we can set up the targets
tomwalters@0 60 // of this module..
tomwalters@0 61 if (output_.initialized()) {
tomwalters@0 62 // Check that the output SignalBank has been set up correctly
tomwalters@0 63 if (!output_.Validate()) {
tomwalters@6 64 LOG_ERROR(_T("Output SignalBank not valid in module %s"),
tomwalters@6 65 module_identifier_.c_str());
tomwalters@0 66 return false;
tomwalters@0 67 }
tomwalters@0 68 // Iterate through all the targets of this module, initializing
tomwalters@0 69 // them if they have not already been initialized. If they have
tomwalters@0 70 // already been initialized, then they are assumed to have been
tomwalters@0 71 // set up to accept an input SignalBank of the correct form, but
tomwalters@0 72 // this is not checked.
tomwalters@0 73 set<Module*>::const_iterator it;
tomwalters@0 74 for (it = targets_.begin(); it != targets_.end(); ++it) {
tomwalters@0 75 if (!(*it)->initialized())
tomwalters@0 76 if (!(*it)->Initialize(output_))
tomwalters@0 77 return false;
tomwalters@0 78 }
tomwalters@6 79 } else {
tomwalters@6 80 LOG_INFO(_T("|"));
tomwalters@0 81 }
tomwalters@0 82 initialized_ = true;
tomwalters@0 83 return true;
tomwalters@0 84 }
tomwalters@0 85
tomwalters@3 86 void Module::Reset() {
tomwalters@3 87 if (!initialized_)
tomwalters@3 88 return;
tomwalters@3 89
tomwalters@3 90 ResetInternal();
tomwalters@3 91
tomwalters@3 92 // Iterate through all the targets of this module, resetting
tomwalters@3 93 // them.
tomwalters@3 94 set<Module*>::const_iterator it;
tomwalters@3 95 for (it = targets_.begin(); it != targets_.end(); ++it)
tomwalters@3 96 (*it)->Reset();
tomwalters@3 97 }
tomwalters@3 98
tomwalters@0 99 bool Module::initialized() const {
tomwalters@0 100 return initialized_;
tomwalters@0 101 }
tomwalters@0 102
tomwalters@0 103 bool Module::AddTarget(Module* target_module) {
tomwalters@0 104 if (target_module) {
tomwalters@0 105 pair<set<Module*>::iterator, bool> ret;
tomwalters@0 106 ret = targets_.insert(target_module);
tomwalters@0 107 return ret.second;
tomwalters@0 108 }
tomwalters@0 109 return false;
tomwalters@0 110 }
tomwalters@0 111
tomwalters@9 112 bool Module::RemoveTarget(Module* target_module) {
tomwalters@0 113 if (targets_.erase(target_module) != 0)
tomwalters@0 114 return true;
tomwalters@0 115 return false;
tomwalters@0 116 }
tomwalters@0 117
tomwalters@9 118 void Module::RemoveAllTargets() {
tomwalters@0 119 targets_.clear();
tomwalters@0 120 }
tomwalters@0 121
tomwalters@0 122 const SignalBank* Module::GetOutputBank() const {
tomwalters@0 123 return &output_;
tomwalters@0 124 }
tomwalters@0 125
tomwalters@0 126 void Module::PushOutput() {
tomwalters@0 127 if (output_.initialized()) {
tomwalters@0 128 set<Module*>::const_iterator it;
tomwalters@0 129 for (it = targets_.begin(); it != targets_.end(); ++it) {
tomwalters@0 130 (*it)->Process(output_);
tomwalters@0 131 }
tomwalters@0 132 }
tomwalters@0 133 }
tomwalters@8 134 } // namespace aimc
tomwalters@0 135