/*
 *  Copyright (c) 2018 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/agc2/rnn_vad/fft_util.h"

#include <stddef.h>
#include <algorithm>
#include <cmath>

#include "rtc_base/checks.h"

namespace webrtc {
namespace rnn_vad {
namespace {

constexpr size_t kHalfFrameSize = kFrameSize20ms24kHz / 2;

// Computes the first half of the Vorbis window.
std::array<float, kHalfFrameSize> ComputeHalfVorbisWindow() {
  std::array<float, kHalfFrameSize> half_window{};
  for (size_t i = 0; i < kHalfFrameSize; ++i) {
    half_window[i] =
        std::sin(0.5 * kPi * std::sin(0.5 * kPi * (i + 0.5) / kHalfFrameSize) *
                 std::sin(0.5 * kPi * (i + 0.5) / kHalfFrameSize));
  }
  return half_window;
}

}  // namespace

FftUtil::FftUtil()
    : half_window_(ComputeHalfVorbisWindow()),
      fft_(static_cast<int>(input_buf_.size())) {}

FftUtil::~FftUtil() = default;

void FftUtil::WindowedFft(rtc::ArrayView<const float> samples,
                          rtc::ArrayView<std::complex<float>> dst) {
  RTC_DCHECK_EQ(samples.size(), kFrameSize20ms24kHz);
  RTC_DCHECK_EQ(dst.size(), kFftSizeBy2Plus1);
  // Apply windowing.
  RTC_DCHECK_EQ(input_buf_.size(), 2 * half_window_.size());
  for (size_t i = 0; i < input_buf_.size() / 2; ++i) {
    input_buf_[i].real(samples[i] * half_window_[i]);
    size_t j = kFrameSize20ms24kHz - i - 1;
    input_buf_[j].real(samples[j] * half_window_[i]);
  }
  fft_.ForwardFft(kFrameSize20ms24kHz, input_buf_.data(), kFrameSize20ms24kHz,
                  output_buf_.data());
  // Copy the first symmetric conjugate part.
  RTC_DCHECK_LT(dst.size(), output_buf_.size());
  std::copy(output_buf_.begin(), output_buf_.begin() + dst.size(), dst.begin());
}

}  // namespace rnn_vad
}  // namespace webrtc
