# HG changeset patch # User ronw@google.com # Date 1372289747 0 # Node ID 755c401da7a71f724dbd20f31beb8c88d74cf4f9 # Parent aaa4f60ebf9c21113f5685b28bd6ea03cfdf8d80 Simple integration test between CARFAC and SAI. The interface between the two classes is pretty clunky because of the way CARFACOutput stores things. We should work on this, probably by rotating the outer two dimensions of CARFACOutput (i.e. store outputs in containers with sizes n_ears x n_samples x n_channels instead of n_samples x n_ears x n_channels). diff -r aaa4f60ebf9c -r 755c401da7a7 carfac/carfac.h --- a/carfac/carfac.h Mon Jun 24 16:35:21 2013 +0000 +++ b/carfac/carfac.h Wed Jun 26 23:35:47 2013 +0000 @@ -67,6 +67,8 @@ const int32_t start, const int32_t length, const bool open_loop, CARFACOutput* seg_output); + int num_channels() const { return num_channels_; } + private: void DesignCARCoeffs(const CARParams& car_params, const FPType sample_rate, const ArrayX& pole_freqs, CARCoeffs* car_coeffs); diff -r aaa4f60ebf9c -r 755c401da7a7 carfac/sai_test.cc --- a/carfac/sai_test.cc Mon Jun 24 16:35:21 2013 +0000 +++ b/carfac/sai_test.cc Wed Jun 26 23:35:47 2013 +0000 @@ -22,8 +22,17 @@ #include #include +#include + #include "gtest/gtest.h" +#include "agc.h" +#include "car.h" +#include "carfac.h" +#include "carfac_output.h" +#include "common.h" +#include "ihc.h" + using testing::Values; using std::vector; @@ -35,6 +44,25 @@ return segment; } +void PrintSAIInput(const vector& input) { + for (int i = 0; i < input[0].size(); ++i) { + for (int j = 0; j < input.size(); ++j) { + std::cout << input[j](i) << " "; + } + std::cout << "\n"; + } +} + +void PrintSAIFrame(const ArrayXX& sai_frame) { + for (int i = 0; i < sai_frame.rows(); ++i) { + for (int j = 0; j < sai_frame.cols(); ++j) { + std::cout << sai_frame(i, j) << " "; + } + std::cout << "\n"; + } + std::cout << "\n"; +} + bool HasPeakAt(const ArrayX& frame, int index) { if (index == 0) { return frame(index) > frame(index + 1); @@ -89,22 +117,49 @@ } std::cout << "Input:\n"; - for (int i = 0; i < n_ch_; ++i) { - for (int j = 0; j < segment.size(); ++j) { - std::cout << segment[j](i) << " "; - } - std::cout << "\n"; - } - + PrintSAIInput(segment); std::cout << "Output:\n"; - for (int i = 0; i < sai_frame.rows(); ++i) { - for (int j = 0; j < sai_frame.cols(); ++j) { - std::cout << sai_frame(i, j) << " "; - } - std::cout << "\n"; - } - std::cout << "\n"; + PrintSAIFrame(sai_frame); } INSTANTIATE_TEST_CASE_P(PeriodicInputVariations, SAIPeriodicInputTest, testing::Combine(Values(25, 10, 5, 2), // periods. Values(1, 2, 15))); // n_ch. + +TEST(SAITest, CARFACIntegration) { + const int n_ears = 1; + const int length = 300; + vector> segment(n_ears, vector(length, 0.0)); + + // Sinusoid input. + const float kFrequency = 10; + Eigen::Map segment_array(&segment[0][0], segment[0].size()); + segment_array.setLinSpaced(length, 0.0, 2 * kFrequency * kPi); + segment_array.sin(); + + CARParams car_params; + IHCParams ihc_params; + AGCParams agc_params; + CARFAC carfac(n_ears, 800, car_params, ihc_params, agc_params); + CARFACOutput output(true, false, false, false); + const bool kOpenLoop = false; + carfac.RunSegment(segment, 0, length, kOpenLoop, &output); + + vector nap_segment; + nap_segment.reserve(output.nap().size()); + for (const vector& frame : output.nap()) { + nap_segment.push_back(frame[0]); + } + + SAIParams sai_params; + sai_params.window_width = length; + sai_params.n_ch = carfac.num_channels(); + sai_params.width = 20; + // Half of the SAI should come from the future. + sai_params.future_lags = sai_params.width / 2; + sai_params.n_window_pos = 2; + SAI sai(sai_params); + ArrayXX sai_frame; + sai.RunSegment(nap_segment, &sai_frame); + + // TODO(ronw): Test something about the output. +}