Fast Fourier Transform 2D

二维快速傅里叶变换(Fast Fourier Transform 2D,以下简称FFT2D)是基于快速傅里叶变换(以下简称FFT)开发的,对二维数据进行时域到频域转换的快速算法。 该算法可以将二维数据从时域转换到频域,为频域上的信号处理提供基础支持,通常用来作为图像等二维数据进行频域分析的前置步骤。

算子效果

时域输入数据参数频域输出数据
imagenx = HB_FFT_POINT_SIZE_16
ny = HB_FFT_POINT_SIZE_32
image

原理

FFT2D是基于FFT算法开发的扩展方法,对二维数据分别从x方向和y方向执行FFT处理,实现时域数据到频域数据的映射。具体流程如下:

  1. 对二维数据中每一行进行FFT计算,其中nx为接口参数中设置的x轴FFT点数。
HPL5FFT2D_x
  1. 在步骤1的处理基础上,对二维数据中每一列进行FFT计算,其中ny为接口参数中设置的y轴FFT点数。
HPL5FFT2D_y
  1. 返回步骤2的计算结果。

API接口

int32_t hbFFT2D(hbUCPTaskHandle_t *taskHandle, hbHPLImaginaryData *dst,
                hbHPLImaginaryData const *src, hbFFT2DParam const *param);

详细接口信息请查看 hbFFT2D

使用方法

// Include the header
#include "hobot/hb_ucp.h"
#include "hobot/hpl/hb_hpl.h"
#include "hobot/hpl/hb_fft_2d.h"

// init, allocate memory for data
src_length = 1024 * 1024 * 5;
hbUCPMallocCached(&src_re_mem, src_length, 0);
hbUCPMallocCached(&src_im_mem, src_length, 0);
hbHPLImaginaryData src;
src.realDataVirAddr = src_re_mem.virAddr;
src.realDataPhyAddr = src_re_mem.phyAddr;
src.imDataVirAddr = src_im_mem.virAddr;
src.imDataPhyAddr = src_im_mem.phyAddr;
src.numDimensionSize = 2;
src.dataType = HB_HPL_DATA_TYPE_I16;
src.imFormat = HB_IM_FORMAT_SEPARATE;
src.dimensionSize[0] = 16 * 11;
src.dimensionSize[1] = 32 * 2;

hbUCPMallocCached(&dst_re_mem, src_length, 0);
hbUCPMallocCached(&dst_im_mem, src_length, 0);
hbHPLImaginaryData dst;
dst.realDataVirAddr = dst_re_mem.virAddr;
dst.realDataPhyAddr = dst_re_mem.phyAddr;
dst.imDataVirAddr = dst_im_mem.virAddr;
dst.imDataPhyAddr = dst_im_mem.phyAddr;
dst.numDimensionSize = 2;
dst.dataType = HB_HPL_DATA_TYPE_I16;
dst.imFormat = HB_IM_FORMAT_SEPARATE;
dst.dimensionSize[0] = 16 * 11;
dst.dimensionSize[1] = 32 * 2;

// init param
hbFFT2DParam param;
param.nx = HB_FFT_POINT_SIZE_16;
param.ny = HB_FFT_POINT_SIZE_32;

// init task handle and schedule param
hbUCPSchedParam sched_param;
HB_UCP_INITIALIZE_SCHED_PARAM(&sched_param);
sched_param.backend = HB_UCP_DSP_CORE_0;

// create task
hbFFT2D(&task_handle, &dst, &src, &param);

// submit task
hbUCPSubmitTask(task_handle, &sched_param);

// wait for task done 
hbUCPWaitTaskDone(task_handle, 0);

// release task handle
hbUCPReleaseTask(task_handle);

// release memory
hbUCPFree(&src_re_mem);
hbUCPFree(&src_im_mem);
hbUCPFree(&dst_re_mem);
hbUCPFree(&dst_im_mem);