1 /* 2 * Copyright (c) 2017 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 #ifndef MODULES_AUDIO_PROCESSING_AEC3_AEC3_FFT_H_ 12 #define MODULES_AUDIO_PROCESSING_AEC3_AEC3_FFT_H_ 13 14 #include <array> 15 16 #include "api/array_view.h" 17 #include "common_audio/third_party/ooura/fft_size_128/ooura_fft.h" 18 #include "modules/audio_processing/aec3/aec3_common.h" 19 #include "modules/audio_processing/aec3/fft_data.h" 20 #include "rtc_base/checks.h" 21 22 namespace webrtc { 23 24 // Wrapper class that provides 128 point real valued FFT functionality with the 25 // FftData type. 26 class Aec3Fft { 27 public: 28 enum class Window { kRectangular, kHanning, kSqrtHanning }; 29 30 Aec3Fft(); 31 32 Aec3Fft(const Aec3Fft&) = delete; 33 Aec3Fft& operator=(const Aec3Fft&) = delete; 34 35 // Computes the FFT. Note that both the input and output are modified. Fft(std::array<float,kFftLength> * x,FftData * X)36 void Fft(std::array<float, kFftLength>* x, FftData* X) const { 37 RTC_DCHECK(x); 38 RTC_DCHECK(X); 39 ooura_fft_.Fft(x->data()); 40 X->CopyFromPackedArray(*x); 41 } 42 // Computes the inverse Fft. Ifft(const FftData & X,std::array<float,kFftLength> * x)43 void Ifft(const FftData& X, std::array<float, kFftLength>* x) const { 44 RTC_DCHECK(x); 45 X.CopyToPackedArray(x); 46 ooura_fft_.InverseFft(x->data()); 47 } 48 49 // Windows the input using a Hanning window, and then adds padding of 50 // kFftLengthBy2 initial zeros before computing the Fft. 51 void ZeroPaddedFft(rtc::ArrayView<const float> x, 52 Window window, 53 FftData* X) const; 54 55 // Concatenates the kFftLengthBy2 values long x and x_old before computing the 56 // Fft. After that, x is copied to x_old. PaddedFft(rtc::ArrayView<const float> x,rtc::ArrayView<const float> x_old,FftData * X)57 void PaddedFft(rtc::ArrayView<const float> x, 58 rtc::ArrayView<const float> x_old, 59 FftData* X) const { 60 PaddedFft(x, x_old, Window::kRectangular, X); 61 } 62 63 // Padded Fft using a time-domain window. 64 void PaddedFft(rtc::ArrayView<const float> x, 65 rtc::ArrayView<const float> x_old, 66 Window window, 67 FftData* X) const; 68 69 private: 70 const OouraFft ooura_fft_; 71 }; 72 73 } // namespace webrtc 74 75 #endif // MODULES_AUDIO_PROCESSING_AEC3_AEC3_FFT_H_ 76