CMSIS-DSP: MVE version of arm_cfft_f32.

pull/19/head
Christophe Favergeon 6 years ago
parent 169877344c
commit 3060b1da8f

@ -3147,8 +3147,21 @@ void arm_cfft_q31(
const float32_t *pTwiddle; /**< points to the Twiddle factor table. */
const uint16_t *pBitRevTable; /**< points to the bit reversal table. */
uint16_t bitRevLength; /**< bit reversal table length. */
#if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
const uint32_t *rearranged_twiddle_tab_stride1_arr; /**< Per stage reordered twiddle pointer (offset 1) */ \
const uint32_t *rearranged_twiddle_tab_stride2_arr; /**< Per stage reordered twiddle pointer (offset 2) */ \
const uint32_t *rearranged_twiddle_tab_stride3_arr; /**< Per stage reordered twiddle pointer (offset 3) */ \
const float32_t *rearranged_twiddle_stride1; /**< reordered twiddle offset 1 storage */ \
const float32_t *rearranged_twiddle_stride2; /**< reordered twiddle offset 2 storage */ \
const float32_t *rearranged_twiddle_stride3;
#endif
} arm_cfft_instance_f32;
arm_status arm_cfft_init_f32(
arm_cfft_instance_f32 * S,
uint16_t fftLen);
void arm_cfft_f32(
const arm_cfft_instance_f32 * S,
float32_t * p1,

@ -0,0 +1,97 @@
/* ----------------------------------------------------------------------
* Project: CMSIS DSP Library
* Title: arm_mve_tables.h
* Description: common tables like fft twiddle factors, Bitreverse, reciprocal etc
* used for MVE implementation only
*
* $Date: 08. January 2020
* $Revision: V1.7.0
*
* Target Processor: Cortex-M cores
* -------------------------------------------------------------------- */
/*
* Copyright (C) 2010-2020 ARM Limited or its affiliates. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the License); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _ARM_MVE_TABLES_H
#define _ARM_MVE_TABLES_H
#include "arm_math.h"
#if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES)
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_16) || defined(ARM_TABLE_TWIDDLECOEF_F32_32)
extern uint32_t rearranged_twiddle_tab_stride1_arr_16[2];
extern uint32_t rearranged_twiddle_tab_stride2_arr_16[2];
extern uint32_t rearranged_twiddle_tab_stride3_arr_16[2];
extern float32_t rearranged_twiddle_stride1_16[8];
extern float32_t rearranged_twiddle_stride2_16[8];
extern float32_t rearranged_twiddle_stride3_16[8];
#endif
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_64) || defined(ARM_TABLE_TWIDDLECOEF_F32_128)
extern uint32_t rearranged_twiddle_tab_stride1_arr_64[3];
extern uint32_t rearranged_twiddle_tab_stride2_arr_64[3];
extern uint32_t rearranged_twiddle_tab_stride3_arr_64[3];
extern float32_t rearranged_twiddle_stride1_64[40];
extern float32_t rearranged_twiddle_stride2_64[40];
extern float32_t rearranged_twiddle_stride3_64[40];
#endif
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_256) || defined(ARM_TABLE_TWIDDLECOEF_F32_512)
extern uint32_t rearranged_twiddle_tab_stride1_arr_256[4];
extern uint32_t rearranged_twiddle_tab_stride2_arr_256[4];
extern uint32_t rearranged_twiddle_tab_stride3_arr_256[4];
extern float32_t rearranged_twiddle_stride1_256[168];
extern float32_t rearranged_twiddle_stride2_256[168];
extern float32_t rearranged_twiddle_stride3_256[168];
#endif
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_1024) || defined(ARM_TABLE_TWIDDLECOEF_F32_2048)
extern uint32_t rearranged_twiddle_tab_stride1_arr_1024[5];
extern uint32_t rearranged_twiddle_tab_stride2_arr_1024[5];
extern uint32_t rearranged_twiddle_tab_stride3_arr_1024[5];
extern float32_t rearranged_twiddle_stride1_1024[680];
extern float32_t rearranged_twiddle_stride2_1024[680];
extern float32_t rearranged_twiddle_stride3_1024[680];
#endif
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_4096) || defined(ARM_TABLE_TWIDDLECOEF_F32_8192)
extern uint32_t rearranged_twiddle_tab_stride1_arr_4096[6];
extern uint32_t rearranged_twiddle_tab_stride2_arr_4096[6];
extern uint32_t rearranged_twiddle_tab_stride3_arr_4096[6];
extern float32_t rearranged_twiddle_stride1_4096[2728];
extern float32_t rearranged_twiddle_stride2_4096[2728];
extern float32_t rearranged_twiddle_stride3_4096[2728];
#endif
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES) */
#endif /* defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) */
#endif /*_ARM_MVE_TABLES_H*/

@ -40,6 +40,7 @@ extern "C"
static const float32_t __logf_rng_f32=0.693147180f;
/* fast inverse approximation (3x newton) */
__STATIC_INLINE f32x4_t vrecip_medprec_f32(
f32x4_t x)

@ -0,0 +1,58 @@
/******************************************************************************
* @file arm_vec_fft.h
* @brief Private header file for CMSIS DSP Library
* @version V1.7.0
* @date 07. January 2020
******************************************************************************/
/*
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the License); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _ARM_VEC_FFT_H_
#define _ARM_VEC_FFT_H_
#include "arm_math.h"
#include "arm_helium_utils.h"
#ifdef __cplusplus
extern "C"
{
#endif
#if (defined(ARM_MATH_MVEF) || defined(ARM_MATH_HELIUM)) && !defined(ARM_MATH_AUTOVECTORIZE)
#define MVE_CMPLX_ADD_A_ixB(A, B) vcaddq_rot90(A,B)
#define MVE_CMPLX_SUB_A_ixB(A,B) vcaddq_rot270(A,B)
#define MVE_CMPLX_MULT_FLT_AxB(A,B) vcmlaq_rot90(vcmulq(A, B), A, B)
#define MVE_CMPLX_MULT_FLT_Conj_AxB(A,B) vcmlaq_rot270(vcmulq(A, B), A, B)
#define MVE_CMPLX_MULT_FX_AxB(A,B) vqdmladhxq(vqdmlsdhq((__typeof(A))vuninitializedq_s32(), A, B), A, B);
#define MVE_CMPLX_MULT_FX_AxConjB(A,B) vqdmladhq(vqdmlsdhxq((__typeof(A))vuninitializedq_s32(), A, B), A, B);
#define MVE_CMPLX_ADD_FX_A_ixB(A, B) vhcaddq_rot90(A,B)
#define MVE_CMPLX_SUB_FX_A_ixB(A,B) vhcaddq_rot270(A,B)
#endif /* (defined(ARM_MATH_MVEF) || defined(ARM_MATH_HELIUM)) && !defined(ARM_MATH_AUTOVECTORIZE)*/
#ifdef __cplusplus
}
#endif
#endif /* _ARM_VEC_FFT_H_ */

