/* * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include "modules/audio_processing/transient/wpd_node.h" #include #include #include "common_audio/fir_filter.h" #include "common_audio/fir_filter_factory.h" #include "modules/audio_processing/transient/dyadic_decimator.h" #include "rtc_base/checks.h" namespace webrtc { WPDNode::WPDNode(size_t length, const float* coefficients, size_t coefficients_length) : // The data buffer has parent data length to be able to contain and // filter it. data_(new float[2 * length + 1]), length_(length), filter_( CreateFirFilter(coefficients, coefficients_length, 2 * length + 1)) { RTC_DCHECK_GT(length, 0); RTC_DCHECK(coefficients); RTC_DCHECK_GT(coefficients_length, 0); memset(data_.get(), 0.f, (2 * length + 1) * sizeof(data_[0])); } WPDNode::~WPDNode() {} int WPDNode::Update(const float* parent_data, size_t parent_data_length) { if (!parent_data || (parent_data_length / 2) != length_) { return -1; } // Filter data. filter_->Filter(parent_data, parent_data_length, data_.get()); // Decimate data. const bool kOddSequence = true; size_t output_samples = DyadicDecimate(data_.get(), parent_data_length, kOddSequence, data_.get(), length_); if (output_samples != length_) { return -1; } // Get abs to all values. for (size_t i = 0; i < length_; ++i) { data_[i] = fabs(data_[i]); } return 0; } int WPDNode::set_data(const float* new_data, size_t length) { if (!new_data || length != length_) { return -1; } memcpy(data_.get(), new_data, length * sizeof(data_[0])); return 0; } } // namespace webrtc