tomwalters@0: // Copyright 2010, Thomas Walters tomwalters@0: // tomwalters@0: // AIM-C: A C++ implementation of the Auditory Image Model tomwalters@0: // http://www.acousticscale.org/AIMC tomwalters@0: // tomwalters@0: // This program is free software: you can redistribute it and/or modify tomwalters@0: // it under the terms of the GNU General Public License as published by tomwalters@0: // the Free Software Foundation, either version 3 of the License, or tomwalters@0: // (at your option) any later version. tomwalters@0: // tomwalters@0: // This program is distributed in the hope that it will be useful, tomwalters@0: // but WITHOUT ANY WARRANTY; without even the implied warranty of tomwalters@0: // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tomwalters@0: // GNU General Public License for more details. tomwalters@0: // tomwalters@0: // You should have received a copy of the GNU General Public License tomwalters@0: // along with this program. If not, see . tomwalters@0: tomwalters@0: /*! \file tomwalters@0: * \brief tomwalters@0: */ tomwalters@0: tomwalters@0: /*! \author: Thomas Walters tomwalters@0: * \date 2010/01/23 tomwalters@0: * \version \$Id$ tomwalters@0: */ tomwalters@0: tomwalters@0: #include "Support/SignalBank.h" tomwalters@0: tomwalters@0: namespace aimc { tomwalters@0: using std::deque; tomwalters@0: using std::vector; tomwalters@0: tomwalters@0: SignalBank::SignalBank() { tomwalters@0: sample_rate_ = 0.0f; tomwalters@0: start_time_ = 0; tomwalters@0: channel_count_ = 0; tomwalters@0: buffer_length_ = 0; tomwalters@0: initialized_ = false; tomwalters@0: } tomwalters@0: tomwalters@0: SignalBank::~SignalBank() { tomwalters@0: } tomwalters@0: tomwalters@0: bool SignalBank::Initialize(int channel_count, tomwalters@0: int signal_length, tomwalters@0: float sample_rate) { tomwalters@0: if (channel_count < 1) tomwalters@0: return false; tomwalters@0: if (signal_length < 1) tomwalters@0: return false; tomwalters@0: if (sample_rate < 0.0f) tomwalters@0: return false; tomwalters@0: tomwalters@0: start_time_ = 0; tomwalters@0: sample_rate_ = sample_rate; tomwalters@0: buffer_length_ = signal_length; tomwalters@0: channel_count_ = channel_count; tomwalters@0: signals_.resize(channel_count_); tomwalters@0: strobes_.resize(channel_count_); tomwalters@0: centre_frequencies_.resize(channel_count_, 0.0f); tomwalters@0: for (int i = 0; i < channel_count_; ++i) { tomwalters@0: signals_[i].resize(buffer_length_, 0.0f); tomwalters@0: } tomwalters@0: initialized_ = true; tomwalters@0: return true; tomwalters@0: } tomwalters@0: tomwalters@0: bool SignalBank::Initialize(const SignalBank &input) { tomwalters@0: if (input.channel_count() < 1) tomwalters@0: return false; tomwalters@0: if (input.buffer_length() < 1) tomwalters@0: return false; tomwalters@0: if (input.sample_rate() < 0.0f) tomwalters@0: return false; tomwalters@0: tomwalters@0: start_time_ = input.start_time(); tomwalters@0: sample_rate_ = input.sample_rate(); tomwalters@0: buffer_length_ = input.buffer_length(); tomwalters@0: channel_count_ = input.channel_count(); tomwalters@0: tomwalters@0: signals_.resize(channel_count_); tomwalters@0: strobes_.resize(channel_count_); tomwalters@0: tomwalters@0: centre_frequencies_.resize(channel_count_, 0.0f); tomwalters@0: for (int i = 0; i < channel_count_; ++i) { tomwalters@0: centre_frequencies_[i] = input.get_centre_frequency(i); tomwalters@0: } tomwalters@0: tomwalters@0: for (int i = 0; i < channel_count_; ++i) { tomwalters@0: signals_[i].resize(buffer_length_, 0.0f); tomwalters@0: } tomwalters@0: initialized_ = true; tomwalters@0: return true; tomwalters@0: } tomwalters@0: tomwalters@0: bool SignalBank::Validate() const { tomwalters@0: if (sample_rate_ <= 0.0f) tomwalters@0: return false; tomwalters@0: tomwalters@0: if (static_cast(signals_.size()) < 1) tomwalters@0: return false; tomwalters@0: tomwalters@0: if (static_cast(signals_.size()) != channel_count_) tomwalters@0: return false; tomwalters@0: tomwalters@0: if (static_cast(strobes_.size()) != channel_count_) tomwalters@0: return false; tomwalters@0: tomwalters@0: for (int i = 0; i < channel_count_; ++i) { tomwalters@0: if (static_cast(signals_[i].size()) != buffer_length_) tomwalters@0: return false; tomwalters@0: } tomwalters@0: return true; tomwalters@0: } tomwalters@0: tomwalters@0: inline const vector &SignalBank::operator[](int channel) const { tomwalters@0: return signals_[channel]; tomwalters@0: } tomwalters@0: tomwalters@0: inline float SignalBank::sample(int channel, int index) const { tomwalters@0: return signals_[channel][index]; tomwalters@0: } tomwalters@0: tomwalters@0: inline void SignalBank::set_sample(int channel, int index, float value) { tomwalters@0: signals_[channel][index] = value; tomwalters@0: } tomwalters@0: tomwalters@0: const deque &SignalBank::strobes(int channel) const { tomwalters@0: return strobes_[channel]; tomwalters@0: } tomwalters@0: tomwalters@0: float SignalBank::sample_rate() const { tomwalters@0: return sample_rate_; tomwalters@0: } tomwalters@0: tomwalters@0: int SignalBank::buffer_length() const { tomwalters@0: return buffer_length_; tomwalters@0: } tomwalters@0: tomwalters@0: int SignalBank::start_time() const { tomwalters@0: return start_time_; tomwalters@0: } tomwalters@0: tomwalters@0: void SignalBank::set_start_time(int start_time) { tomwalters@0: start_time_ = start_time; tomwalters@0: } tomwalters@0: tomwalters@0: float SignalBank::get_centre_frequency(int i) const { tomwalters@0: if (i < channel_count_) tomwalters@0: return centre_frequencies_[i]; tomwalters@0: else tomwalters@0: return 0.0f; tomwalters@0: } tomwalters@0: tomwalters@0: void SignalBank::set_centre_frequency(int i, float cf) { tomwalters@0: if (i < channel_count_) tomwalters@0: centre_frequencies_[i] = cf; tomwalters@0: } tomwalters@0: tomwalters@0: bool SignalBank::initialized() const { tomwalters@0: return initialized_; tomwalters@0: } tomwalters@0: tomwalters@0: int SignalBank::channel_count() const { tomwalters@0: return channel_count_; tomwalters@0: } tomwalters@0: }