@ -114,79 +114,6 @@ arm_status arm_cfft_init_f64(
return (status);
}
arm_status arm_cfft_init_f32(
arm_cfft_instance_f32 * S,
uint16_t fftLen)
{
/* Initialise the default arm status */
arm_status status = ARM_MATH_SUCCESS;
/* Initialise the FFT length */
S->fftLen = fftLen;
/* Initialise the Twiddle coefficient pointer */
S->pTwiddle = (float32_t *)twiddleCoef_4096;
/* Initializations of Instance structure depending on the FFT length */
switch (S->fftLen) {
/* Initializations of structure parameters for 4096 point FFT */
case 4096U:
/* Initialise the bit reversal table modifier */
FFTINIT(f32,4096);
break;
/* Initializations of structure parameters for 2048 point FFT */
case 2048U:
/* Initialise the bit reversal table modifier */
FFTINIT(f32,2048);
break;
/* Initializations of structure parameters for 1024 point FFT */
case 1024U:
/* Initialise the bit reversal table modifier */
FFTINIT(f32,1024);
break;
/* Initializations of structure parameters for 512 point FFT */
case 512U:
/* Initialise the bit reversal table modifier */
FFTINIT(f32,512);
break;
case 256U:
FFTINIT(f32,256);
break;
case 128U:
FFTINIT(f32,128);
break;
case 64U:
FFTINIT(f32,64);
break;
case 32U:
FFTINIT(f32,32);
break;
case 16U:
/* Initializations of structure parameters for 16 point FFT */
FFTINIT(f32,16);
break;
default:
/* Reporting argument error if fftSize is not valid value */
status = ARM_MATH_ARGUMENT_ERROR;
break;
}
return (status);
}
arm_status arm_cfft_init_q31(
arm_cfft_instance_q31 * S,

@ -6,7 +6,7 @@ import sys
import os
from config import ROOT
includes = [os.path.join(ROOT,"Include"),os.path.join("cmsisdsp_pkg","src")]
includes = [os.path.join(ROOT,"Include"),os.path.join(ROOT,"PrivateInclude"),os.path.join("cmsisdsp_pkg","src")]
if sys.platform == 'win32':
cflags = ["-DWIN",config.cflags,"-DUNALIGNED_SUPPORT_DISABLE"]

@ -1,76 +1,76 @@
import cmsisdsp as dsp
import numpy as np
from scipy import signal
#import matplotlib.pyplot as plt
#from scipy.fftpack import dct
#r = dsp.arm_add_f32(np.array([1.,2,3]),np.array([4.,5,7]))
#print(r)
#r = dsp.arm_add_q31([1,2,3],[4,5,7])
#print(r)
#
#r = dsp.arm_add_q15([1,2,3],[4,5,7])
#print(r)
#
#r = dsp.arm_add_q7([-1,2,3],[4,127,7])
#print(r)
#
#r = dsp.arm_scale_f32([1.,2,3],2)
#print(r)
#
#r = dsp.arm_scale_q31([0x7FFF,0x3FFF,0x1FFF],1 << 20,2)
#print(r)
#
#r = dsp.arm_scale_q15([0x7FFF,0x3FFF,0x1FFF],1 << 10,2)
#print(r)
#
#r = dsp.arm_scale_q7([0x7F,0x3F,0x1F],1 << 5,2)
#print(r)
#
#
#r = dsp.arm_negate_f32([1.,2,3])
#print(r)
#
#r = dsp.arm_negate_q31([1,2,3])
#print(r)
#
#r = dsp.arm_negate_q15([1,2,3])
#print(r)
#
#r = dsp.arm_negate_q7(np.array([0x80,0x81,0x82]))
#print(r)
#r = dsp.arm_cmplx_conj_f32([1.,2,3,4])
#print(r)
#r = dsp.arm_cmplx_conj_q31([1,2,3,4])
#print(r)
#r = dsp.arm_cmplx_conj_q15([1,2,3,4])
#print(r)
#r = dsp.arm_cmplx_dot_prod_f32([1.,2,3,4],[1.,2,3,4])
#print(r)
#r = dsp.arm_cmplx_dot_prod_q31([0x1FFF,0x3FFF,0x1FFF,0x3FFF],[0x1FFF,0x3FFF,0x1FFF,0x3FFF])
#print(r)
#r = dsp.arm_cmplx_mult_real_f32([1.0,2,3,4],[5.,5.,5.,5.])
#print(r)
#pidf32 = dsp.arm_pid_instance_f32(Kp=1.0,Ki=1.2,Kd=0.4)
#print(pidf32.Kp())
#print(pidf32.Ki())
#print(pidf32.Kd())
#print(pidf32.A0())
#
#dsp.arm_pid_init_f32(pidf32,0)
#print(pidf32.A0())
#print(dsp.arm_cos_f32(3.14/4.))
#print(dsp.arm_sqrt_q31(0x7FFF))
import matplotlib.pyplot as plt
from scipy.fftpack import dct
r = dsp.arm_add_f32(np.array([1.,2,3]),np.array([4.,5,7]))
print(r)
r = dsp.arm_add_q31([1,2,3],[4,5,7])
print(r)
r = dsp.arm_add_q15([1,2,3],[4,5,7])
print(r)
r = dsp.arm_add_q7([-1,2,3],[4,127,7])
print(r)
r = dsp.arm_scale_f32([1.,2,3],2)
print(r)
r = dsp.arm_scale_q31([0x7FFF,0x3FFF,0x1FFF],1 << 20,2)
print(r)
r = dsp.arm_scale_q15([0x7FFF,0x3FFF,0x1FFF],1 << 10,2)
print(r)
r = dsp.arm_scale_q7([0x7F,0x3F,0x1F],1 << 5,2)
print(r)
r = dsp.arm_negate_f32([1.,2,3])
print(r)
r = dsp.arm_negate_q31([1,2,3])
print(r)
r = dsp.arm_negate_q15([1,2,3])
print(r)
r = dsp.arm_negate_q7(np.array([0x80,0x81,0x82]))
print(r)
r = dsp.arm_cmplx_conj_f32([1.,2,3,4])
print(r)
r = dsp.arm_cmplx_conj_q31([1,2,3,4])
print(r)
r = dsp.arm_cmplx_conj_q15([1,2,3,4])
print(r)
r = dsp.arm_cmplx_dot_prod_f32([1.,2,3,4],[1.,2,3,4])
print(r)
r = dsp.arm_cmplx_dot_prod_q31([0x1FFF,0x3FFF,0x1FFF,0x3FFF],[0x1FFF,0x3FFF,0x1FFF,0x3FFF])
print(r)
r = dsp.arm_cmplx_mult_real_f32([1.0,2,3,4],[5.,5.,5.,5.])
print(r)
pidf32 = dsp.arm_pid_instance_f32(Kp=1.0,Ki=1.2,Kd=0.4)
print(pidf32.Kp())
print(pidf32.Ki())
print(pidf32.Kd())
print(pidf32.A0())
dsp.arm_pid_init_f32(pidf32,0)
print(pidf32.A0())
print(dsp.arm_cos_f32(3.14/4.))
print(dsp.arm_sqrt_q31(0x7FFF))
firf32 = dsp.arm_fir_instance_f32()
dsp.arm_fir_init_f32(firf32,3,[1.,2,3],[0,0,0,0,0,0,0])
@ -128,28 +128,28 @@ def Q15toF32(x):
def Q7toF32(x):
return(1.0*x / 2**7)
#firq31 = dsp.arm_fir_instance_q31()
#x=np.array([1,2,3,4,5])/10.0
#taps=np.array([1,2,3])/10.0
#xQ31=toQ31(x)
#tapsQ31=toQ31(taps)
#dsp.arm_fir_init_q31(firq31,3,tapsQ31,[0,0,0,0,0,0,0])
#print(firq31.numTaps())
#resultQ31=dsp.arm_fir_q31(firq31,xQ31)
#result=Q31toF32(resultQ31)
#print(result)
#a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]])
#b=np.array([[1.,2,3,4],[5.1,6,7,8],[9.1,10,11,12]])
#print(a+b)
#v=dsp.arm_mat_add_f32(a,b)
#print(v)
#a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]])
#b=np.array([[1.,2,3],[5.1,6,7],[9.1,10,11],[5,8,4]])
#print(np.dot(a , b))
#v=dsp.arm_mat_mult_f32(a,b)
#print(v)
firq31 = dsp.arm_fir_instance_q31()
x=np.array([1,2,3,4,5])/10.0
taps=np.array([1,2,3])/10.0
xQ31=toQ31(x)
tapsQ31=toQ31(taps)
dsp.arm_fir_init_q31(firq31,3,tapsQ31,[0,0,0,0,0,0,0])
print(firq31.numTaps())
resultQ31=dsp.arm_fir_q31(firq31,xQ31)
result=Q31toF32(resultQ31)
print(result)
a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]])
b=np.array([[1.,2,3,4],[5.1,6,7,8],[9.1,10,11,12]])
print(a+b)
v=dsp.arm_mat_add_f32(a,b)
print(v)
a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]])
b=np.array([[1.,2,3],[5.1,6,7],[9.1,10,11],[5,8,4]])
print(np.dot(a , b))
v=dsp.arm_mat_mult_f32(a,b)
print(v)
def imToReal2D(a):
ar=np.zeros(np.array(a.shape) * [1,2])
@ -160,55 +160,55 @@ def imToReal2D(a):
def realToIm2D(ar):
return(ar[::,0::2] + 1j * ar[::,1::2])
#a=np.array([[1. + 2j,3 + 4j],[5 + 6j,7 + 8j],[9 + 10j,11 + 12j]])
#b=np.array([[1. + 2j, 3 + 5.1j ,6 + 7j],[9.1 + 10j,11 + 5j,8 +4j]])
#print(np.dot(a , b))
#
a=np.array([[1. + 2j,3 + 4j],[5 + 6j,7 + 8j],[9 + 10j,11 + 12j]])
b=np.array([[1. + 2j, 3 + 5.1j ,6 + 7j],[9.1 + 10j,11 + 5j,8 +4j]])
print(np.dot(a , b))
# Convert complex array to real array for use in CMSIS DSP
#ar = imToReal2D(a)
#br = imToReal2D(b)
#
#v=dsp.arm_mat_cmplx_mult_f32(ar,br)
#print(v)
#a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]]) / 30.0
#b=np.array([[1.,2,3,4],[5.1,6,7,8],[9.1,10,11,12]]) / 30.0
#print(a+b)
#
#aQ31=toQ31(a)
#bQ31=toQ31(b)
#v=dsp.arm_mat_add_q31(aQ31,bQ31)
#rQ31=v[1]
#r=Q31toF32(rQ31)
#print(r)#
#a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]])
#print(np.transpose(a))
#print(dsp.arm_mat_trans_f32(a))
#a = np.array([[1., 2.], [3., 4.]])
#print(np.linalg.inv(a))
#print(dsp.arm_mat_inverse_f32(a))
#a = np.array([[1., 2.], [3., 4.]])
#print(np.linalg.inv(a))
#print(dsp.arm_mat_inverse_f64(a))
#a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]])
#print(2.5*a)
#print(dsp.arm_mat_scale_f32(a,2.5))
#a=np.array([1.,2,3,4,5,6,7,8,9,10,11,12])
#print(np.max(a))
#print(np.argmax(a))
#print(dsp.arm_max_f32(a))
#
#print(np.mean(a))
#print(dsp.arm_mean_f32(a))
#
#print(np.dot(a,a))
#print(dsp.arm_power_f32(a))
#
ar = imToReal2D(a)
br = imToReal2D(b)
v=dsp.arm_mat_cmplx_mult_f32(ar,br)
print(v)
a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]]) / 30.0
b=np.array([[1.,2,3,4],[5.1,6,7,8],[9.1,10,11,12]]) / 30.0
print(a+b)
aQ31=toQ31(a)
bQ31=toQ31(b)
v=dsp.arm_mat_add_q31(aQ31,bQ31)
rQ31=v[1]
r=Q31toF32(rQ31)
print(r)
a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]])
print(np.transpose(a))
print(dsp.arm_mat_trans_f32(a))
a = np.array([[1., 2.], [3., 4.]])
print(np.linalg.inv(a))
print(dsp.arm_mat_inverse_f32(a))
a = np.array([[1., 2.], [3., 4.]])
print(np.linalg.inv(a))
print(dsp.arm_mat_inverse_f64(a))
a=np.array([[1.,2,3,4],[5,6,7,8],[9,10,11,12]])
print(2.5*a)
print(dsp.arm_mat_scale_f32(a,2.5))
a=np.array([1.,2,3,4,5,6,7,8,9,10,11,12])
print(np.max(a))
print(np.argmax(a))
print(dsp.arm_max_f32(a))
print(np.mean(a))
print(dsp.arm_mean_f32(a))
print(np.dot(a,a))
print(dsp.arm_power_f32(a))
def imToReal1D(a):
ar=np.zeros(np.array(a.shape) * 2)
@ -219,145 +219,145 @@ def imToReal1D(a):
def realToIm1D(ar):
return(ar[0::2] + 1j * ar[1::2])
#nb = 16
#signal = np.cos(2 * np.pi * np.arange(nb) / nb)
#result=np.fft.fft(signal)
#print(result)
#signalR = imToReal1D(signal)
#cfftf32=dsp.arm_cfft_instance_f32()
#status=dsp.arm_cfft_init_f32(cfftf32,nb)
#print(status)
#resultR = dsp.arm_cfft_f32(cfftf32,signalR,0,1)
#resultI = realToIm1D(resultR)
#print(resultI)
#signal = signal / 10.0
#result=np.fft.fft(signal)
#print(result)
#
#signalR = imToReal1D(signal)
#signalRQ31=toQ31(signalR)
#cfftq31=dsp.arm_cfft_instance_q31()
#status=dsp.arm_cfft_init_q31(cfftq31,nb)
#print(status)
#resultR = dsp.arm_cfft_q31(cfftq31,signalRQ31,0,1)
#resultI = realToIm1D(Q31toF32(resultR))*16
#print(resultI)
#signal = signal / 10.0
#result=np.fft.fft(signal)
#print(result)
##
#signalR = imToReal1D(signal)
#signalRQ15=toQ15(signalR)
#cfftq15=dsp.arm_cfft_instance_q15()
#status=dsp.arm_cfft_init_q15(cfftq15,nb)
#print(status)
#resultR = dsp.arm_cfft_q15(cfftq15,signalRQ15,0,1)
#resultR=Q15toF32(resultR)
#resultI = realToIm1D(resultR)*16
#print(resultI)
#nb = 128
#signal = np.cos(2 * np.pi * np.arange(nb) / nb)
#
#result=np.fft.fft(signal)
##print(result)
#cfftradix4f32=dsp.arm_cfft_radix4_instance_f32()
#rfftf32=dsp.arm_rfft_instance_f32()
#status=dsp.arm_rfft_init_f32(rfftf32,cfftradix4f32,nb,0,1)
#print(status)
#resultI = dsp.arm_rfft_f32(rfftf32,signal)
#print(result)
#nb = 128
#signal = np.cos(2 * np.pi * np.arange(nb) / nb)
#signalRQ31=toQ31(signal)
#
#result=np.fft.fft(signal)
##print(result)
#rfftq31=dsp.arm_rfft_instance_q31()
#status=dsp.arm_rfft_init_q31(rfftq31,nb,0,1)
#print(status)
#resultI = dsp.arm_rfft_q31(rfftq31,signalRQ31)
#resultI=Q31toF32(resultI)*(1 << 7)
##print(result)
#nb = 128
#signal = np.cos(2 * np.pi * np.arange(nb) / nb)
#signalRQ15=toQ15(signal)
#
#result=np.fft.fft(signal)
##print(result)
#rfftq15=dsp.arm_rfft_instance_q15()
#status=dsp.arm_rfft_init_q15(rfftq15,nb,0,1)
#print(status)
#resultI = dsp.arm_rfft_q15(rfftq15,signalRQ15)
#resultI=Q15toF32(resultI)*(1 << 7)
#print(result)
#nb = 128
#nb2=64
#signal = np.cos(2 * np.pi * np.arange(nb) / nb)
#result=dct(signal,4,norm='ortho')
##print(result)
#cfftradix4f32=dsp.arm_cfft_radix4_instance_f32()
#rfftf32=dsp.arm_rfft_instance_f32()
#dct4f32=dsp.arm_dct4_instance_f32()
#status=dsp.arm_dct4_init_f32(dct4f32,rfftf32,cfftradix4f32,nb,nb2,0.125)
#print(status)
#state=np.zeros(2*nb)
#resultI = dsp.arm_dct4_f32(dct4f32,state,signal)
##print(resultI)
#signal = signal / 10.0
#result=dct(signal,4,norm='ortho')
#signalQ31=toQ31(signal)
#cfftradix4q31=dsp.arm_cfft_radix4_instance_q31()
#rfftq31=dsp.arm_rfft_instance_q31()
#dct4q31=dsp.arm_dct4_instance_q31()
#status=dsp.arm_dct4_init_q31(dct4q31,rfftq31,cfftradix4q31,nb,nb2,0x10000000)
#print(status)
#state=np.zeros(2*nb)
#resultI = dsp.arm_dct4_q31(dct4q31,state,signalQ31)
#resultI=Q31toF32(resultI)*(1 << 7)
#nb = 128
#nb2=64
#signal = np.cos(2 * np.pi * np.arange(nb) / nb)
#signal = signal / 10.0
#result=dct(signal,4,norm='ortho')
#signalQ15=toQ15(signal)
#cfftradix4q15=dsp.arm_cfft_radix4_instance_q15()
#rfftq15=dsp.arm_rfft_instance_q15()
#dct4q15=dsp.arm_dct4_instance_q15()
#status=dsp.arm_dct4_init_q15(dct4q15,rfftq15,cfftradix4q15,nb,nb2,0x1000)
#print(status)
#state=np.zeros(2*nb)
#resultI = dsp.arm_dct4_q15(dct4q15,state,signalQ15)
#resultI=Q15toF32(resultI)*(1 << 7)
#
#
#from pylab import figure, clf, plot, xlabel, ylabel, xlim, ylim, title, grid, axes, show
#figure(1)
#plot(np.absolute(signal))
#t = np.arange(nb)
#freq = np.fft.fftfreq(t.shape[-1])
#resultmag=np.absolute(result)
#figure(2)
#plot(resultmag)
#figure(3)
#cmsigmag=np.absolute(resultI)
#plot(cmsigmag)
#show()##
#biquadf32 = dsp.arm_biquad_casd_df1_inst_f32()
#numStages=1
#state=np.zeros(numStages*4)
#coefs=[1.,2,3,4,5]
#dsp.arm_biquad_cascade_df1_init_f32(biquadf32,1,coefs,state)
#print(dsp.arm_biquad_cascade_df1_f32(biquadf32,[1,2,3,4,5]))#
nb = 16
signal = np.cos(2 * np.pi * np.arange(nb) / nb)
result=np.fft.fft(signal)
print(result)
signalR = imToReal1D(signal)
cfftf32=dsp.arm_cfft_instance_f32()
status=dsp.arm_cfft_init_f32(cfftf32,nb)
print(status)
resultR = dsp.arm_cfft_f32(cfftf32,signalR,0,1)
resultI = realToIm1D(resultR)
print(resultI)
signal = signal / 10.0
result=np.fft.fft(signal)
print(result)
signalR = imToReal1D(signal)
signalRQ31=toQ31(signalR)
cfftq31=dsp.arm_cfft_instance_q31()
status=dsp.arm_cfft_init_q31(cfftq31,nb)
print(status)
resultR = dsp.arm_cfft_q31(cfftq31,signalRQ31,0,1)
resultI = realToIm1D(Q31toF32(resultR))*16
print(resultI)
signal = signal / 10.0
result=np.fft.fft(signal)
print(result)
signalR = imToReal1D(signal)
signalRQ15=toQ15(signalR)
cfftq15=dsp.arm_cfft_instance_q15()
status=dsp.arm_cfft_init_q15(cfftq15,nb)
print(status)
resultR = dsp.arm_cfft_q15(cfftq15,signalRQ15,0,1)
resultR=Q15toF32(resultR)
resultI = realToIm1D(resultR)*16
print(resultI)
nb = 128
signal = np.cos(2 * np.pi * np.arange(nb) / nb)
result=np.fft.fft(signal)
print(result)
cfftradix4f32=dsp.arm_cfft_radix4_instance_f32()
rfftf32=dsp.arm_rfft_instance_f32()
status=dsp.arm_rfft_init_f32(rfftf32,cfftradix4f32,nb,0,1)
print(status)
resultI = dsp.arm_rfft_f32(rfftf32,signal)
print(result)
nb = 128
signal = np.cos(2 * np.pi * np.arange(nb) / nb)
signalRQ31=toQ31(signal)
result=np.fft.fft(signal)
print(result)
rfftq31=dsp.arm_rfft_instance_q31()
status=dsp.arm_rfft_init_q31(rfftq31,nb,0,1)
print(status)
resultI = dsp.arm_rfft_q31(rfftq31,signalRQ31)
resultI=Q31toF32(resultI)*(1 << 7)
print(result)
nb = 128
signal = np.cos(2 * np.pi * np.arange(nb) / nb)
signalRQ15=toQ15(signal)
result=np.fft.fft(signal)
print(result)
rfftq15=dsp.arm_rfft_instance_q15()
status=dsp.arm_rfft_init_q15(rfftq15,nb,0,1)
print(status)
resultI = dsp.arm_rfft_q15(rfftq15,signalRQ15)
resultI=Q15toF32(resultI)*(1 << 7)
print(result)
nb = 128
nb2=64
signal = np.cos(2 * np.pi * np.arange(nb) / nb)
result=dct(signal,4,norm='ortho')
print(result)
cfftradix4f32=dsp.arm_cfft_radix4_instance_f32()
rfftf32=dsp.arm_rfft_instance_f32()
dct4f32=dsp.arm_dct4_instance_f32()
status=dsp.arm_dct4_init_f32(dct4f32,rfftf32,cfftradix4f32,nb,nb2,0.125)
print(status)
state=np.zeros(2*nb)
resultI = dsp.arm_dct4_f32(dct4f32,state,signal)
print(resultI)
signal = signal / 10.0
result=dct(signal,4,norm='ortho')
signalQ31=toQ31(signal)
cfftradix4q31=dsp.arm_cfft_radix4_instance_q31()
rfftq31=dsp.arm_rfft_instance_q31()
dct4q31=dsp.arm_dct4_instance_q31()
status=dsp.arm_dct4_init_q31(dct4q31,rfftq31,cfftradix4q31,nb,nb2,0x10000000)
print(status)
state=np.zeros(2*nb)
resultI = dsp.arm_dct4_q31(dct4q31,state,signalQ31)
resultI=Q31toF32(resultI)*(1 << 7)
nb = 128
nb2=64
signal = np.cos(2 * np.pi * np.arange(nb) / nb)
signal = signal / 10.0
result=dct(signal,4,norm='ortho')
signalQ15=toQ15(signal)
cfftradix4q15=dsp.arm_cfft_radix4_instance_q15()
rfftq15=dsp.arm_rfft_instance_q15()
dct4q15=dsp.arm_dct4_instance_q15()
status=dsp.arm_dct4_init_q15(dct4q15,rfftq15,cfftradix4q15,nb,nb2,0x1000)
print(status)
state=np.zeros(2*nb)
resultI = dsp.arm_dct4_q15(dct4q15,state,signalQ15)
resultI=Q15toF32(resultI)*(1 << 7)
from pylab import figure, clf, plot, xlabel, ylabel, xlim, ylim, title, grid, axes, show
figure(1)
plot(np.absolute(signal))
t = np.arange(nb)
freq = np.fft.fftfreq(t.shape[-1])
resultmag=np.absolute(result)
figure(2)
plot(resultmag)
figure(3)
cmsigmag=np.absolute(resultI)
plot(cmsigmag)
show()
biquadf32 = dsp.arm_biquad_casd_df1_inst_f32()
numStages=1
state=np.zeros(numStages*4)
coefs=[1.,2,3,4,5]
dsp.arm_biquad_cascade_df1_init_f32(biquadf32,1,coefs,state)
print(dsp.arm_biquad_cascade_df1_f32(biquadf32,[1,2,3,4,5]))

