blob: e7c7b892724c880e92b49e8833bdbfcfac5c576b [file] [log] [blame]
/*
* 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 "dl/api/omxtypes.h"
#include <stdbool.h>
extern void x86SP_FFT_CToC_FC32_Fwd_Radix4_fs(
const OMX_F32 *in,
OMX_F32 *out,
OMX_INT n);
extern void x86SP_FFT_CToC_FC32_Inv_Radix4_fs(
const OMX_F32 *in,
OMX_F32 *out,
OMX_INT n);
extern void x86SP_FFT_CToC_FC32_Fwd_Radix4_fs_sse(
const OMX_F32 *in,
OMX_F32 *out,
OMX_INT n);
extern void x86SP_FFT_CToC_FC32_Inv_Radix4_fs_sse(
const OMX_F32 *in,
OMX_F32 *out,
OMX_INT n);
extern void x86SP_FFT_CToC_FC32_Fwd_Radix4_ms(
const OMX_F32 *in,
OMX_F32 *out,
const OMX_F32 *twiddle,
OMX_INT n,
OMX_INT sub_size,
OMX_INT sub_num);
extern void x86SP_FFT_CToC_FC32_Inv_Radix4_ms(
const OMX_F32 *in,
OMX_F32 *out,
const OMX_F32 *twiddle,
OMX_INT n,
OMX_INT sub_size,
OMX_INT sub_num);
extern void x86SP_FFT_CToC_FC32_Fwd_Radix4_ms_sse(
const OMX_F32 *in,
OMX_F32 *out,
const OMX_F32 *twiddle,
OMX_INT n,
OMX_INT sub_size,
OMX_INT sub_num);
extern void x86SP_FFT_CToC_FC32_Inv_Radix4_ms_sse(
const OMX_F32 *in,
OMX_F32 *out,
const OMX_F32 *twiddle,
OMX_INT n,
OMX_INT sub_size,
OMX_INT sub_num);
extern void x86SP_FFT_CToC_FC32_Fwd_Radix4_ls(
const OMX_F32 *in,
OMX_F32 *out,
const OMX_F32 *twiddle,
OMX_INT n);
extern void x86SP_FFT_CToC_FC32_Inv_Radix4_ls(
const OMX_F32 *in,
OMX_F32 *out,
const OMX_F32 *twiddle,
OMX_INT n);
extern void x86SP_FFT_CToC_FC32_Fwd_Radix4_ls_sse(
const OMX_F32 *in,
OMX_F32 *out,
const OMX_F32 *twiddle,
OMX_INT n);
extern void x86SP_FFT_CToC_FC32_Inv_Radix4_ls_sse(
const OMX_F32 *in,
OMX_F32 *out,
const OMX_F32 *twiddle,
OMX_INT n);
OMX_F32* x86SP_F32_radix4_kernel_OutOfPlace(
const OMX_F32 *src,
OMX_F32 *buf1,
OMX_F32 *buf2,
const OMX_F32 *twiddle,
OMX_INT n,
bool forward_fft) {
OMX_INT sub_size;
OMX_INT sub_num;
OMX_INT n_by_4 = n >> 2;
OMX_F32 *in = buf1;
OMX_F32 *out = buf2;
if (forward_fft)
x86SP_FFT_CToC_FC32_Fwd_Radix4_fs(src, in, n);
else
x86SP_FFT_CToC_FC32_Inv_Radix4_fs(src, in, n);
for (sub_size = 4, sub_num = n_by_4;
sub_size < n_by_4;
sub_size = sub_size << 2, sub_num = sub_num >> 2) {
if (forward_fft) {
x86SP_FFT_CToC_FC32_Fwd_Radix4_ms(in, out, twiddle,
n, sub_size, sub_num);
} else {
x86SP_FFT_CToC_FC32_Inv_Radix4_ms(in, out, twiddle,
n, sub_size, sub_num);
}
OMX_F32 *temp = out;
out = in;
in = temp;
}
if (forward_fft) {
if (sub_num == 2)
x86SP_FFT_CToC_FC32_Fwd_Radix2_ls(in, out, twiddle, n);
else
x86SP_FFT_CToC_FC32_Fwd_Radix4_ls(in, out, twiddle, n);
} else {
if (sub_num == 2)
x86SP_FFT_CToC_FC32_Inv_Radix2_ls(in, out, twiddle, n);
else
x86SP_FFT_CToC_FC32_Inv_Radix4_ls(in, out, twiddle, n);
}
return out;
}
OMX_F32* x86SP_F32_radix4_kernel_OutOfPlace_sse(
const OMX_F32 *src,
OMX_F32 *buf1,
OMX_F32 *buf2,
const OMX_F32 *twiddle,
OMX_INT n,
// true for forward, false for inverse.
bool forward_fft) {
OMX_INT sub_size, sub_num;
OMX_INT n_by_4 = n >> 2;
OMX_F32 *in, *out;
in = buf1;
out = buf2;
if (forward_fft)
x86SP_FFT_CToC_FC32_Fwd_Radix4_fs_sse(src, in, n);
else
x86SP_FFT_CToC_FC32_Inv_Radix4_fs_sse(src, in, n);
for (sub_size = 4, sub_num = n_by_4;
sub_size < n_by_4;
sub_size = sub_size << 2, sub_num = sub_num >> 2) {
if (forward_fft) {
x86SP_FFT_CToC_FC32_Fwd_Radix4_ms_sse(in, out, twiddle,
n, sub_size, sub_num);
} else {
x86SP_FFT_CToC_FC32_Inv_Radix4_ms_sse(in, out, twiddle,
n, sub_size, sub_num);
}
OMX_F32 *temp = out;
out = in;
in = temp;
}
// If n is not power of 4, sub_num == 2.
if (forward_fft) {
if (sub_num == 2)
x86SP_FFT_CToC_FC32_Fwd_Radix2_ls_sse(in, out, twiddle, n);
else
x86SP_FFT_CToC_FC32_Fwd_Radix4_ls_sse(in, out, twiddle, n);
} else {
if (sub_num == 2)
x86SP_FFT_CToC_FC32_Inv_Radix2_ls_sse(in, out, twiddle, n);
else
x86SP_FFT_CToC_FC32_Inv_Radix4_ls_sse(in, out, twiddle, n);
}
return out;
}