Mercurial > hg > aimc
view trunk/carfac/sai.h @ 691:d04114ac773d
Test SAI with multi-channel input.
author | ronw@google.com |
---|---|
date | Tue, 11 Jun 2013 22:05:10 +0000 |
parents | e50aee5046b1 |
children | 2d432ff51f64 |
line wrap: on
line source
// Copyright 2013, Google, Inc. // Author: Ron Weiss <ronw@google.com> // // This C++ file is part of an implementation of Lyon's cochlear model: // "Cascade of Asymmetric Resonators with Fast-Acting Compression" // to supplement Lyon's upcoming book "Human and Machine Hearing" // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef CARFAC_SAI_H_ #define CARFAC_SAI_H_ #include <vector> #include "common.h" // Design parameters for a single SAI. struct SAIParams { // Number of channels (height) of the SAI. int n_ch; // TODO(ronw): Consider parameterizing this as past_lags and // future_lags, with width == past_lags + 1 + future_lags. // // Total width (i.e. number of lag samples) of the SAI. int width; // Number of lag samples that should come from the future. int future_lags; // Number of windows (triggers) to consider during each SAI frame. int n_window_pos; // TODO(ronw): more carefully define terms "window" and "frame" // Size of the window to compute. int window_width; FPType channel_smoothing_scale; }; class SAI { public: explicit SAI(const SAIParams& params); // Fills output_frame with a params_.n_ch by params_.width SAI frame // computed from the given input frames. // // The input should have dimensionality of params_.window_width by // params_.n_ch. Inputs containing too few frames are zero-padded. // FIXME: ArrayXX input type would be less awkward. void RunSegment(const std::vector<ArrayX>& input, ArrayXX* output_output_frame); private: // Processes successive windows within input_buffer, choose trigger // points, and blend each window into output_buffer. void StabilizeSegment(const ArrayXX& input_buffer, ArrayXX* output_buffer) const; SAIParams params_; // Window function to apply before selecting a trigger point. // Size: params_.window_width. ArrayX window_; // Buffer to store a large enough window of input frames to compute // a full SAI frame. Size: params_.n_ch by params_.buffer_width. ArrayXX input_buffer_; // Output frame buffer. Size: params_.n_ch by params_.width. ArrayXX output_buffer_; }; #endif // CARFAC_SAI_H_