@ -0,0 +1,4 @@
README
======
Python scripts to generate C arrays used in implementation of some algorithms.

@ -0,0 +1,266 @@
import numpy as np
import math
import argparse
parser = argparse.ArgumentParser(description='Generate C arrays')
parser.add_argument('-f', nargs='?',type = str, default="../Source/CommonTables/arm_mve_tables.c", help="C File path")
parser.add_argument('-he', nargs='?',type = str, default="../Include/arm_mve_tables.h", help="H File path")
args = parser.parse_args()
COLLIM = 80
condition="""#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_%d) || defined(ARM_TABLE_TWIDDLECOEF_F32_%d)
"""
def printCUInt32Array(f,name,arr):
nb = 0
print("uint32_t %s[%d]={" % (name,len(arr)),file=f)
for d in arr:
val = "%d," % d
nb = nb + len(val)
if nb > COLLIM:
print("",file=f)
nb = len(val)
print(val,end="",file=f)
print("};\n",file=f)
def printCFloat32Array(f,name,arr):
nb = 0
print("float32_t %s[%d]={" % (name,len(arr)),file=f)
for d in arr:
val = "%.20ff," % d
nb = nb + len(val)
if nb > COLLIM:
print("",file=f)
nb = len(val)
print(val,end="",file=f)
print("};\n",file=f)
def printHUInt32Array(f,name,arr):
print("extern uint32_t %s[%d];" % (name,len(arr)),file=f)
def printHFloat32Array(f,name,arr):
print("extern float32_t %s[%d];" % (name,len(arr)),file=f)
def twiddle(n):
a=2.0*math.pi*np.linspace(0,n,num=n,endpoint=False)/n
c=np.cos(a)
s=np.sin(a)
r = np.empty((c.size + s.size,), dtype=c.dtype)
r[0::2] = c
r[1::2] = s
return(r)
def reorderTwiddle(f,h,n):
numStages = 6
coefs= twiddle(n)
if n == 4096:
numStages = 6
arraySize = 1364
if n == 1024:
numStages = 5
arraySize = 340
if n == 256:
numStages = 4
arraySize = 84
if n == 64:
numStages = 3
arraySize = 20
if n == 16:
numStages = 2
arraySize = 4
incr = 1
nbOfElt = n
maxNb = 0
tab1 = np.zeros(2*arraySize)
tab2 = np.zeros(2*arraySize)
tab3 = np.zeros(2*arraySize)
tab1Index=0
tab2Index=0
tab3Index=0
tab1Offset = np.zeros(numStages)
tab2Offset = np.zeros(numStages)
tab3Offset = np.zeros(numStages)
for stage in range(0,numStages-1):
nbOfElt = nbOfElt >> 2
pVectCoef1 = 0
pVectCoef2 = 0
pVectCoef3 = 0
tab1Offset[stage] = tab1Index
tab2Offset[stage] = tab2Index
tab3Offset[stage] = tab3Index
for i in range(0,nbOfElt):
tab1[tab1Index] = coefs[pVectCoef1]
tab1[tab1Index + 1] = coefs[pVectCoef1 + 1];
tab1Index = tab1Index + 2
pVectCoef1 = pVectCoef1 + (incr * 1 * 2)
tab2[tab2Index] = coefs[pVectCoef2]
tab2[tab2Index + 1] = coefs[pVectCoef2 + 1];
tab2Index = tab2Index + 2
pVectCoef2 = pVectCoef2 + (incr * 2 * 2)
tab3[tab3Index] = coefs[pVectCoef3]
tab3[tab3Index + 1] = coefs[pVectCoef3 + 1];
tab3Index = tab3Index + 2
pVectCoef3 = pVectCoef3 + (incr * 3 * 2)
maxNb = maxNb + 1
incr = 4 * incr
print(condition % (n, n << 1),file=f)
print(condition % (n, n << 1),file=h)
printCUInt32Array(f,"rearranged_twiddle_tab_stride1_arr_%d" % n,list(tab1Offset))
printHUInt32Array(h,"rearranged_twiddle_tab_stride1_arr_%d" % n,list(tab1Offset))
printCUInt32Array(f,"rearranged_twiddle_tab_stride2_arr_%d" % n,list(tab2Offset))
printHUInt32Array(h,"rearranged_twiddle_tab_stride2_arr_%d" % n,list(tab2Offset))
printCUInt32Array(f,"rearranged_twiddle_tab_stride3_arr_%d" % n,list(tab3Offset))
printHUInt32Array(h,"rearranged_twiddle_tab_stride3_arr_%d" % n,list(tab3Offset))
printCFloat32Array(f,"rearranged_twiddle_stride1_%d" % n,list(tab1))
printHFloat32Array(h,"rearranged_twiddle_stride1_%d" % n,list(tab1))
printCFloat32Array(f,"rearranged_twiddle_stride2_%d" % n,list(tab2))
printHFloat32Array(h,"rearranged_twiddle_stride2_%d" % n,list(tab2))
printCFloat32Array(f,"rearranged_twiddle_stride3_%d" % n,list(tab3))
printHFloat32Array(h,"rearranged_twiddle_stride3_%d" % n,list(tab3))
print("#endif\n",file=f)
print("#endif\n",file=h)
#test = twiddle(16)
#printCFloat32Array("Test",list(test))
cheader="""/* ----------------------------------------------------------------------
* Project: CMSIS DSP Library
* Title: arm_mve_tables.c
* Description: common tables like fft twiddle factors, Bitreverse, reciprocal etc
* used for MVE implementation only
*
* $Date: 08. January 2020
* $Revision: V1.7.0
*
* Target Processor: Cortex-M cores
* -------------------------------------------------------------------- */
/*
* Copyright (C) 2010-2020 ARM Limited or its affiliates. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the License); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "arm_math.h"
#if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES)
"""
cfooter="""
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES) */
#endif /* defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) */
"""
hheader="""/* ----------------------------------------------------------------------
* Project: CMSIS DSP Library
* Title: arm_mve_tables.h
* Description: common tables like fft twiddle factors, Bitreverse, reciprocal etc
* used for MVE implementation only
*
* $Date: 08. January 2020
* $Revision: V1.7.0
*
* Target Processor: Cortex-M cores
* -------------------------------------------------------------------- */
/*
* Copyright (C) 2010-2020 ARM Limited or its affiliates. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the License); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _ARM_MVE_TABLES_H
#define _ARM_MVE_TABLES_H
#include "arm_math.h"
#if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES)
"""
hfooter="""
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES) */
#endif /* defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) */
#endif /*_ARM_MVE_TABLES_H*/
"""
with open(args.f,'w') as f:
with open(args.he,'w') as h:
print(cheader,file=f)
print(hheader,file=h)
reorderTwiddle(f,h,16)
reorderTwiddle(f,h,64)
reorderTwiddle(f,h,256)
reorderTwiddle(f,h,1024)
reorderTwiddle(f,h,4096)
print(cfooter,file=f)
print(hfooter,file=h)

