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: }