tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

window_generator.cc (2028B)


      1 /*
      2 *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
      3 *
      4 *  Use of this source code is governed by a BSD-style license
      5 *  that can be found in the LICENSE file in the root of the source
      6 *  tree. An additional intellectual property rights grant can be found
      7 *  in the file PATENTS.  All contributing project authors may
      8 *  be found in the AUTHORS file in the root of the source tree.
      9 */
     10 
     11 #include "common_audio/window_generator.h"
     12 
     13 #include <cmath>
     14 #include <complex>
     15 #include <cstddef>
     16 #include <numbers>
     17 
     18 #include "rtc_base/checks.h"
     19 
     20 using std::complex;
     21 
     22 namespace {
     23 
     24 // Modified Bessel function of order 0 for complex inputs.
     25 complex<float> I0(complex<float> x) {
     26  complex<float> y = x / 3.75f;
     27  y *= y;
     28  return 1.0f + y * (3.5156229f +
     29                     y * (3.0899424f +
     30                          y * (1.2067492f +
     31                               y * (0.2659732f +
     32                                    y * (0.360768e-1f + y * 0.45813e-2f)))));
     33 }
     34 
     35 }  // namespace
     36 
     37 namespace webrtc {
     38 
     39 void WindowGenerator::Hanning(int length, float* window) {
     40  RTC_CHECK_GT(length, 1);
     41  RTC_CHECK(window != nullptr);
     42  for (int i = 0; i < length; ++i) {
     43    window[i] =
     44        0.5f * (1 - cosf(2 * std::numbers::pi_v<float> * i / (length - 1)));
     45  }
     46 }
     47 
     48 void WindowGenerator::KaiserBesselDerived(float alpha,
     49                                          size_t length,
     50                                          float* window) {
     51  RTC_CHECK_GT(length, 1U);
     52  RTC_CHECK(window != nullptr);
     53 
     54  const size_t half = (length + 1) / 2;
     55  float sum = 0.0f;
     56 
     57  for (size_t i = 0; i <= half; ++i) {
     58    complex<float> r = (4.0f * i) / length - 1.0f;
     59    sum += I0(std::numbers::pi_v<float> * alpha * sqrt(1.0f - r * r)).real();
     60    window[i] = sum;
     61  }
     62  for (size_t i = length - 1; i >= half; --i) {
     63    window[length - i - 1] = sqrtf(window[length - i - 1] / sum);
     64    window[i] = window[length - i - 1];
     65  }
     66  if (length % 2 == 1) {
     67    window[half - 1] = sqrtf(window[half - 1] / sum);
     68  }
     69 }
     70 
     71 }  // namespace webrtc