Home | History | Annotate | Download | only in include
      1 /*
      2  *  Copyright (c) 2012 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 WEBRTC_COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_REAL_FFT_H_
     12 #define WEBRTC_COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_REAL_FFT_H_
     13 
     14 #include "webrtc/typedefs.h"
     15 
     16 // For ComplexFFT(), the maximum fft order is 10;
     17 // for OpenMax FFT in ARM, it is 12;
     18 // WebRTC APM uses orders of only 7 and 8.
     19 enum {kMaxFFTOrder = 10};
     20 
     21 struct RealFFT;
     22 
     23 #ifdef __cplusplus
     24 extern "C" {
     25 #endif
     26 
     27 typedef struct RealFFT* (*CreateRealFFT)(int order);
     28 typedef void (*FreeRealFFT)(struct RealFFT* self);
     29 typedef int (*RealForwardFFT)(struct RealFFT* self,
     30                               const int16_t* real_data_in,
     31                               int16_t* complex_data_out);
     32 typedef int (*RealInverseFFT)(struct RealFFT* self,
     33                               const int16_t* complex_data_in,
     34                               int16_t* real_data_out);
     35 
     36 extern CreateRealFFT WebRtcSpl_CreateRealFFT;
     37 extern FreeRealFFT WebRtcSpl_FreeRealFFT;
     38 extern RealForwardFFT WebRtcSpl_RealForwardFFT;
     39 extern RealInverseFFT WebRtcSpl_RealInverseFFT;
     40 
     41 struct RealFFT* WebRtcSpl_CreateRealFFTC(int order);
     42 void WebRtcSpl_FreeRealFFTC(struct RealFFT* self);
     43 
     44 #if (defined WEBRTC_DETECT_ARM_NEON) || (defined WEBRTC_ARCH_ARM_NEON)
     45 struct RealFFT* WebRtcSpl_CreateRealFFTNeon(int order);
     46 void WebRtcSpl_FreeRealFFTNeon(struct RealFFT* self);
     47 #endif
     48 
     49 // Compute an FFT for a real-valued signal of length of 2^order,
     50 // where 1 < order <= MAX_FFT_ORDER. Transform length is determined by the
     51 // specification structure, which must be initialized prior to calling the FFT
     52 // function with WebRtcSpl_CreateRealFFT().
     53 // The relationship between the input and output sequences can
     54 // be expressed in terms of the DFT, i.e.:
     55 //     x[n] = (2^(-scalefactor)/N)  . SUM[k=0,...,N-1] X[k].e^(jnk.2.pi/N)
     56 //     n=0,1,2,...N-1
     57 //     N=2^order.
     58 // The conjugate-symmetric output sequence is represented using a CCS vector,
     59 // which is of length N+2, and is organized as follows:
     60 //     Index:      0  1  2  3  4  5   . . .   N-2       N-1       N       N+1
     61 //     Component:  R0 0  R1 I1 R2 I2  . . .   R[N/2-1]  I[N/2-1]  R[N/2]  0
     62 // where R[n] and I[n], respectively, denote the real and imaginary components
     63 // for FFT bin 'n'. Bins  are numbered from 0 to N/2, where N is the FFT length.
     64 // Bin index 0 corresponds to the DC component, and bin index N/2 corresponds to
     65 // the foldover frequency.
     66 //
     67 // Input Arguments:
     68 //   self - pointer to preallocated and initialized FFT specification structure.
     69 //   real_data_in - the input signal. For an ARM Neon platform, it must be
     70 //                  aligned on a 32-byte boundary.
     71 //
     72 // Output Arguments:
     73 //   complex_data_out - the output complex signal with (2^order + 2) 16-bit
     74 //                      elements. For an ARM Neon platform, it must be different
     75 //                      from real_data_in, and aligned on a 32-byte boundary.
     76 //
     77 // Return Value:
     78 //   0  - FFT calculation is successful.
     79 //   -1 - Error with bad arguments (NULL pointers).
     80 int WebRtcSpl_RealForwardFFTC(struct RealFFT* self,
     81                               const int16_t* real_data_in,
     82                               int16_t* complex_data_out);
     83 
     84 #if (defined WEBRTC_DETECT_ARM_NEON) || (defined WEBRTC_ARCH_ARM_NEON)
     85 int WebRtcSpl_RealForwardFFTNeon(struct RealFFT* self,
     86                                  const int16_t* real_data_in,
     87                                  int16_t* complex_data_out);
     88 #endif
     89 
     90 // Compute the inverse FFT for a conjugate-symmetric input sequence of length of
     91 // 2^order, where 1 < order <= MAX_FFT_ORDER. Transform length is determined by
     92 // the specification structure, which must be initialized prior to calling the
     93 // FFT function with WebRtcSpl_CreateRealFFT().
     94 // For a transform of length M, the input sequence is represented using a packed
     95 // CCS vector of length M+2, which is explained in the comments for
     96 // WebRtcSpl_RealForwardFFTC above.
     97 //
     98 // Input Arguments:
     99 //   self - pointer to preallocated and initialized FFT specification structure.
    100 //   complex_data_in - the input complex signal with (2^order + 2) 16-bit
    101 //                     elements. For an ARM Neon platform, it must be aligned on
    102 //                     a 32-byte boundary.
    103 //
    104 // Output Arguments:
    105 //   real_data_out - the output real signal. For an ARM Neon platform, it must
    106 //                   be different to complex_data_in, and aligned on a 32-byte
    107 //                   boundary.
    108 //
    109 // Return Value:
    110 //   0 or a positive number - a value that the elements in the |real_data_out|
    111 //                            should be shifted left with in order to get
    112 //                            correct physical values.
    113 //   -1 - Error with bad arguments (NULL pointers).
    114 int WebRtcSpl_RealInverseFFTC(struct RealFFT* self,
    115                               const int16_t* complex_data_in,
    116                               int16_t* real_data_out);
    117 
    118 #if (defined WEBRTC_DETECT_ARM_NEON) || (defined WEBRTC_ARCH_ARM_NEON)
    119 int WebRtcSpl_RealInverseFFTNeon(struct RealFFT* self,
    120                                  const int16_t* complex_data_in,
    121                                  int16_t* real_data_out);
    122 #endif
    123 
    124 #ifdef __cplusplus
    125 }
    126 #endif
    127 
    128 #endif  // WEBRTC_COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_REAL_FFT_H_
    129