changeset 695:2e3672df5698

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).
author ronw@google.com
date Wed, 26 Jun 2013 23:35:47 +0000
parents a43892e7e5ad
children d8a404fbc4df
files trunk/carfac/carfac.h trunk/carfac/sai_test.cc
diffstat 2 files changed, 71 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/carfac/carfac.h	Mon Jun 24 16:35:21 2013 +0000
+++ b/trunk/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);
--- a/trunk/carfac/sai_test.cc	Mon Jun 24 16:35:21 2013 +0000
+++ b/trunk/carfac/sai_test.cc	Wed Jun 26 23:35:47 2013 +0000
@@ -22,8 +22,17 @@
 #include <iostream>
 #include <vector>
 
+#include <Eigen/Core>
+
 #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<ArrayX>& 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<vector<float>> segment(n_ears, vector<float>(length, 0.0));
+
+  // Sinusoid input.
+  const float kFrequency = 10;
+  Eigen::Map<Eigen::ArrayXf> 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<ArrayX> nap_segment;
+  nap_segment.reserve(output.nap().size());
+  for (const vector<ArrayX>& 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.
+}