@ -34,4 +34,8 @@ if (NEON OR NEONEXPERIMENTAL)
target_sources(CMSISDSPCommon PRIVATE "${DSP}/ComputeLibrary/Source/arm_cl_tables.c")
endif()
if (HELIUM OR MVEF)
target_sources(CMSISDSPCommon PRIVATE "${DSP}/Source/CommonTables/arm_mve_tables.c")
endif()

@ -28,4 +28,4 @@
#include "arm_common_tables.c"
#include "arm_const_structs.c"
#include "arm_mve_tables.c"

@ -29,6 +29,10 @@
#include "arm_const_structs.h"
/*
ALLOW TABLE is true when config table is enabled and the Tramsform folder is included
for compilation.
*/
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES)
/* Floating-point structs */
@ -87,12 +91,25 @@ const arm_cfft_instance_f64 arm_cfft_sR_f64_len4096 = {
#endif
/* Floating-point structs */
#if !defined(ARM_MATH_MVEF) || defined(ARM_MATH_AUTOVECTORIZE)
/*
Those structures cannot be used to initialize the MVE version of the FFT F32 instances.
So they are not compiled when MVE is defined.
For the MVE version, the new arm_cfft_init_f32 must be used.
*/
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_16) && defined(ARM_TABLE_BITREVIDX_FLT_16))
const arm_cfft_instance_f32 arm_cfft_sR_f32_len16 = {
16, twiddleCoef_16, armBitRevIndexTable16, ARMBITREVINDEXTABLE_16_TABLE_LENGTH
};
#endif
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_32) && defined(ARM_TABLE_BITREVIDX_FLT_32))
const arm_cfft_instance_f32 arm_cfft_sR_f32_len32 = {
32, twiddleCoef_32, armBitRevIndexTable32, ARMBITREVINDEXTABLE_32_TABLE_LENGTH
@ -141,6 +158,8 @@ const arm_cfft_instance_f32 arm_cfft_sR_f32_len4096 = {
};
#endif
#endif /* !defined(ARM_MATH_MVEF) || defined(ARM_MATH_AUTOVECTORIZE) */
/* Fixed-point structs */
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_16) && defined(ARM_TABLE_BITREVIDX_FXT_16))
@ -320,6 +339,8 @@ const arm_rfft_fast_instance_f64 arm_rfft_fast_sR_f64_len4096 = {
/* Floating-point structs */
#if !defined(ARM_MATH_MVEF) || defined(ARM_MATH_AUTOVECTORIZE)
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_32) && defined(ARM_TABLE_BITREVIDX_FLT_32) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_32))
const arm_rfft_fast_instance_f32 arm_rfft_fast_sR_f32_len32 = {
{ 16, twiddleCoef_32, armBitRevIndexTable32, ARMBITREVINDEXTABLE_16_TABLE_LENGTH },
@ -384,6 +405,8 @@ const arm_rfft_fast_instance_f32 arm_rfft_fast_sR_f32_len4096 = {
};
#endif
#endif /* #if !defined(ARM_MATH_MVEF) || defined(ARM_MATH_AUTOVECTORIZE) */
/* Fixed-point structs */
/* q31_t */

File diff suppressed because it is too large Load Diff

@ -25,6 +25,7 @@ target_sources(CMSISDSPTransform PRIVATE arm_cfft_radix2_f32.c)
target_sources(CMSISDSPTransform PRIVATE arm_cfft_radix4_f32.c)
target_sources(CMSISDSPTransform PRIVATE arm_cfft_radix8_f32.c)
target_sources(CMSISDSPTransform PRIVATE arm_cfft_f32.c)
target_sources(CMSISDSPTransform PRIVATE arm_cfft_init_f32.c)
endif()
if (NOT CONFIGTABLE OR ALLFFT OR CFFT_F64_16 OR CFFT_F64_32 OR CFFT_F64_64 OR CFFT_F64_128 OR CFFT_F64_256 OR CFFT_F64_512

@ -58,3 +58,4 @@
#include "arm_rfft_init_q31.c"
#include "arm_rfft_q15.c"
#include "arm_rfft_q31.c"
#include "arm_cfft_init_f32.c"

@ -29,6 +29,591 @@
#include "arm_math.h"
#include "arm_common_tables.h"
#if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
#include "arm_helium_utils.h"
#include "arm_vec_fft.h"
#include "arm_mve_tables.h"
static float32_t arm_inverse_fft_length_f32(uint16_t fftLen)
{
float32_t retValue=1.0;
switch (fftLen)
{
case 4096U:
retValue = 0.000244140625;
break;
case 2048U:
retValue = 0.00048828125;
break;
case 1024U:
retValue = 0.0009765625f;
break;
case 512U:
retValue = 0.001953125;
break;
case 256U:
retValue = 0.00390625f;
break;
case 128U:
retValue = 0.0078125;
break;
case 64U:
retValue = 0.015625f;
break;
case 32U:
retValue = 0.03125;
break;
case 16U:
retValue = 0.0625f;
break;
default:
break;
}
return(retValue);
}
static void arm_bitreversal_32_inpl_mve(
uint32_t *pSrc,
const uint16_t bitRevLen,
const uint16_t *pBitRevTab)
{
uint64_t *src = (uint64_t *) pSrc;
uint32_t blkCnt; /* loop counters */
uint32x4_t bitRevTabOff;
uint32x4_t one = vdupq_n_u32(1);
blkCnt = (bitRevLen / 2) / 2;
while (blkCnt > 0U) {
bitRevTabOff = vldrhq_u32(pBitRevTab);
pBitRevTab += 4;
uint64x2_t bitRevOff1 = vmullbq_int_u32(bitRevTabOff, one);
uint64x2_t bitRevOff2 = vmulltq_int_u32(bitRevTabOff, one);
uint64x2_t in1 = vldrdq_gather_offset_u64(src, bitRevOff1);
uint64x2_t in2 = vldrdq_gather_offset_u64(src, bitRevOff2);
vstrdq_scatter_offset_u64(src, bitRevOff1, in2);
vstrdq_scatter_offset_u64(src, bitRevOff2, in1);
/*
* Decrement the blockSize loop counter
*/
blkCnt--;
}
}
static void _arm_radix4_butterfly_f32_mve(const arm_cfft_instance_f32 * S,float32_t * pSrc, uint32_t fftLen)
{
f32x4_t vecTmp0, vecTmp1;
f32x4_t vecSum0, vecDiff0, vecSum1, vecDiff1;
f32x4_t vecA, vecB, vecC, vecD;
uint32_t blkCnt;
uint32_t n1, n2;
uint32_t stage = 0;
int32_t iter = 1;
static const uint32_t strides[4] = {
(0 - 16) * sizeof(q31_t *),
(1 - 16) * sizeof(q31_t *),
(8 - 16) * sizeof(q31_t *),
(9 - 16) * sizeof(q31_t *)
};
n2 = fftLen;
n1 = n2;
n2 >>= 2u;
for (int k = fftLen / 4u; k > 1; k >>= 2)
{
for (int i = 0; i < iter; i++)
{
float32_t const *p_rearranged_twiddle_tab_stride1 =
&S->rearranged_twiddle_stride1[
S->rearranged_twiddle_tab_stride1_arr[stage]];
float32_t const *p_rearranged_twiddle_tab_stride2 =
&S->rearranged_twiddle_stride2[
S->rearranged_twiddle_tab_stride2_arr[stage]];
float32_t const *p_rearranged_twiddle_tab_stride3 =
&S->rearranged_twiddle_stride3[
S->rearranged_twiddle_tab_stride3_arr[stage]];
float32_t const *pW1, *pW2, *pW3;
float32_t *inA = pSrc + CMPLX_DIM * i * n1;
float32_t *inB = inA + n2 * CMPLX_DIM;
float32_t *inC = inB + n2 * CMPLX_DIM;
float32_t *inD = inC + n2 * CMPLX_DIM;
f32x4_t vecW;
pW1 = p_rearranged_twiddle_tab_stride1;
pW2 = p_rearranged_twiddle_tab_stride2;
pW3 = p_rearranged_twiddle_tab_stride3;
blkCnt = n2 / 2;
/*
* load 2 f32 complex pair
*/
vecA = vldrwq_f32(inA);
vecC = vldrwq_f32(inC);
while (blkCnt > 0U)
{
vecB = vldrwq_f32(inB);
vecD = vldrwq_f32(inD);
vecSum0 = vecA + vecC; /* vecSum0 = vaddq(vecA, vecC) */
vecDiff0 = vecA - vecC; /* vecSum0 = vsubq(vecA, vecC) */
vecSum1 = vecB + vecD;
vecDiff1 = vecB - vecD;
/*
* [ 1 1 1 1 ] * [ A B C D ]' .* 1
*/
vecTmp0 = vecSum0 + vecSum1;
vst1q(inA, vecTmp0);
inA += 4;
/*
* [ 1 -1 1 -1 ] * [ A B C D ]'
*/
vecTmp0 = vecSum0 - vecSum1;
/*
* [ 1 -1 1 -1 ] * [ A B C D ]'.* W2
*/
vecW = vld1q(pW2);
pW2 += 4;
vecTmp1 = MVE_CMPLX_MULT_FLT_Conj_AxB(vecW, vecTmp0);
vst1q(inB, vecTmp1);
inB += 4;
/*
* [ 1 -i -1 +i ] * [ A B C D ]'
*/
vecTmp0 = MVE_CMPLX_SUB_A_ixB(vecDiff0, vecDiff1);
/*
* [ 1 -i -1 +i ] * [ A B C D ]'.* W1
*/
vecW = vld1q(pW1);
pW1 +=4;
vecTmp1 = MVE_CMPLX_MULT_FLT_Conj_AxB(vecW, vecTmp0);
vst1q(inC, vecTmp1);
inC += 4;
/*
* [ 1 +i -1 -i ] * [ A B C D ]'
*/
vecTmp0 = MVE_CMPLX_ADD_A_ixB(vecDiff0, vecDiff1);
/*
* [ 1 +i -1 -i ] * [ A B C D ]'.* W3
*/
vecW = vld1q(pW3);
pW3 += 4;
vecTmp1 = MVE_CMPLX_MULT_FLT_Conj_AxB(vecW, vecTmp0);
vst1q(inD, vecTmp1);
inD += 4;
vecA = vldrwq_f32(inA);
vecC = vldrwq_f32(inC);
blkCnt--;
}
}
n1 = n2;
n2 >>= 2u;
iter = iter << 2;
stage++;
}
/*
* start of Last stage process
*/
uint32x4_t vecScGathAddr = *(uint32x4_t *) strides;
vecScGathAddr = vecScGathAddr + (uint32_t) pSrc;
/* load scheduling */
vecA = vldrwq_gather_base_wb_f32(&vecScGathAddr, 64);
vecC = vldrwq_gather_base_f32(vecScGathAddr, 16);
blkCnt = (fftLen >> 3);
while (blkCnt > 0U)
{
vecSum0 = vecA + vecC; /* vecSum0 = vaddq(vecA, vecC) */
vecDiff0 = vecA - vecC; /* vecSum0 = vsubq(vecA, vecC) */
vecB = vldrwq_gather_base_f32(vecScGathAddr, 8);
vecD = vldrwq_gather_base_f32(vecScGathAddr, 24);
vecSum1 = vecB + vecD;
vecDiff1 = vecB - vecD;
/* pre-load for next iteration */
vecA = vldrwq_gather_base_wb_f32(&vecScGathAddr, 64);
vecC = vldrwq_gather_base_f32(vecScGathAddr, 16);
vecTmp0 = vecSum0 + vecSum1;
vstrwq_scatter_base_f32(vecScGathAddr, -64, vecTmp0);
vecTmp0 = vecSum0 - vecSum1;
vstrwq_scatter_base_f32(vecScGathAddr, -64 + 8, vecTmp0);
vecTmp0 = MVE_CMPLX_SUB_A_ixB(vecDiff0, vecDiff1);
vstrwq_scatter_base_f32(vecScGathAddr, -64 + 16, vecTmp0);
vecTmp0 = MVE_CMPLX_ADD_A_ixB(vecDiff0, vecDiff1);
vstrwq_scatter_base_f32(vecScGathAddr, -64 + 24, vecTmp0);
blkCnt--;
}
/*
* End of last stage process
*/
}
static void arm_cfft_radix4by2_f32_mve(const arm_cfft_instance_f32 * S, float32_t *pSrc, uint32_t fftLen)
{
float32_t const *pCoefVec;
float32_t const *pCoef = S->pTwiddle;
float32_t *pIn0, *pIn1;
uint32_t n2;
uint32_t blkCnt;
f32x4_t vecIn0, vecIn1, vecSum, vecDiff;
f32x4_t vecCmplxTmp, vecTw;
n2 = fftLen >> 1;
pIn0 = pSrc;
pIn1 = pSrc + fftLen;
pCoefVec = pCoef;
blkCnt = n2 / 2;
while (blkCnt > 0U)
{
vecIn0 = *(f32x4_t *) pIn0;
vecIn1 = *(f32x4_t *) pIn1;
vecTw = vld1q(pCoefVec);
pCoefVec += 4;
vecSum = vecIn0 + vecIn1;
vecDiff = vecIn0 - vecIn1;
vecCmplxTmp = MVE_CMPLX_MULT_FLT_Conj_AxB(vecTw, vecDiff);
vst1q(pIn0, vecSum);
pIn0 += 4;
vst1q(pIn1, vecCmplxTmp);
pIn1 += 4;
blkCnt--;
}
_arm_radix4_butterfly_f32_mve(S, pSrc, n2);
_arm_radix4_butterfly_f32_mve(S, pSrc + fftLen, n2);
pIn0 = pSrc;
}
static void _arm_radix4_butterfly_inverse_f32_mve(const arm_cfft_instance_f32 * S,float32_t * pSrc, uint32_t fftLen, float32_t onebyfftLen)
{
f32x4_t vecTmp0, vecTmp1;
f32x4_t vecSum0, vecDiff0, vecSum1, vecDiff1;
f32x4_t vecA, vecB, vecC, vecD;
f32x4_t vecW;
uint32_t blkCnt;
uint32_t n1, n2;
uint32_t stage = 0;
int32_t iter = 1;
static const uint32_t strides[4] = {
(0 - 16) * sizeof(q31_t *),
(1 - 16) * sizeof(q31_t *),
(8 - 16) * sizeof(q31_t *),
(9 - 16) * sizeof(q31_t *)
};
n2 = fftLen;
n1 = n2;
n2 >>= 2u;
for (int k = fftLen / 4; k > 1; k >>= 2)
{
for (int i = 0; i < iter; i++)
{
float32_t const *p_rearranged_twiddle_tab_stride1 =
&S->rearranged_twiddle_stride1[
S->rearranged_twiddle_tab_stride1_arr[stage]];
float32_t const *p_rearranged_twiddle_tab_stride2 =
&S->rearranged_twiddle_stride2[
S->rearranged_twiddle_tab_stride2_arr[stage]];
float32_t const *p_rearranged_twiddle_tab_stride3 =
&S->rearranged_twiddle_stride3[
S->rearranged_twiddle_tab_stride3_arr[stage]];
float32_t const *pW1, *pW2, *pW3;
float32_t *inA = pSrc + CMPLX_DIM * i * n1;
float32_t *inB = inA + n2 * CMPLX_DIM;
float32_t *inC = inB + n2 * CMPLX_DIM;
float32_t *inD = inC + n2 * CMPLX_DIM;
pW1 = p_rearranged_twiddle_tab_stride1;
pW2 = p_rearranged_twiddle_tab_stride2;
pW3 = p_rearranged_twiddle_tab_stride3;
blkCnt = n2 / 2;
/*
* load 2 f32 complex pair
*/
vecA = vldrwq_f32(inA);
vecC = vldrwq_f32(inC);
while (blkCnt > 0U)
{
vecB = vldrwq_f32(inB);
vecD = vldrwq_f32(inD);
vecSum0 = vecA + vecC; /* vecSum0 = vaddq(vecA, vecC) */
vecDiff0 = vecA - vecC; /* vecSum0 = vsubq(vecA, vecC) */
vecSum1 = vecB + vecD;
vecDiff1 = vecB - vecD;
/*
* [ 1 1 1 1 ] * [ A B C D ]' .* 1
*/
vecTmp0 = vecSum0 + vecSum1;
vst1q(inA, vecTmp0);
inA += 4;
/*
* [ 1 -1 1 -1 ] * [ A B C D ]'
*/
vecTmp0 = vecSum0 - vecSum1;
/*
* [ 1 -1 1 -1 ] * [ A B C D ]'.* W1
*/
vecW = vld1q(pW2);
pW2 += 4;
vecTmp1 = MVE_CMPLX_MULT_FLT_AxB(vecW, vecTmp0);
vst1q(inB, vecTmp1);
inB += 4;
/*
* [ 1 -i -1 +i ] * [ A B C D ]'
*/
vecTmp0 = MVE_CMPLX_ADD_A_ixB(vecDiff0, vecDiff1);
/*
* [ 1 -i -1 +i ] * [ A B C D ]'.* W2
*/
vecW = vld1q(pW1);
pW1 += 4;
vecTmp1 = MVE_CMPLX_MULT_FLT_AxB(vecW, vecTmp0);
vst1q(inC, vecTmp1);
inC += 4;
/*
* [ 1 +i -1 -i ] * [ A B C D ]'
*/
vecTmp0 = MVE_CMPLX_SUB_A_ixB(vecDiff0, vecDiff1);
/*
* [ 1 +i -1 -i ] * [ A B C D ]'.* W3
*/
vecW = vld1q(pW3);
pW3 += 4;
vecTmp1 = MVE_CMPLX_MULT_FLT_AxB(vecW, vecTmp0);
vst1q(inD, vecTmp1);
inD += 4;
vecA = vldrwq_f32(inA);
vecC = vldrwq_f32(inC);
blkCnt--;
}
}
n1 = n2;
n2 >>= 2u;
iter = iter << 2;
stage++;
}
/*
* start of Last stage process
*/
uint32x4_t vecScGathAddr = *(uint32x4_t *) strides;
vecScGathAddr = vecScGathAddr + (uint32_t) pSrc;
/*
* load scheduling
*/
vecA = vldrwq_gather_base_wb_f32(&vecScGathAddr, 64);
vecC = vldrwq_gather_base_f32(vecScGathAddr, 16);
blkCnt = (fftLen >> 3);
while (blkCnt > 0U)
{
vecSum0 = vecA + vecC; /* vecSum0 = vaddq(vecA, vecC) */
vecDiff0 = vecA - vecC; /* vecSum0 = vsubq(vecA, vecC) */
vecB = vldrwq_gather_base_f32(vecScGathAddr, 8);
vecD = vldrwq_gather_base_f32(vecScGathAddr, 24);
vecSum1 = vecB + vecD;
vecDiff1 = vecB - vecD;
vecA = vldrwq_gather_base_wb_f32(&vecScGathAddr, 64);
vecC = vldrwq_gather_base_f32(vecScGathAddr, 16);
vecTmp0 = vecSum0 + vecSum1;
vecTmp0 = vecTmp0 * onebyfftLen;
vstrwq_scatter_base_f32(vecScGathAddr, -64, vecTmp0);
vecTmp0 = vecSum0 - vecSum1;
vecTmp0 = vecTmp0 * onebyfftLen;
vstrwq_scatter_base_f32(vecScGathAddr, -64 + 8, vecTmp0);
vecTmp0 = MVE_CMPLX_ADD_A_ixB(vecDiff0, vecDiff1);
vecTmp0 = vecTmp0 * onebyfftLen;
vstrwq_scatter_base_f32(vecScGathAddr, -64 + 16, vecTmp0);
vecTmp0 = MVE_CMPLX_SUB_A_ixB(vecDiff0, vecDiff1);
vecTmp0 = vecTmp0 * onebyfftLen;
vstrwq_scatter_base_f32(vecScGathAddr, -64 + 24, vecTmp0);
blkCnt--;
}
/*
* End of last stage process
*/
}
static void arm_cfft_radix4by2_inverse_f32_mve(const arm_cfft_instance_f32 * S,float32_t *pSrc, uint32_t fftLen)
{
float32_t const *pCoefVec;
float32_t const *pCoef = S->pTwiddle;
float32_t *pIn0, *pIn1;
uint32_t n2;
float32_t onebyfftLen = arm_inverse_fft_length_f32(fftLen);
uint32_t blkCnt;
f32x4_t vecIn0, vecIn1, vecSum, vecDiff;
f32x4_t vecCmplxTmp, vecTw;
n2 = fftLen >> 1;
pIn0 = pSrc;
pIn1 = pSrc + fftLen;
pCoefVec = pCoef;
blkCnt = n2 / 2;
while (blkCnt > 0U)
{
vecIn0 = *(f32x4_t *) pIn0;
vecIn1 = *(f32x4_t *) pIn1;
vecTw = vld1q(pCoefVec);
pCoefVec += 4;
vecSum = vecIn0 + vecIn1;
vecDiff = vecIn0 - vecIn1;
vecCmplxTmp = MVE_CMPLX_MULT_FLT_AxB(vecTw, vecDiff);
vst1q(pIn0, vecSum);
pIn0 += 4;
vst1q(pIn1, vecCmplxTmp);
pIn1 += 4;
blkCnt--;
}
_arm_radix4_butterfly_inverse_f32_mve(S, pSrc, n2, onebyfftLen);
_arm_radix4_butterfly_inverse_f32_mve(S, pSrc + fftLen, n2, onebyfftLen);
}
/**
@addtogroup ComplexFFT
@{
*/
/**
@brief Processing function for the floating-point complex FFT.
@param[in] S points to an instance of the floating-point CFFT structure
@param[in,out] p1 points to the complex data buffer of size <code>2*fftLen</code>. Processing occurs in-place
@param[in] ifftFlag flag that selects transform direction
- value = 0: forward transform
- value = 1: inverse transform
@param[in] bitReverseFlag flag that enables / disables bit reversal of output
- value = 0: disables bit reversal of output
- value = 1: enables bit reversal of output
@return none
*/
void arm_cfft_f32(
const arm_cfft_instance_f32 * S,
float32_t * pSrc,
uint8_t ifftFlag,
uint8_t bitReverseFlag)
{
uint32_t fftLen = S->fftLen;
if (ifftFlag == 1U) {
switch (fftLen) {
case 16:
case 64:
case 256:
case 1024:
case 4096:
_arm_radix4_butterfly_inverse_f32_mve(S, pSrc, fftLen, arm_inverse_fft_length_f32(S->fftLen));
break;
case 32:
case 128:
case 512:
case 2048:
arm_cfft_radix4by2_inverse_f32_mve(S, pSrc, fftLen);
break;
}
} else {
switch (fftLen) {
case 16:
case 64:
case 256:
case 1024:
case 4096:
_arm_radix4_butterfly_f32_mve(S, pSrc, fftLen);
break;
case 32:
case 128:
case 512:
case 2048:
arm_cfft_radix4by2_f32_mve(S, pSrc, fftLen);
break;
}
}
if (bitReverseFlag)
{
arm_bitreversal_32_inpl_mve((uint32_t*)pSrc, S->bitRevLength, S->pBitRevTable);
}
}
#else
extern void arm_radix8_butterfly_f32(
float32_t * pSrc,
uint16_t fftLen,
@ -76,8 +661,13 @@ extern void arm_bitreversal_32(
inverse transform includes a scale of <code>1/fftLen</code> as part of the
calculation and this matches the textbook definition of the inverse FFT.
@par
Pre-initialized data structures containing twiddle factors and bit reversal
tables are provided and defined in <code>arm_const_structs.h</code>. Include
For the MVE version, the new arm_cfft_init_f32 initialization function is
<b>mandatory</b>. <b>Compilation flags are available to include only the required tables for the
needed FFTs.</b> Other FFT versions can continue to be initialized as
explained below.
@par
For not MVE versions, pre-initialized data structures containing twiddle factors
and bit reversal tables are provided and defined in <code>arm_const_structs.h</code>. Include
this header in your function and then pass one of the constant structures as
an argument to arm_cfft_f32. For example:
@par
@ -127,6 +717,8 @@ extern void arm_bitreversal_32(
break;
}
@endcode
@par
The new arm_cfft_init_f32 can also be used.
@par Q15 and Q31
The floating-point complex FFT uses a mixed-radix algorithm. Multiple radix-4
stages are performed along with a single radix-2 stage, as needed.
@ -623,6 +1215,7 @@ void arm_cfft_f32(
}
}
}
#endif /* defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) */
/**
@} end of ComplexFFT group

@ -0,0 +1,353 @@
/* ----------------------------------------------------------------------
* Project: CMSIS DSP Library
* Title: arm_cfft_init_f32.c
* Description: Initialization function for cfft f32 instance
*
* $Date: 07. January 2020
* $Revision: V1.7.0
*
* Target Processor: Cortex-M cores
* -------------------------------------------------------------------- */
/*
* Copyright (C) 2010-2020 ARM Limited or its affiliates. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the License); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#define FFTINIT(EXT,SIZE) \
S->bitRevLength = arm_cfft_sR_##EXT##_len##SIZE.bitRevLength; \
S->pBitRevTable = arm_cfft_sR_##EXT##_len##SIZE.pBitRevTable; \
S->pTwiddle = arm_cfft_sR_##EXT##_len##SIZE.pTwiddle;
/**
@addtogroup ComplexFFT
@{
*/
/**
@brief Initialization function for the cfft f32 function
@param[in,out] S points to an instance of the floating-point CFFT structure
@param[in] fftLen fft length (number of complex samples)
@return execution status
- \ref ARM_MATH_SUCCESS : Operation successful
- \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
@par Use of this function is mandatory only for the MVE version of the FFT.
Other versions can still initialize directly the data structure using
variables declared in arm_const_structs.h
*/
#include "arm_math.h"
#include "arm_common_tables.h"
#include "arm_const_structs.h"
#if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
#include "arm_vec_fft.h"
#include "arm_mve_tables.h"
arm_status arm_cfft_radix4by2_rearrange_twiddles_f32(arm_cfft_instance_f32 *S, int twidCoefModifier)
{
switch (S->fftLen >> (twidCoefModifier - 1)) {
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_4096)
case 4096U:
S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_4096;
S->rearranged_twiddle_stride1 = rearranged_twiddle_stride1_4096;
S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_4096;
S->rearranged_twiddle_stride2 = rearranged_twiddle_stride2_4096;
S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_4096;
S->rearranged_twiddle_stride3 = rearranged_twiddle_stride3_4096;
break;
#endif
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_1024) || defined(ARM_TABLE_BITREVIDX_FXT_2048)
case 1024U:
S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_1024;
S->rearranged_twiddle_stride1 = rearranged_twiddle_stride1_1024;
S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_1024;
S->rearranged_twiddle_stride2 = rearranged_twiddle_stride2_1024;
S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_1024;
S->rearranged_twiddle_stride3 = rearranged_twiddle_stride3_1024;
break;
#endif
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_256) || defined(ARM_TABLE_BITREVIDX_FXT_512)
case 256U:
S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_256;
S->rearranged_twiddle_stride1 = rearranged_twiddle_stride1_256;
S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_256;
S->rearranged_twiddle_stride2 = rearranged_twiddle_stride2_256;
S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_256;
S->rearranged_twiddle_stride3 = rearranged_twiddle_stride3_256;
break;
#endif
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_64) || defined(ARM_TABLE_BITREVIDX_FXT_128)
case 64U:
S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_64;
S->rearranged_twiddle_stride1 = rearranged_twiddle_stride1_64;
S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_64;
S->rearranged_twiddle_stride2 = rearranged_twiddle_stride2_64;
S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_64;
S->rearranged_twiddle_stride3 = rearranged_twiddle_stride3_64;
break;
#endif
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_16) || defined(ARM_TABLE_BITREVIDX_FXT_32)
case 16U:
S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_16;
S->rearranged_twiddle_stride1 = rearranged_twiddle_stride1_16;
S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_16;
S->rearranged_twiddle_stride2 = rearranged_twiddle_stride2_16;
S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_16;
S->rearranged_twiddle_stride3 = rearranged_twiddle_stride3_16;
break;
#endif
default:
return(ARM_MATH_ARGUMENT_ERROR);
break;
/* invalid sizes already filtered */
}
return(ARM_MATH_SUCCESS);
}
arm_status arm_cfft_init_f32(
arm_cfft_instance_f32 * S,
uint16_t fftLen)
{
/* Initialise the default arm status */
arm_status status = ARM_MATH_SUCCESS;
/* Initialise the FFT length */
S->fftLen = fftLen;
/* Initialise the Twiddle coefficient pointer */
S->pTwiddle = NULL;
/* Initializations of Instance structure depending on the FFT length */
switch (S->fftLen) {
/* Initializations of structure parameters for 4096 point FFT */
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_4096)
case 4096U:
/* Initialise the bit reversal table modifier */
S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH;
S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_4096;
S->pTwiddle = (float32_t *)twiddleCoef_4096;
status=arm_cfft_radix4by2_rearrange_twiddles_f32(S, 1);
break;
#endif
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_2048)
/* Initializations of structure parameters for 2048 point FFT */
case 2048U:
/* Initialise the bit reversal table modifier */
S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH;
S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_2048;
S->pTwiddle = (float32_t *)twiddleCoef_2048;
status=arm_cfft_radix4by2_rearrange_twiddles_f32(S, 2);
break;
#endif
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_1024)
/* Initializations of structure parameters for 1024 point FFT */
case 1024U:
/* Initialise the bit reversal table modifier */
S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH;
S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_1024;
S->pTwiddle = (float32_t *)twiddleCoef_1024;
status=arm_cfft_radix4by2_rearrange_twiddles_f32(S, 1);
break;
#endif
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_512)
/* Initializations of structure parameters for 512 point FFT */
case 512U:
/* Initialise the bit reversal table modifier */
S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH;
S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_512;
S->pTwiddle = (float32_t *)twiddleCoef_512;
status=arm_cfft_radix4by2_rearrange_twiddles_f32(S, 2);
break;
#endif
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_256)
case 256U:
S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH;
S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_256;
S->pTwiddle = (float32_t *)twiddleCoef_256;
status=arm_cfft_radix4by2_rearrange_twiddles_f32(S, 1);
break;
#endif
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_128)
case 128U:
S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH;
S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_128;
S->pTwiddle = (float32_t *)twiddleCoef_128;
status=arm_cfft_radix4by2_rearrange_twiddles_f32(S, 2);
break;
#endif
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_64)
case 64U:
S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH;
S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_64;
S->pTwiddle = (float32_t *)twiddleCoef_64;
status=arm_cfft_radix4by2_rearrange_twiddles_f32(S, 1);
break;
#endif
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_32)
case 32U:
S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH;
S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_32;
S->pTwiddle = (float32_t *)twiddleCoef_32;
status=arm_cfft_radix4by2_rearrange_twiddles_f32(S, 2);
break;
#endif
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_16)
case 16U:
/* Initializations of structure parameters for 16 point FFT */
S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH;
S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_16;
S->pTwiddle = (float32_t *)twiddleCoef_16;
status=arm_cfft_radix4by2_rearrange_twiddles_f32(S, 1);
break;
#endif
default:
/* Reporting argument error if fftSize is not valid value */
status = ARM_MATH_ARGUMENT_ERROR;
break;
}
return (status);
}
#else
arm_status arm_cfft_init_f32(
arm_cfft_instance_f32 * S,
uint16_t fftLen)
{
/* Initialise the default arm status */
arm_status status = ARM_MATH_SUCCESS;
/* Initialise the FFT length */
S->fftLen = fftLen;
/* Initialise the Twiddle coefficient pointer */
S->pTwiddle = NULL;
/* Initializations of Instance structure depending on the FFT length */
switch (S->fftLen) {
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_4096) && defined(ARM_TABLE_BITREVIDX_FLT_4096))
/* Initializations of structure parameters for 4096 point FFT */
case 4096U:
/* Initialise the bit reversal table modifier */
FFTINIT(f32,4096);
break;
#endif
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_2048) && defined(ARM_TABLE_BITREVIDX_FLT_2048))
/* Initializations of structure parameters for 2048 point FFT */
case 2048U:
/* Initialise the bit reversal table modifier */
FFTINIT(f32,2048);
break;
#endif
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_1024) && defined(ARM_TABLE_BITREVIDX_FLT_1024))
/* Initializations of structure parameters for 1024 point FFT */
case 1024U:
/* Initialise the bit reversal table modifier */
FFTINIT(f32,1024);
break;
#endif
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_512) && defined(ARM_TABLE_BITREVIDX_FLT_512))
/* Initializations of structure parameters for 512 point FFT */
case 512U:
/* Initialise the bit reversal table modifier */
FFTINIT(f32,512);
break;
#endif
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_256) && defined(ARM_TABLE_BITREVIDX_FLT_256))
case 256U:
FFTINIT(f32,256);
break;
#endif
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_128) && defined(ARM_TABLE_BITREVIDX_FLT_128))
case 128U:
FFTINIT(f32,128);
break;
#endif
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_64) && defined(ARM_TABLE_BITREVIDX_FLT_64))
case 64U:
FFTINIT(f32,64);
break;
#endif
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_32) && defined(ARM_TABLE_BITREVIDX_FLT_32))
case 32U:
FFTINIT(f32,32);
break;
#endif
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_16) && defined(ARM_TABLE_BITREVIDX_FLT_16))
case 16U:
/* Initializations of structure parameters for 16 point FFT */
FFTINIT(f32,16);
break;
#endif
default:
/* Reporting argument error if fftSize is not valid value */
status = ARM_MATH_ARGUMENT_ERROR;
break;
}
return (status);
}
#endif /* defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) */
/**
@} end of ComplexFFT group
*/

