Normalize delay-and-sum mask in Beamformer
This normalization is done in the Matlab Code but was never ported to the C++ version. R=andrew@webrtc.org Review URL: https://webrtc-codereview.appspot.com/37919004 Cr-Commit-Position: refs/heads/master@{#8279} git-svn-id: http://webrtc.googlecode.com/svn/trunk@8279 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
parent
799e667e9f
commit
2a44be93e8
@ -123,6 +123,18 @@ int Round(float x) {
|
||||
return std::floor(x + 0.5f);
|
||||
}
|
||||
|
||||
// Calculates the sum of absolute values of a complex matrix.
|
||||
float SumAbs(const ComplexMatrix<float>& mat) {
|
||||
float sum_abs = 0.f;
|
||||
const complex<float>* const* mat_els = mat.elements();
|
||||
for (int i = 0; i < mat.num_rows(); ++i) {
|
||||
for (int j = 0; j < mat.num_columns(); ++j) {
|
||||
sum_abs += std::abs(mat_els[i][j]);
|
||||
}
|
||||
}
|
||||
return sum_abs;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
Beamformer::Beamformer(const std::vector<Point>& array_geometry)
|
||||
@ -205,6 +217,9 @@ void Beamformer::InitDelaySumMasks() {
|
||||
complex_f norm_factor = sqrt(
|
||||
ConjugateDotProduct(delay_sum_masks_[f_ix], delay_sum_masks_[f_ix]));
|
||||
delay_sum_masks_[f_ix].Scale(1.f / norm_factor);
|
||||
normalized_delay_sum_masks_[f_ix].CopyFrom(delay_sum_masks_[f_ix]);
|
||||
normalized_delay_sum_masks_[f_ix].Scale(1.f / SumAbs(
|
||||
normalized_delay_sum_masks_[f_ix]));
|
||||
}
|
||||
}
|
||||
|
||||
@ -405,7 +420,8 @@ void Beamformer::ApplyMasks(const complex_f* const* input,
|
||||
for (int f_ix = 0; f_ix < kNumFreqBins; ++f_ix) {
|
||||
output_channel[f_ix] = complex_f(0.f, 0.f);
|
||||
|
||||
const complex_f* delay_sum_mask_els = delay_sum_masks_[f_ix].elements()[0];
|
||||
const complex_f* delay_sum_mask_els =
|
||||
normalized_delay_sum_masks_[f_ix].elements()[0];
|
||||
for (int c_ix = 0; c_ix < num_input_channels_; ++c_ix) {
|
||||
output_channel[f_ix] += input[c_ix][f_ix] * delay_sum_mask_els[c_ix];
|
||||
}
|
||||
|
@ -136,6 +136,7 @@ class Beamformer : public LappedTransform::Callback {
|
||||
|
||||
// Array of length |kNumFreqBins|, Matrix of size |1| x |num_channels_|.
|
||||
ComplexMatrixF delay_sum_masks_[kNumFreqBins];
|
||||
ComplexMatrixF normalized_delay_sum_masks_[kNumFreqBins];
|
||||
|
||||
// Array of length |kNumFreqBins|, Matrix of size |num_input_channels_| x
|
||||
// |num_input_channels_|.
|
||||
|
@ -143,6 +143,7 @@ void CovarianceMatrixGenerator::PhaseAlignmentMasks(int frequency_bin,
|
||||
|
||||
complex<float>* const* mat_els = mat->elements();
|
||||
for (int c_ix = 0; c_ix < num_input_channels; ++c_ix) {
|
||||
// TODO(aluebs): Generalize for non-uniform-linear microphone arrays.
|
||||
float distance = mic_spacing * c_ix * sin_angle * -1.f;
|
||||
float phase_shift = 2 * M_PI * distance * freq_in_hertz / sound_speed;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user