使用 FFT 函数 - 2021.2 Chinese

Vitis 高层次综合用户指南 (UG1399)

Document ID
UG1399
Release Date
2021-12-15
Version
2021.2 Chinese

FFT 函数在 HLS 名称空间内定义,可按如下方式调用:

hls::fft<STATIC_PARAM> (
INPUT_DATA_ARRAY,
OUTPUT_DATA_ARRAY, 
OUTPUT_STATUS, 
INPUT_RUN_TIME_CONFIGURATION);

STATIC_PARAM 属于静态参数化结构体,用于为 FFT 定义静态参数。

输入数据和输出数据都作为阵列(INPUT_DATA_ARRAYOUTPUT_DATA_ARRAY)提供给函数。在最终实现中,FFT RTL 块上的端口将作为 AXI4-Stream 端口来实现。赛灵思建议始终在使用数据流最优化 (set_directive_dataflow) 的区域内使用 FFT 函数,因为这样可确保阵列作为串流阵列来实现。另一种方法是使用 set_directive_stream 命令将这两个阵列都指定为串流阵列。

重要: FFT 无法在经流水打拍的区域内使用。如需高性能运算,请在使用 FFT 前后分别对循环或函数进行流水打拍,然后对区域内的所有循环和函数使用数据流最优化。

阵列的数据类型可采用 float 或 ap_fixed。

typedef float data_t;
complex<data_t> xn[FFT_LENGTH];
complex<data_t> xk[FFT_LENGTH];

要使用定点数据类型,应使用 Vitis HLS 任意精度类型 ap_fixed。

#include "ap_fixed.h"
typedef ap_fixed<FFT_INPUT_WIDTH,1> data_in_t;
typedef ap_fixed<FFT_OUTPUT_WIDTH,FFT_OUTPUT_WIDTH-FFT_INPUT_WIDTH+1> data_out_t;
#include <complex>
typedef hls::x_complex<data_in_t> cmpxData;
typedef hls::x_complex<data_out_t> cmpxDataOut;

使用这 2 种类型时,都应使用相同且正确的数据大小来将 FFT 参数化。对于浮点数据,数据宽度始终为 32 位,指定任何其它大小都将被视为无效。

重要: FFT 的输入和输出宽度可配置为受支持范围内的任意值。连接到输入参数和输出参数的变量必须按 8 位增量来定义。例如,如果输出宽度配置为 32 位,那么输出变量必须定义为 40 位变量。

可通过针对输入数据和输出数据使用 2 维阵列来使用 FFT 的多通道功能。在此情况下,阵列数据的配置方法应为第 1 个维度表示每个通道,且第 2 个维度表示 FFT 数据。

typedef float data_t;
static complex<data_t> xn[CHANNEL][FFT_LENGTH];
static complex<data_t> xk[CHANELL][FFT_LENGTH];

FFT 核使用并生成数据作为交织式通道(例如,ch0-data0、ch1-data0、ch2-data0 等,ch0-data1、ch1-data1、ch2-data2 等,以此类推)。因此,要按读取或写入数据的顺序来对 FFT 的输入或输出阵列进行串流,必须首先迭代通道索引,为多个通道填满或清空 2 维阵列,如下示例所示:

cmpxData   in_fft[FFT_CHANNELS][FFT_LENGTH];
cmpxData  out_fft[FFT_CHANNELS][FFT_LENGTH];
 
// Write to FFT Input Array
for (unsigned i = 0; i < FFT_LENGTH; i++) {
 for (unsigned j = 0; j < FFT_CHANNELS; ++j) {
 in_fft[j][i] = in.read().data;
 }
}
   
// Read from FFT Output Array
for (unsigned i = 0; i < FFT_LENGTH; i++) {
 for (unsigned j = 0; j < FFT_CHANNELS; ++j) {
 out.data = out_fft[j][i];
 
 }
}

Vitis HLS 示例中提供了使用 FFT C 语言库的设计示例,可使用以下菜单选项来访问这些示例:Help > Welcome > Open Example Project > Design Examples > FFT