AI Engine API User Guide (AIE-API) 2024.1
|
The AIE API offers a stage-based interface for carrying out decimation-in-time FFTs.
For example, assuming twiddle pointer visibility, a 1024 point FFT can be computed as follows:
Similarly, a 512 point FFT can be implemented, using a mix of radix-2 and radix-4 stages, as follows:
tmp
, which could be of benefit for large FFTs.An R-Radix, N-point FFT requires R-1 twiddle tables per stage.
Each of the tables are of length (n_stage / R)
, where n_stage
is the local number of samples of the current radix stage. The local number of samples is given as the total point size, N, divided by the Vectorization, which is the template parameter of the fft_dit_r*_stage
function calls. This is due to the fact that earlier stages of an N-point FFT are smaller, batched FFTs.
For each stage, the twiddle tables can be computed, in floating point, as:
For fixed point implementations, the twiddle values should be multiplied multiplied by (1 << shift_tw)
before converting to the output type. For example,
The following python code may be used to generate the twiddle tables:
Typedefs | |
template<unsigned Vectorization, unsigned Radix, typename Input , typename Output = Input, typename Twiddle = detail::default_twiddle_type_t<Input, Output>> | |
using | aie::fft_dit = detail::fft_dit< Vectorization, detail::fft_get_stage< Vectorization, Radix, Input, Output, Twiddle >(), Radix, Input, Output, Twiddle > |
Type that encapsulates the functionality for decimation-in-time FFTs. | |
Functions | |
template<unsigned Vectorization, typename Input , typename Output , typename Twiddle > requires (arch::is(arch::AIE) && detail::is_floating_point_v<Input>) | |
void | aie::fft_dit_r2_stage (const Input *__restrict x, const Twiddle *__restrict tw, unsigned n, bool inv, Output *__restrict out) |
A function to perform a single floating point radix 2 FFT stage. | |
template<unsigned Vectorization, typename Input , typename Output , typename Twiddle > requires (arch::is(arch::AIE, arch::AIE_ML)) | |
void | aie::fft_dit_r2_stage (const Input *__restrict x, const Twiddle *__restrict tw, unsigned n, unsigned shift_tw, unsigned shift, bool inv, Output *__restrict out) |
A function to perform a single radix 2 FFT stage. | |
template<unsigned Vectorization, typename Input , typename Output , typename Twiddle > requires (arch::is(arch::AIE) && detail::is_floating_point_v<Input>) | |
void | aie::fft_dit_r3_stage (const Input *__restrict x, const Twiddle *__restrict tw0, const Twiddle *__restrict tw1, unsigned n, bool inv, Output *__restrict out) |
A function to perform a single floating point radix 3 FFT stage. | |
template<unsigned Vectorization, typename Input , typename Output , typename Twiddle > requires (arch::is(arch::AIE, arch::AIE_ML)) | |
void | aie::fft_dit_r3_stage (const Input *__restrict x, const Twiddle *__restrict tw0, const Twiddle *__restrict tw1, unsigned n, unsigned shift_tw, unsigned shift, bool inv, Output *__restrict out) |
A function to perform a single radix 3 FFT stage. | |
template<unsigned Vectorization, typename Input , typename Output , typename Twiddle > requires (arch::is(arch::AIE, arch::AIE_ML)) | |
void | aie::fft_dit_r4_stage (const Input *__restrict x, const Twiddle *__restrict tw0, const Twiddle *__restrict tw1, const Twiddle *__restrict tw2, unsigned n, unsigned shift_tw, unsigned shift, bool inv, Output *__restrict out) |
A function to perform a single radix 4 FFT stage. | |
template<unsigned Vectorization, typename Input , typename Output , typename Twiddle > requires (arch::is(arch::AIE) && detail::is_floating_point_v<Input>) | |
void | aie::fft_dit_r5_stage (const Input *__restrict x, const Twiddle *__restrict tw0, const Twiddle *__restrict tw1, const Twiddle *__restrict tw2, const Twiddle *__restrict tw3, unsigned n, bool inv, Output *__restrict out) |
A function to perform a single floating point radix 5 FFT stage. | |
template<unsigned Vectorization, typename Input , typename Output , typename Twiddle > requires (arch::is(arch::AIE, arch::AIE_ML)) | |
void | aie::fft_dit_r5_stage (const Input *__restrict x, const Twiddle *__restrict tw0, const Twiddle *__restrict tw1, const Twiddle *__restrict tw2, const Twiddle *__restrict tw3, unsigned n, unsigned shift_tw, unsigned shift, bool inv, Output *out) |
A function to perform a single radix 5 FFT stage. | |
Input Type | Output Type | Twiddle Type | AIE Supported Radices | AIE-ML Supported Radices |
---|---|---|---|---|
c16b | c16b | c16b | 2, 4 | 2, 4 |
c16b | c32b | c16b | 2, 3, 4, 5 | 2, 3, 4, 5 |
c32b | c16b | c16b | 2, 4, | 2, 4 |
c32b | c32b | c16b | 2, 3, 4, 5 | 2, 3, 4, 5 |
c32b | c16b | c32b | 2 | |
c32b | c32b | c32b | 2, 3, 4, 5 | |
cfloat | cfloat | cfloat | 2, 3, 5 |
using aie::fft_dit = typedef detail::fft_dit<Vectorization, detail::fft_get_stage<Vectorization, Radix, Input, Output, Twiddle>(), Radix, Input, Output, Twiddle> |
Type that encapsulates the functionality for decimation-in-time FFTs.
Vectorization | Vectorization of the FFT stage |
Radix | Number which selects the FFT radix. |
Input | Type of the input elements. |
Output | Type of the output elements, defaults to input type. |
Twiddle | Type of the twiddle elements, defaults to cint16 for integral types and cfloat for floating point. |
void aie::fft_dit_r2_stage | ( | const Input *__restrict | x, |
const Twiddle *__restrict | tw, | ||
unsigned | n, | ||
bool | inv, | ||
Output *__restrict | out | ||
) |
A function to perform a single floating point radix 2 FFT stage.
x | Input data pointer |
tw | Twiddle group pointer |
n | Number of samples |
inv | Run inverse FFT stage |
out | Output data pointer |
Vectorization | Vectorization of the FFT stage |
Input | Type of the input elements. |
Output | Type of the output elements, defaults to input type. |
Twiddle | Type of the twiddle elements, defaults to cint16 for integral types and cfloat for floating point. |
void aie::fft_dit_r2_stage | ( | const Input *__restrict | x, |
const Twiddle *__restrict | tw, | ||
unsigned | n, | ||
unsigned | shift_tw, | ||
unsigned | shift, | ||
bool | inv, | ||
Output *__restrict | out | ||
) |
A function to perform a single radix 2 FFT stage.
x | Input data pointer |
tw | Twiddle group pointer |
n | Number of samples |
shift_tw | Indicates the decimal point of the twiddles |
shift | Shift applied to apply to dit outputs |
inv | Run inverse FFT stage |
out | Output data pointer |
Vectorization | Vectorization of the FFT stage |
Input | Type of the input elements. |
Output | Type of the output elements, defaults to input type. |
Twiddle | Type of the twiddle elements, defaults to cint16 for integral types and cfloat for floating point. |
void aie::fft_dit_r3_stage | ( | const Input *__restrict | x, |
const Twiddle *__restrict | tw0, | ||
const Twiddle *__restrict | tw1, | ||
unsigned | n, | ||
bool | inv, | ||
Output *__restrict | out | ||
) |
A function to perform a single floating point radix 3 FFT stage.
Defining the rotation rate of a given twiddle to be w(tw)
, the relationship between the twiddle groups are
x | Input data pointer |
tw0 | First twiddle group pointer |
tw1 | Second twiddle group pointer |
n | Number of samples |
inv | Run inverse FFT stage |
out | Output data pointer |
Vectorization | Vectorization of the FFT stage |
Input | Type of the input elements. |
Output | Type of the output elements, defaults to input type. |
Twiddle | Type of the twiddle elements, defaults to cint16 for integral types and cfloat for floating point. |
void aie::fft_dit_r3_stage | ( | const Input *__restrict | x, |
const Twiddle *__restrict | tw0, | ||
const Twiddle *__restrict | tw1, | ||
unsigned | n, | ||
unsigned | shift_tw, | ||
unsigned | shift, | ||
bool | inv, | ||
Output *__restrict | out | ||
) |
A function to perform a single radix 3 FFT stage.
Defining the rotation rate of a given twiddle to be w(tw)
, the relationship between the twiddle groups are
x | Input data pointer |
tw0 | First twiddle group pointer |
tw1 | Second twiddle group pointer |
n | Number of samples |
shift_tw | Indicates the decimal point of the twiddles |
shift | Shift applied to apply to dit outputs |
inv | Run inverse FFT stage |
out | Output data pointer |
Vectorization | Vectorization of the FFT stage |
Input | Type of the input elements. |
Output | Type of the output elements, defaults to input type. |
Twiddle | Type of the twiddle elements, defaults to cint16 for integral types and cfloat for floating point. |
void aie::fft_dit_r4_stage | ( | const Input *__restrict | x, |
const Twiddle *__restrict | tw0, | ||
const Twiddle *__restrict | tw1, | ||
const Twiddle *__restrict | tw2, | ||
unsigned | n, | ||
unsigned | shift_tw, | ||
unsigned | shift, | ||
bool | inv, | ||
Output *__restrict | out | ||
) |
A function to perform a single radix 4 FFT stage.
Defining the rotation rate of a given twiddle to be w(tw)
, the relationship between the twiddle groups are
x | Input data pointer |
tw0 | First twiddle group pointer |
tw1 | Second twiddle group pointer |
tw2 | Third twiddle group pointer |
n | Number of samples |
shift_tw | Indicates the decimal point of the twiddles |
shift | Shift applied to apply to dit outputs |
inv | Run inverse FFT stage |
out | Output data pointer |
Vectorization | Vectorization of the FFT stage |
Input | Type of the input elements. |
Output | Type of the output elements, defaults to input type. |
Twiddle | Type of the twiddle elements, defaults to cint16 for integral types and cfloat for floating point. |
void aie::fft_dit_r5_stage | ( | const Input *__restrict | x, |
const Twiddle *__restrict | tw0, | ||
const Twiddle *__restrict | tw1, | ||
const Twiddle *__restrict | tw2, | ||
const Twiddle *__restrict | tw3, | ||
unsigned | n, | ||
bool | inv, | ||
Output *__restrict | out | ||
) |
A function to perform a single floating point radix 5 FFT stage.
Defining the rotation rate of a given twiddle to be w(tw)
, the relationship between the twiddle groups are
x | Input data pointer |
tw0 | First twiddle group pointer |
tw1 | Second twiddle group pointer |
tw2 | Third twiddle group pointer |
tw3 | Fourth twiddle group pointer |
n | Number of samples |
inv | Run inverse FFT stage |
out | Output data pointer |
Vectorization | Vectorization of the FFT stage |
Input | Type of the input elements. |
Output | Type of the output elements, defaults to input type. |
Twiddle | Type of the twiddle elements, defaults to cint16 for integral types and cfloat for floating point. |
void aie::fft_dit_r5_stage | ( | const Input *__restrict | x, |
const Twiddle *__restrict | tw0, | ||
const Twiddle *__restrict | tw1, | ||
const Twiddle *__restrict | tw2, | ||
const Twiddle *__restrict | tw3, | ||
unsigned | n, | ||
unsigned | shift_tw, | ||
unsigned | shift, | ||
bool | inv, | ||
Output * | out | ||
) |
A function to perform a single radix 5 FFT stage.
Defining the rotation rate of a given twiddle to be w(tw)
, the relationship between the twiddle groups are
x | Input data pointer |
tw0 | First twiddle group pointer |
tw1 | Second twiddle group pointer |
tw2 | Third twiddle group pointer |
tw3 | Fourth twiddle group pointer |
n | Number of samples |
shift_tw | Indicates the decimal point of the twiddles |
shift | Shift applied to apply to dit outputs |
inv | Run inverse FFT stage |
out | Output data pointer |
Vectorization | Vectorization of the FFT stage |
Input | Type of the input elements. |
Output | Type of the output elements, defaults to input type. |
Twiddle | Type of the twiddle elements, defaults to cint16 for integral types and cfloat for floating point. |