@ -50,17 +50,17 @@
arm_status arm_rfft_32_fast_init_f32( arm_rfft_fast_instance_f32 * S ) {
arm_cfft_instance_f32 * Sint;
arm_status status;
if( !S ) return ARM_MATH_ARGUMENT_ERROR;
Sint = &(S->Sint);
Sint->fftLen = 16U;
S->fftLenRFFT = 32U;
status=arm_cfft_init_f32(&(S->Sint),16);
if (status != ARM_MATH_SUCCESS)
{
return(status);
}
Sint->bitRevLength = ARMBITREVINDEXTABLE_16_TABLE_LENGTH;
Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable16;
Sint->pTwiddle = (float32_t *) twiddleCoef_16;
S->fftLenRFFT = 32U;
S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_32;
return ARM_MATH_SUCCESS;
@ -79,17 +79,17 @@ arm_status arm_rfft_32_fast_init_f32( arm_rfft_fast_instance_f32 * S ) {
arm_status arm_rfft_64_fast_init_f32( arm_rfft_fast_instance_f32 * S ) {
arm_cfft_instance_f32 * Sint;
arm_status status;
if( !S ) return ARM_MATH_ARGUMENT_ERROR;
Sint = &(S->Sint);
Sint->fftLen = 32U;
status=arm_cfft_init_f32(&(S->Sint),32);
if (status != ARM_MATH_SUCCESS)
{
return(status);
}
S->fftLenRFFT = 64U;
Sint->bitRevLength = ARMBITREVINDEXTABLE_32_TABLE_LENGTH;
Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable32;
Sint->pTwiddle = (float32_t *) twiddleCoef_32;
S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_64;
return ARM_MATH_SUCCESS;
@ -108,17 +108,17 @@ arm_status arm_rfft_64_fast_init_f32( arm_rfft_fast_instance_f32 * S ) {
arm_status arm_rfft_128_fast_init_f32( arm_rfft_fast_instance_f32 * S ) {
arm_cfft_instance_f32 * Sint;
arm_status status;
if( !S ) return ARM_MATH_ARGUMENT_ERROR;
Sint = &(S->Sint);
Sint->fftLen = 64U;
S->fftLenRFFT = 128U;
status=arm_cfft_init_f32(&(S->Sint),64);
if (status != ARM_MATH_SUCCESS)
{
return(status);
}
S->fftLenRFFT = 128;
Sint->bitRevLength = ARMBITREVINDEXTABLE_64_TABLE_LENGTH;
Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable64;
Sint->pTwiddle = (float32_t *) twiddleCoef_64;
S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_128;
return ARM_MATH_SUCCESS;
@ -137,17 +137,17 @@ arm_status arm_rfft_128_fast_init_f32( arm_rfft_fast_instance_f32 * S ) {
arm_status arm_rfft_256_fast_init_f32( arm_rfft_fast_instance_f32 * S ) {
arm_cfft_instance_f32 * Sint;
arm_status status;
if( !S ) return ARM_MATH_ARGUMENT_ERROR;
Sint = &(S->Sint);
Sint->fftLen = 128U;
status=arm_cfft_init_f32(&(S->Sint),128);
if (status != ARM_MATH_SUCCESS)
{
return(status);
}
S->fftLenRFFT = 256U;
Sint->bitRevLength = ARMBITREVINDEXTABLE_128_TABLE_LENGTH;
Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable128;
Sint->pTwiddle = (float32_t *) twiddleCoef_128;
S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_256;
return ARM_MATH_SUCCESS;
@ -166,17 +166,17 @@ arm_status arm_rfft_256_fast_init_f32( arm_rfft_fast_instance_f32 * S ) {
arm_status arm_rfft_512_fast_init_f32( arm_rfft_fast_instance_f32 * S ) {
arm_cfft_instance_f32 * Sint;
arm_status status;
if( !S ) return ARM_MATH_ARGUMENT_ERROR;
Sint = &(S->Sint);
Sint->fftLen = 256U;
status=arm_cfft_init_f32(&(S->Sint),256);
if (status != ARM_MATH_SUCCESS)
{
return(status);
}
S->fftLenRFFT = 512U;
Sint->bitRevLength = ARMBITREVINDEXTABLE_256_TABLE_LENGTH;
Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable256;
Sint->pTwiddle = (float32_t *) twiddleCoef_256;
S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_512;
return ARM_MATH_SUCCESS;
@ -194,17 +194,17 @@ arm_status arm_rfft_512_fast_init_f32( arm_rfft_fast_instance_f32 * S ) {
arm_status arm_rfft_1024_fast_init_f32( arm_rfft_fast_instance_f32 * S ) {
arm_cfft_instance_f32 * Sint;
arm_status status;
if( !S ) return ARM_MATH_ARGUMENT_ERROR;
Sint = &(S->Sint);
Sint->fftLen = 512U;
status=arm_cfft_init_f32(&(S->Sint),512);
if (status != ARM_MATH_SUCCESS)
{
return(status);
}
S->fftLenRFFT = 1024U;
Sint->bitRevLength = ARMBITREVINDEXTABLE_512_TABLE_LENGTH;
Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable512;
Sint->pTwiddle = (float32_t *) twiddleCoef_512;
S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_1024;
return ARM_MATH_SUCCESS;
@ -221,17 +221,17 @@ arm_status arm_rfft_1024_fast_init_f32( arm_rfft_fast_instance_f32 * S ) {
*/
arm_status arm_rfft_2048_fast_init_f32( arm_rfft_fast_instance_f32 * S ) {
arm_cfft_instance_f32 * Sint;
arm_status status;
if( !S ) return ARM_MATH_ARGUMENT_ERROR;
Sint = &(S->Sint);
Sint->fftLen = 1024U;
status=arm_cfft_init_f32(&(S->Sint),1024);
if (status != ARM_MATH_SUCCESS)
{
return(status);
}
S->fftLenRFFT = 2048U;
Sint->bitRevLength = ARMBITREVINDEXTABLE_1024_TABLE_LENGTH;
Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable1024;
Sint->pTwiddle = (float32_t *) twiddleCoef_1024;
S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_2048;
return ARM_MATH_SUCCESS;
@ -249,17 +249,17 @@ arm_status arm_rfft_2048_fast_init_f32( arm_rfft_fast_instance_f32 * S ) {
arm_status arm_rfft_4096_fast_init_f32( arm_rfft_fast_instance_f32 * S ) {
arm_cfft_instance_f32 * Sint;
arm_status status;
if( !S ) return ARM_MATH_ARGUMENT_ERROR;
Sint = &(S->Sint);
Sint->fftLen = 2048U;
status=arm_cfft_init_f32(&(S->Sint),2048);
if (status != ARM_MATH_SUCCESS)
{
return(status);
}
S->fftLenRFFT = 4096U;
Sint->bitRevLength = ARMBITREVINDEXTABLE_2048_TABLE_LENGTH;
Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable2048;
Sint->pTwiddle = (float32_t *) twiddleCoef_2048;
S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_4096;
return ARM_MATH_SUCCESS;

@ -7,48 +7,84 @@ function(fft PROJECT)
if (CONFIGTABLE AND CFFT_F32_16)
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_TWIDDLECOEF_F32_16)
if (HELIUM OR MVEF)
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FXT_16)
else()
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FLT_16)
endif()
endif()
if (CONFIGTABLE AND CFFT_F32_32)
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_TWIDDLECOEF_F32_32)
if (HELIUM OR MVEF)
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FXT_32)
else()
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FLT_32)
endif()
endif()
if (CONFIGTABLE AND CFFT_F32_64)
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_TWIDDLECOEF_F32_64)
if (HELIUM OR MVEF)
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FXT_64)
else()
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FLT_64)
endif()
endif()
if (CONFIGTABLE AND CFFT_F32_128)
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_TWIDDLECOEF_F32_128)
if (HELIUM OR MVEF)
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FXT_128)
else()
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FLT_128)
endif()
endif()
if (CONFIGTABLE AND CFFT_F32_256)
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_TWIDDLECOEF_F32_256)
if (HELIUM OR MVEF)
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FXT_256)
else()
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FLT_256)
endif()
endif()
if (CONFIGTABLE AND CFFT_F32_512)
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_TWIDDLECOEF_F32_512)
if (HELIUM OR MVEF)
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FXT_512)
else()
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FLT_512)
endif()
endif()
if (CONFIGTABLE AND CFFT_F32_1024)
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_TWIDDLECOEF_F32_1024)
if (HELIUM OR MVEF)
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FXT_1024)
else()
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FLT_1024)
endif()
endif()
if (CONFIGTABLE AND CFFT_F32_2048)
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_TWIDDLECOEF_F32_2048)
if (HELIUM OR MVEF)
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FXT_2048)
else()
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FLT_2048)
endif()
endif()
if (CONFIGTABLE AND CFFT_F32_4096)
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_TWIDDLECOEF_F32_4096)
if (HELIUM OR MVEF)
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FXT_4096)
else()
target_compile_definitions(${PROJECT} PUBLIC ARM_TABLE_BITREVIDX_FLT_4096)
endif()
endif()
#######################################

