Mercurial > hg > aimc
changeset 696:d8a404fbc4df
Rename variables to be consistent with the rest of the library.
author | ronw@google.com |
---|---|
date | Thu, 27 Jun 2013 15:30:46 +0000 |
parents | 2e3672df5698 |
children | c64fdcc4f250 |
files | trunk/carfac/carfac_test.cc trunk/carfac/sai.cc trunk/carfac/sai.h trunk/carfac/sai_test.cc |
diffstat | 4 files changed, 74 insertions(+), 69 deletions(-) [+] |
line wrap: on
line diff
--- a/trunk/carfac/carfac_test.cc Wed Jun 26 23:35:47 2013 +0000 +++ b/trunk/carfac/carfac_test.cc Thu Jun 27 15:30:46 2013 +0000 @@ -68,8 +68,8 @@ // Reads a size rows vector of size columns Container objects from a // multi-column text file generated by the Matlab version of CARFAC. template <typename Container = ArrayX, bool ColMajor = true> -vector<Container> Load2dTestData(const string& filename, const int rows, - const int columns) { +vector<Container> Load2dTestData(const string& filename, int rows, + int columns) { string fullfile = kTestSourceDir + filename; ifstream file(fullfile.c_str()); vector<Container> output; @@ -96,19 +96,22 @@ // Reads a two dimensional vector of audio data from a text file // containing the output of the Matlab wavread() function. vector<vector<float>> Load2dAudioVector(string filename, int timepoints, - int channels) { - return Load2dTestData<vector<float>, false>(filename, timepoints, channels); + int num_channels) { + return Load2dTestData<vector<float>, false>(filename, timepoints, + num_channels); } class CARFACTest : public testing::Test { protected: - deque<vector<ArrayX>> LoadTestData( - const string& basename, int n_timepoints, int n_ears, int n_ch) const { - deque<vector<ArrayX>> test_data(n_timepoints, vector<ArrayX>(n_ears)); - for (int ear = 0; ear < n_ears; ++ear) { + deque<vector<ArrayX>> LoadTestData(const string& basename, + int num_samples, + int num_ears, + int num_channels) const { + deque<vector<ArrayX>> test_data(num_samples, vector<ArrayX>(num_ears)); + for (int ear = 0; ear < num_ears; ++ear) { string filename = basename + std::to_string(ear + 1) + ".txt"; - vector<ArrayX> data = Load2dTestData(filename, n_timepoints, n_ch); - for (int i = 0; i < n_timepoints; ++i) { + vector<ArrayX> data = Load2dTestData(filename, num_samples, num_channels); + for (int i = 0; i < num_samples; ++i) { test_data[i][ear] = data[i]; } } @@ -117,10 +120,12 @@ void AssertCARFACOutputNear(const deque<vector<ArrayX>>& expected, const deque<vector<ArrayX>>& actual, - int n_timepoints, int n_ears, int n_ch) const { - for (int timepoint = 0; timepoint < n_timepoints; ++timepoint) { - for (int ear = 0; ear < n_ears; ++ear) { - for (int channel = 0; channel < n_ch; ++channel) { + int num_samples, + int num_ears, + int num_channels) const { + for (int timepoint = 0; timepoint < num_samples; ++timepoint) { + for (int ear = 0; ear < num_ears; ++ear) { + for (int channel = 0; channel < num_channels; ++channel) { const float kPrecisionLevel = 1.0e-7; ASSERT_NEAR(expected[timepoint][ear](channel), actual[timepoint][ear](channel), @@ -136,12 +141,12 @@ }; TEST_F(CARFACTest, BinauralData) { - const int n_timepoints = 882; - const int n_ears = 2; - const int n_ch = 71; + const int kNumSamples = 882; + const int kNumEars = 2; + const int kNumChannels = 71; vector<vector<float>> sound_data = - Load2dAudioVector("file_signal_binaural_test.txt", n_timepoints, n_ears); - CARFAC carfac(n_ears, 22050, car_params_, ihc_params_, agc_params_); + Load2dAudioVector("file_signal_binaural_test.txt", kNumSamples, kNumEars); + CARFAC carfac(kNumEars, 22050, car_params_, ihc_params_, agc_params_); CARFACOutput output(true, true, false, false); const bool kOpenLoop = false; const int length = sound_data[0].size(); @@ -153,22 +158,22 @@ WriteNAPOutput(output, "cpp_nap_output_2_binaural_test.txt", 1); deque<vector<ArrayX>> expected_nap = - LoadTestData("binaural_test_nap", n_timepoints, n_ears, n_ch); + LoadTestData("binaural_test_nap", kNumSamples, kNumEars, kNumChannels); AssertCARFACOutputNear(expected_nap, output.nap(), - n_timepoints, n_ears, n_ch); + kNumSamples, kNumEars, kNumChannels); deque<vector<ArrayX>> expected_bm = - LoadTestData("binaural_test_bm", n_timepoints, n_ears, n_ch); + LoadTestData("binaural_test_bm", kNumSamples, kNumEars, kNumChannels); AssertCARFACOutputNear(expected_bm, output.bm(), - n_timepoints, n_ears, n_ch); + kNumSamples, kNumEars, kNumChannels); } TEST_F(CARFACTest, LongBinauralData) { - const int n_timepoints = 2000; - const int n_ears = 2; - const int n_ch = 83; + const int kNumSamples = 2000; + const int kNumEars = 2; + const int kNumChannels = 83; vector<vector<float>> sound_data = - Load2dAudioVector("file_signal_long_test.txt", n_timepoints, n_ears); - CARFAC carfac(n_ears, 44100, car_params_, ihc_params_, agc_params_); + Load2dAudioVector("file_signal_long_test.txt", kNumSamples, kNumEars); + CARFAC carfac(kNumEars, 44100, car_params_, ihc_params_, agc_params_); CARFACOutput output(true, true, false, false); const bool kOpenLoop = false; const int length = sound_data[0].size(); @@ -180,11 +185,11 @@ WriteNAPOutput(output, "cpp_nap_output_2_long_test.txt", 1); deque<vector<ArrayX>> expected_nap = - LoadTestData("long_test_nap", n_timepoints, n_ears, n_ch); + LoadTestData("long_test_nap", kNumSamples, kNumEars, kNumChannels); AssertCARFACOutputNear(expected_nap, output.nap(), - n_timepoints, n_ears, n_ch); + kNumSamples, kNumEars, kNumChannels); deque<vector<ArrayX>> expected_bm = - LoadTestData("long_test_bm", n_timepoints, n_ears, n_ch); + LoadTestData("long_test_bm", kNumSamples, kNumEars, kNumChannels); AssertCARFACOutputNear(expected_bm, output.bm(), - n_timepoints, n_ears, n_ch); + kNumSamples, kNumEars, kNumChannels); }
--- a/trunk/carfac/sai.cc Wed Jun 26 23:35:47 2013 +0000 +++ b/trunk/carfac/sai.cc Thu Jun 27 15:30:46 2013 +0000 @@ -30,10 +30,10 @@ "SAI window_width must be larger than width."); int buffer_width = params_.width + - static_cast<int>((1 + static_cast<float>(params_.n_window_pos - 1)/2) * + static_cast<int>((1 + static_cast<float>(params_.num_window_pos - 1)/2) * params_.window_width); - input_buffer_.setZero(params_.n_ch, buffer_width); - output_buffer_.setZero(params_.n_ch, params_.width); + input_buffer_.setZero(params_.num_channels, buffer_width); + output_buffer_.setZero(params_.num_channels, params_.width); window_.setLinSpaced(params_.window_width, kPi / params_.window_width, kPi) .sin(); @@ -48,21 +48,21 @@ ArrayXX* output_frame) { assert(!input.empty() || input.size() <= params_.window_width && "Unexpected input size."); - assert(input[0].size() == params_.n_ch && + assert(input[0].size() == params_.num_channels && "Unexpected input frame size."); // Append new data to the input buffer. - int n_shift = input.size(); - int shift_width = input_buffer_.cols() - n_shift; - input_buffer_.topLeftCorner(params_.n_ch, shift_width).swap( - input_buffer_.block(0, n_shift, params_.n_ch, shift_width)); + int num_shift = input.size(); + int shift_width = input_buffer_.cols() - num_shift; + input_buffer_.topLeftCorner(params_.num_channels, shift_width).swap( + input_buffer_.block(0, num_shift, params_.num_channels, shift_width)); for (int i = 0; i < input.size(); ++i) { input_buffer_.block(0, shift_width + i, input[i].size(), 1) = input[i]; } // Zero-pad the buffer if necessary. if (input.size() < params_.window_width) { int pad_width = params_.window_width - input.size(); - input_buffer_.topRightCorner(params_.n_ch, pad_width).setZero(); + input_buffer_.topRightCorner(params_.num_channels, pad_width).setZero(); } StabilizeSegment(input_buffer_, &output_buffer_); @@ -74,17 +74,17 @@ // Windows are always approximately 50% overlapped. float window_hop = params_.window_width / 2; int window_start = (input_buffer.cols() - params_.window_width) - - (params_.n_window_pos - 1) * window_hop; + (params_.num_window_pos - 1) * window_hop; int window_range_start = window_start - params_.future_lags - 1; int offset_range_start = window_start - params_.width; assert(offset_range_start >= 0); - for (int i = 0; i < params_.n_ch; ++i) { + for (int i = 0; i < params_.num_channels; ++i) { // TODO(ronw): Rename this here and in the Matlab code since the // input doesn't have to contain naps. const ArrayX& nap_wave = input_buffer.row(i); // TODO(ronw): Smooth row. - for (int w = 0; w < params_.n_window_pos; ++w) { + for (int w = 0; w < params_.num_window_pos; ++w) { int current_window_offset = w * window_hop; // Choose a trigger point. int trigger_time;
--- a/trunk/carfac/sai.h Wed Jun 26 23:35:47 2013 +0000 +++ b/trunk/carfac/sai.h Thu Jun 27 15:30:46 2013 +0000 @@ -27,7 +27,7 @@ // Design parameters for a single SAI. struct SAIParams { // Number of channels (height) of the SAI. - int n_ch; + int num_channels; // TODO(ronw): Consider parameterizing this as past_lags and // future_lags, with width == past_lags + 1 + future_lags. @@ -37,7 +37,7 @@ // 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; + int num_window_pos; // TODO(ronw): more carefully define terms "window" and "frame" @@ -57,11 +57,11 @@ // Reset the internal state. void Reset(); - // Fills output_frame with a params_.n_ch by params_.width SAI frame + // Fills output_frame with a params_.num_channels 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. + // params_.num_channels. 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); @@ -77,9 +77,9 @@ // 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. + // a full SAI frame. Size: params_.num_channels by params_.buffer_width. ArrayXX input_buffer_; - // Output frame buffer. Size: params_.n_ch by params_.width. + // Output frame buffer. Size: params_.num_channels by params_.width. ArrayXX output_buffer_; };
--- a/trunk/carfac/sai_test.cc Wed Jun 26 23:35:47 2013 +0000 +++ b/trunk/carfac/sai_test.cc Thu Jun 27 15:30:46 2013 +0000 @@ -36,10 +36,10 @@ using testing::Values; using std::vector; -vector<ArrayX> CreateZeroSegment(int n_ch, int length) { +vector<ArrayX> CreateZeroSegment(int num_channels, int length) { vector<ArrayX> segment; for (int i = 0; i < length; ++i) { - segment.push_back(ArrayX::Zero(n_ch)); + segment.push_back(ArrayX::Zero(num_channels)); } return segment; } @@ -77,16 +77,16 @@ protected: void SetUp() { period_ = std::tr1::get<0>(GetParam()); - n_ch_ = std::tr1::get<1>(GetParam()); + num_channels_ = std::tr1::get<1>(GetParam()); } int period_; - int n_ch_; + int num_channels_; }; TEST_P(SAIPeriodicInputTest, MultiChannelPulseTrain) { - vector<ArrayX> segment = CreateZeroSegment(n_ch_, 38); - for (int i = 0; i < n_ch_; ++i) { + vector<ArrayX> segment = CreateZeroSegment(num_channels_, 38); + for (int i = 0; i < num_channels_; ++i) { // Begin each channel at a different phase. const int phase = i; for (int j = phase; j < segment.size(); j += period_) { @@ -96,12 +96,12 @@ SAIParams sai_params; sai_params.window_width = segment.size(); - sai_params.n_ch = n_ch_; + sai_params.num_channels = num_channels_; sai_params.width = 15; // Half of the SAI should come from the future. // sai_params.future_lags = sai_params.width / 2; sai_params.future_lags = 0; - sai_params.n_window_pos = 2; + sai_params.num_window_pos = 2; SAI sai(sai_params); ArrayXX sai_frame; @@ -109,7 +109,7 @@ // The output should have peaks at the same positions, regardless of // input phase. - for (int i = 0; i < n_ch_; ++i) { + for (int i = 0; i < num_channels_; ++i) { const ArrayX& sai_channel = sai_frame.row(i); for (int j = sai_channel.size() - 1; j >= 0; j -= period_) { EXPECT_TRUE(HasPeakAt(sai_channel, j)); @@ -123,26 +123,26 @@ } INSTANTIATE_TEST_CASE_P(PeriodicInputVariations, SAIPeriodicInputTest, testing::Combine(Values(25, 10, 5, 2), // periods. - Values(1, 2, 15))); // n_ch. + Values(1, 2, 15))); // num_channels. TEST(SAITest, CARFACIntegration) { - const int n_ears = 1; - const int length = 300; - vector<vector<float>> segment(n_ears, vector<float>(length, 0.0)); + const int kNumEars = 1; + const int kNumSamples = 300; + vector<vector<float>> segment(kNumEars, vector<float>(kNumSamples, 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.setLinSpaced(kNumSamples, 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); + CARFAC carfac(kNumEars, 800, car_params, ihc_params, agc_params); CARFACOutput output(true, false, false, false); const bool kOpenLoop = false; - carfac.RunSegment(segment, 0, length, kOpenLoop, &output); + carfac.RunSegment(segment, 0, kNumSamples, kOpenLoop, &output); vector<ArrayX> nap_segment; nap_segment.reserve(output.nap().size()); @@ -151,12 +151,12 @@ } SAIParams sai_params; - sai_params.window_width = length; - sai_params.n_ch = carfac.num_channels(); + sai_params.window_width = kNumSamples; + sai_params.num_channels = 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_params.num_window_pos = 2; SAI sai(sai_params); ArrayXX sai_frame; sai.RunSegment(nap_segment, &sai_frame);