comparison carfac/sai.cc @ 654:a1b82b240328

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 f926e0892dee
children 7a0031c321da
comparison
equal deleted inserted replaced
653:755c401da7a7 654:a1b82b240328
28 void SAI::Redesign(const SAIParams& params) { 28 void SAI::Redesign(const SAIParams& params) {
29 assert(params_.window_width > params_.width && 29 assert(params_.window_width > params_.width &&
30 "SAI window_width must be larger than width."); 30 "SAI window_width must be larger than width.");
31 31
32 int buffer_width = params_.width + 32 int buffer_width = params_.width +
33 static_cast<int>((1 + static_cast<float>(params_.n_window_pos - 1)/2) * 33 static_cast<int>((1 + static_cast<float>(params_.num_window_pos - 1)/2) *
34 params_.window_width); 34 params_.window_width);
35 input_buffer_.setZero(params_.n_ch, buffer_width); 35 input_buffer_.setZero(params_.num_channels, buffer_width);
36 output_buffer_.setZero(params_.n_ch, params_.width); 36 output_buffer_.setZero(params_.num_channels, params_.width);
37 37
38 window_.setLinSpaced(params_.window_width, kPi / params_.window_width, kPi) 38 window_.setLinSpaced(params_.window_width, kPi / params_.window_width, kPi)
39 .sin(); 39 .sin();
40 } 40 }
41 41
46 46
47 void SAI::RunSegment(const std::vector<ArrayX>& input, 47 void SAI::RunSegment(const std::vector<ArrayX>& input,
48 ArrayXX* output_frame) { 48 ArrayXX* output_frame) {
49 assert(!input.empty() || input.size() <= params_.window_width && 49 assert(!input.empty() || input.size() <= params_.window_width &&
50 "Unexpected input size."); 50 "Unexpected input size.");
51 assert(input[0].size() == params_.n_ch && 51 assert(input[0].size() == params_.num_channels &&
52 "Unexpected input frame size."); 52 "Unexpected input frame size.");
53 53
54 // Append new data to the input buffer. 54 // Append new data to the input buffer.
55 int n_shift = input.size(); 55 int num_shift = input.size();
56 int shift_width = input_buffer_.cols() - n_shift; 56 int shift_width = input_buffer_.cols() - num_shift;
57 input_buffer_.topLeftCorner(params_.n_ch, shift_width).swap( 57 input_buffer_.topLeftCorner(params_.num_channels, shift_width).swap(
58 input_buffer_.block(0, n_shift, params_.n_ch, shift_width)); 58 input_buffer_.block(0, num_shift, params_.num_channels, shift_width));
59 for (int i = 0; i < input.size(); ++i) { 59 for (int i = 0; i < input.size(); ++i) {
60 input_buffer_.block(0, shift_width + i, input[i].size(), 1) = input[i]; 60 input_buffer_.block(0, shift_width + i, input[i].size(), 1) = input[i];
61 } 61 }
62 // Zero-pad the buffer if necessary. 62 // Zero-pad the buffer if necessary.
63 if (input.size() < params_.window_width) { 63 if (input.size() < params_.window_width) {
64 int pad_width = params_.window_width - input.size(); 64 int pad_width = params_.window_width - input.size();
65 input_buffer_.topRightCorner(params_.n_ch, pad_width).setZero(); 65 input_buffer_.topRightCorner(params_.num_channels, pad_width).setZero();
66 } 66 }
67 67
68 StabilizeSegment(input_buffer_, &output_buffer_); 68 StabilizeSegment(input_buffer_, &output_buffer_);
69 *output_frame = output_buffer_; 69 *output_frame = output_buffer_;
70 } 70 }
72 void SAI::StabilizeSegment(const ArrayXX& input_buffer, 72 void SAI::StabilizeSegment(const ArrayXX& input_buffer,
73 ArrayXX* output_buffer) const { 73 ArrayXX* output_buffer) const {
74 // Windows are always approximately 50% overlapped. 74 // Windows are always approximately 50% overlapped.
75 float window_hop = params_.window_width / 2; 75 float window_hop = params_.window_width / 2;
76 int window_start = (input_buffer.cols() - params_.window_width) - 76 int window_start = (input_buffer.cols() - params_.window_width) -
77 (params_.n_window_pos - 1) * window_hop; 77 (params_.num_window_pos - 1) * window_hop;
78 int window_range_start = window_start - params_.future_lags - 1; 78 int window_range_start = window_start - params_.future_lags - 1;
79 int offset_range_start = window_start - params_.width; 79 int offset_range_start = window_start - params_.width;
80 assert(offset_range_start >= 0); 80 assert(offset_range_start >= 0);
81 for (int i = 0; i < params_.n_ch; ++i) { 81 for (int i = 0; i < params_.num_channels; ++i) {
82 // TODO(ronw): Rename this here and in the Matlab code since the 82 // TODO(ronw): Rename this here and in the Matlab code since the
83 // input doesn't have to contain naps. 83 // input doesn't have to contain naps.
84 const ArrayX& nap_wave = input_buffer.row(i); 84 const ArrayX& nap_wave = input_buffer.row(i);
85 // TODO(ronw): Smooth row. 85 // TODO(ronw): Smooth row.
86 86
87 for (int w = 0; w < params_.n_window_pos; ++w) { 87 for (int w = 0; w < params_.num_window_pos; ++w) {
88 int current_window_offset = w * window_hop; 88 int current_window_offset = w * window_hop;
89 // Choose a trigger point. 89 // Choose a trigger point.
90 int trigger_time; 90 int trigger_time;
91 const ArrayX& trigger_window = 91 const ArrayX& trigger_window =
92 nap_wave.segment(window_range_start + current_window_offset, 92 nap_wave.segment(window_range_start + current_window_offset,