@ -14,8 +14,10 @@ class TransformCF32:public Client::Suite
Client::RefPattern<float32_t> ref;
const arm_cfft_instance_f32 *instCfftF32;
arm_cfft_instance_f32 varInstCfftF32;
int ifft;
arm_status status;
};

@ -14,27 +14,28 @@
float32_t *outfftp = outputfft.ptr();
memcpy(outfftp,inp,sizeof(float32_t)*input.nbSamples());
ASSERT_TRUE(status == ARM_MATH_SUCCESS);
arm_cfft_f32(
this->instCfftF32,
&(this->varInstCfftF32),
outfftp,
this->ifft,
1);
ASSERT_SNR(outputfft,ref,(float32_t)SNR_THRESHOLD);
ASSERT_EMPTY_TAIL(outputfft);
}
}
void TransformCF32::setUp(Testing::testID_t id,std::vector<Testing::param_t>& paramsArgs,Client::PatternMgr *mgr)
{
switch(id)
{
case TransformCF32::TEST_CFFT_F32_1:
@ -42,7 +43,7 @@
input.reload(TransformCF32::INPUTS_CFFT_NOISY_16_F32_ID,mgr);
ref.reload( TransformCF32::REF_CFFT_NOISY_16_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len16;
status=arm_cfft_init_f32(&varInstCfftF32,16);
this->ifft=0;
@ -53,7 +54,7 @@
input.reload(TransformCF32::INPUTS_CIFFT_NOISY_16_F32_ID,mgr);
ref.reload( TransformCF32::INPUTS_CFFT_NOISY_16_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len16;
status=arm_cfft_init_f32(&varInstCfftF32,16);
this->ifft=1;
@ -64,7 +65,7 @@
input.reload(TransformCF32::INPUTS_CFFT_NOISY_32_F32_ID,mgr);
ref.reload( TransformCF32::REF_CFFT_NOISY_32_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len32;
status=arm_cfft_init_f32(&varInstCfftF32,32);
this->ifft=0;
@ -75,7 +76,7 @@
input.reload(TransformCF32::INPUTS_CIFFT_NOISY_32_F32_ID,mgr);
ref.reload( TransformCF32::INPUTS_CFFT_NOISY_32_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len32;
status=arm_cfft_init_f32(&varInstCfftF32,32);
this->ifft=1;
@ -86,7 +87,8 @@
input.reload(TransformCF32::INPUTS_CFFT_NOISY_64_F32_ID,mgr);
ref.reload( TransformCF32::REF_CFFT_NOISY_64_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len64;
status=arm_cfft_init_f32(&varInstCfftF32,64);
this->ifft=0;
@ -97,7 +99,8 @@
input.reload(TransformCF32::INPUTS_CIFFT_NOISY_64_F32_ID,mgr);
ref.reload( TransformCF32::INPUTS_CFFT_NOISY_64_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len64;
status=arm_cfft_init_f32(&varInstCfftF32,64);
this->ifft=1;
@ -108,7 +111,8 @@
input.reload(TransformCF32::INPUTS_CFFT_NOISY_128_F32_ID,mgr);
ref.reload( TransformCF32::REF_CFFT_NOISY_128_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len128;
status=arm_cfft_init_f32(&varInstCfftF32,128);
this->ifft=0;
@ -119,7 +123,8 @@
input.reload(TransformCF32::INPUTS_CIFFT_NOISY_128_F32_ID,mgr);
ref.reload( TransformCF32::INPUTS_CFFT_NOISY_128_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len128;
status=arm_cfft_init_f32(&varInstCfftF32,128);
this->ifft=1;
@ -130,7 +135,8 @@
input.reload(TransformCF32::INPUTS_CFFT_NOISY_256_F32_ID,mgr);
ref.reload( TransformCF32::REF_CFFT_NOISY_256_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len256;
status=arm_cfft_init_f32(&varInstCfftF32,256);
this->ifft=0;
@ -141,7 +147,8 @@
input.reload(TransformCF32::INPUTS_CIFFT_NOISY_256_F32_ID,mgr);
ref.reload( TransformCF32::INPUTS_CFFT_NOISY_256_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len256;
status=arm_cfft_init_f32(&varInstCfftF32,256);
this->ifft=1;
@ -152,7 +159,8 @@
input.reload(TransformCF32::INPUTS_CFFT_NOISY_512_F32_ID,mgr);
ref.reload( TransformCF32::REF_CFFT_NOISY_512_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len512;
status=arm_cfft_init_f32(&varInstCfftF32,512);
this->ifft=0;
@ -163,7 +171,8 @@
input.reload(TransformCF32::INPUTS_CIFFT_NOISY_512_F32_ID,mgr);
ref.reload( TransformCF32::INPUTS_CFFT_NOISY_512_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len512;
status=arm_cfft_init_f32(&varInstCfftF32,512);
this->ifft=1;
@ -174,7 +183,8 @@
input.reload(TransformCF32::INPUTS_CFFT_NOISY_1024_F32_ID,mgr);
ref.reload( TransformCF32::REF_CFFT_NOISY_1024_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len1024;
status=arm_cfft_init_f32(&varInstCfftF32,1024);
this->ifft=0;
@ -185,7 +195,8 @@
input.reload(TransformCF32::INPUTS_CIFFT_NOISY_1024_F32_ID,mgr);
ref.reload( TransformCF32::INPUTS_CFFT_NOISY_1024_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len1024;
status=arm_cfft_init_f32(&varInstCfftF32,1024);
this->ifft=1;
@ -196,7 +207,8 @@
input.reload(TransformCF32::INPUTS_CFFT_NOISY_2048_F32_ID,mgr);
ref.reload( TransformCF32::REF_CFFT_NOISY_2048_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len2048;
status=arm_cfft_init_f32(&varInstCfftF32,2048);
this->ifft=0;
@ -207,7 +219,8 @@
input.reload(TransformCF32::INPUTS_CIFFT_NOISY_2048_F32_ID,mgr);
ref.reload( TransformCF32::INPUTS_CFFT_NOISY_2048_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len2048;
status=arm_cfft_init_f32(&varInstCfftF32,2048);
this->ifft=1;
@ -218,7 +231,8 @@
input.reload(TransformCF32::INPUTS_CFFT_NOISY_4096_F32_ID,mgr);
ref.reload( TransformCF32::REF_CFFT_NOISY_4096_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len4096;
status=arm_cfft_init_f32(&varInstCfftF32,4096);
this->ifft=0;
@ -229,7 +243,8 @@
input.reload(TransformCF32::INPUTS_CIFFT_NOISY_4096_F32_ID,mgr);
ref.reload( TransformCF32::INPUTS_CFFT_NOISY_4096_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len4096;
status=arm_cfft_init_f32(&varInstCfftF32,4096);
this->ifft=1;
@ -242,7 +257,7 @@
input.reload(TransformCF32::INPUTS_CFFT_STEP_16_F32_ID,mgr);
ref.reload( TransformCF32::REF_CFFT_STEP_16_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len16;
status=arm_cfft_init_f32(&varInstCfftF32,16);
this->ifft=0;
@ -253,7 +268,8 @@
input.reload(TransformCF32::INPUTS_CIFFT_STEP_16_F32_ID,mgr);
ref.reload( TransformCF32::INPUTS_CFFT_STEP_16_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len16;
status=arm_cfft_init_f32(&varInstCfftF32,16);
this->ifft=1;
@ -264,7 +280,8 @@
input.reload(TransformCF32::INPUTS_CFFT_STEP_32_F32_ID,mgr);
ref.reload( TransformCF32::REF_CFFT_STEP_32_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len32;
status=arm_cfft_init_f32(&varInstCfftF32,32);
this->ifft=0;
@ -275,7 +292,8 @@
input.reload(TransformCF32::INPUTS_CIFFT_STEP_32_F32_ID,mgr);
ref.reload( TransformCF32::INPUTS_CFFT_STEP_32_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len32;
status=arm_cfft_init_f32(&varInstCfftF32,32);
this->ifft=1;
@ -286,7 +304,8 @@
input.reload(TransformCF32::INPUTS_CFFT_STEP_64_F32_ID,mgr);
ref.reload( TransformCF32::REF_CFFT_STEP_64_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len64;
status=arm_cfft_init_f32(&varInstCfftF32,64);
this->ifft=0;
@ -297,7 +316,8 @@
input.reload(TransformCF32::INPUTS_CIFFT_STEP_64_F32_ID,mgr);
ref.reload( TransformCF32::INPUTS_CFFT_STEP_64_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len64;
status=arm_cfft_init_f32(&varInstCfftF32,64);
this->ifft=1;
@ -308,7 +328,8 @@
input.reload(TransformCF32::INPUTS_CFFT_STEP_128_F32_ID,mgr);
ref.reload( TransformCF32::REF_CFFT_STEP_128_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len128;
status=arm_cfft_init_f32(&varInstCfftF32,128);
this->ifft=0;
@ -319,7 +340,8 @@
input.reload(TransformCF32::INPUTS_CIFFT_STEP_128_F32_ID,mgr);
ref.reload( TransformCF32::INPUTS_CFFT_STEP_128_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len128;
status=arm_cfft_init_f32(&varInstCfftF32,128);
this->ifft=1;
@ -330,7 +352,8 @@
input.reload(TransformCF32::INPUTS_CFFT_STEP_256_F32_ID,mgr);
ref.reload( TransformCF32::REF_CFFT_STEP_256_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len256;
status=arm_cfft_init_f32(&varInstCfftF32,256);
this->ifft=0;
@ -341,7 +364,8 @@
input.reload(TransformCF32::INPUTS_CIFFT_STEP_256_F32_ID,mgr);
ref.reload( TransformCF32::INPUTS_CFFT_STEP_256_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len256;
status=arm_cfft_init_f32(&varInstCfftF32,256);
this->ifft=1;
@ -352,7 +376,8 @@
input.reload(TransformCF32::INPUTS_CFFT_STEP_512_F32_ID,mgr);
ref.reload( TransformCF32::REF_CFFT_STEP_512_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len512;
status=arm_cfft_init_f32(&varInstCfftF32,512);
this->ifft=0;
@ -363,7 +388,8 @@
input.reload(TransformCF32::INPUTS_CIFFT_STEP_512_F32_ID,mgr);
ref.reload( TransformCF32::INPUTS_CFFT_STEP_512_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len512;
status=arm_cfft_init_f32(&varInstCfftF32,512);
this->ifft=1;
@ -374,7 +400,8 @@
input.reload(TransformCF32::INPUTS_CFFT_STEP_1024_F32_ID,mgr);
ref.reload( TransformCF32::REF_CFFT_STEP_1024_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len1024;
status=arm_cfft_init_f32(&varInstCfftF32,1024);
this->ifft=0;
@ -385,7 +412,8 @@
input.reload(TransformCF32::INPUTS_CIFFT_STEP_1024_F32_ID,mgr);
ref.reload( TransformCF32::INPUTS_CFFT_STEP_1024_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len1024;
status=arm_cfft_init_f32(&varInstCfftF32,1024);
this->ifft=1;
@ -396,7 +424,8 @@
input.reload(TransformCF32::INPUTS_CFFT_STEP_2048_F32_ID,mgr);
ref.reload( TransformCF32::REF_CFFT_STEP_2048_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len2048;
status=arm_cfft_init_f32(&varInstCfftF32,2048);
this->ifft=0;
@ -407,7 +436,8 @@
input.reload(TransformCF32::INPUTS_CIFFT_STEP_2048_F32_ID,mgr);
ref.reload( TransformCF32::INPUTS_CFFT_STEP_2048_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len2048;
status=arm_cfft_init_f32(&varInstCfftF32,2048);
this->ifft=1;
@ -418,7 +448,8 @@
input.reload(TransformCF32::INPUTS_CFFT_STEP_4096_F32_ID,mgr);
ref.reload( TransformCF32::REF_CFFT_STEP_4096_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len4096;
status=arm_cfft_init_f32(&varInstCfftF32,4096);
this->ifft=0;
@ -429,13 +460,15 @@
input.reload(TransformCF32::INPUTS_CIFFT_STEP_4096_F32_ID,mgr);
ref.reload( TransformCF32::INPUTS_CFFT_STEP_4096_F32_ID,mgr);
instCfftF32 = &arm_cfft_sR_f32_len4096;
status=arm_cfft_init_f32(&varInstCfftF32,4096);
this->ifft=1;
break;
}
outputfft.create(ref.nbSamples(),TransformCF32::OUTPUT_CFFT_F32_ID,mgr);

@ -2564,6 +2564,7 @@ group Root {
cifft_step_1024_f32:test_cfft_f32
cifft_step_2048_f32:test_cfft_f32
cifft_step_4096_f32:test_cfft_f32
}
}

Loading…
Cancel
Save