Mercurial > hg > aimc
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, |