Skip to content

Latest commit

 

History

History
executable file
·
538 lines (370 loc) · 14.3 KB

K230_FFT_API参考.md

File metadata and controls

executable file
·
538 lines (370 loc) · 14.3 KB

K230 FFT API参考

cover

版权所有©2023北京嘉楠捷思信息技术有限公司

免责声明

您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)及其关联公司的商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的正确性、可靠性、完整性、适销性、符合特定目的和不侵权提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导参考。

由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。

商标声明

logo、“嘉楠”和其他嘉楠商标均为北京嘉楠捷思信息技术有限公司及其关联公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。

版权所有 © 2023北京嘉楠捷思信息技术有限公司。保留一切权利。 非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。

目录

[TOC]

前言

概述

本文档主要介绍 K230 FFT的api,内容主要包括 api使用及测试程序介绍。

读者对象

本文档(本指南)主要适用于以下人员:

  • 技术支持工程师
  • 软件开发工程师

缩略词定义

简称 说明
FFT Fast Fourier Transform,离散傅里叶变换快速算法
IFFT Inverse fast Fourier transform,快速傅里叶逆变换

修订记录

文档版本号 修改说明 修改者 日期
V1.0 初版 王建新 2023-08-08

1. k230 fft介绍

K230 的FFT模块主要用于硬件加速FFT、IFFT的计算,其特性如下:

支持64、128、256、512、1024、2048、4096点fft、ifft计算。 支持int16计算精度,即输入输出的实部、虚部均为int16格式。 支持标准的axi4 slave接口,参数配置与数据搬移均使用该接口。 输入支持RIRI....、RRRR....(纯实部)、RRRR...IIII...格式排列,输出支持RIRI....、RRRR...IIII...格式排列。 采用基2-时间抽取的计算方式,内部只有一个蝶形算子。 采用单时钟域设计,总线时钟同时做为运算时钟,以节省跨时钟域的开销。 4096点fft/ifft的计算时长控制在1ms以内,包括数据搬移、计算、中断交互的总开销。 支持中断mask、原始中断查询。

2. API 参考

k230 FFT模块主要提供了以下 API:

2.1 kd_mpi_fft_or_ifft

【描述】

fft或ifft计算核心函数。

【语法】

int kd_mpi_fft_or_ifft(k_fft_args_st * fft_args);  

【参数】

参数名称 描述 输入/输出
fft_args fft参数 k_fft_args_st 输入/输出

【返回值】

返回值 描述
0 成功。
非 0 失败

【芯片差异】

【需求】

  • 头文件:mpi_fft_api.h
  • 库文件:libfft.a

【注意】

【举例】

int kd_mpi_fft(int point , k_fft_input_mode_e im,  k_fft_out_mode_e om,
                k_u32 timeout , k_u16 shift ,
                short *rx_in, short *iy_in, short *rx_out, short *iy_out)
{
    int ret = 0 ;
    k_fft_args_st fft_args;   
    ret = kd_mpi_fft_args_init(point, FFT_MODE , im, om, \
                 timeout,  shift,   rx_in, iy_in , &fft_args); ERET(ret);
    ret = kd_mpi_fft_or_ifft(&fft_args); ERET(ret);
    ret = kd_mpi_fft_args_2_array(&fft_args, rx_out, iy_out);ERET(ret);
    return 0;
}

【相关主题】

2.2 kd_mpi_fft_args_init

【描述】

fft_args初始化(辅助函数)

【语法】

int kd_mpi_fft_args_init( int point,  k_fft_mode_e mode,  k_fft_input_mode_e im, 
                          k_fft_out_mode_e om,    k_u32 timeout ,    k_u16 shift,
                          short *real, short *imag, k_fft_args_st *fft_args );

【参数】

参数名称 描述 输入/输出
point 点数,有效值为64、128、256、512、1024、2048、4096 输入
mode k_fft_mode_e FFT_MODE IFFT_MODE 输入
im k_fft_input_mode_e 输入模式 输入
om k_fft_out_mode_e 输出模式 输入
time_out 超时时间 输入
shift 偏移 输入
rx_input 输入实数数据 输入
iy_input 输入虚数数据 输入
fft_args k_fft_args_st 要填充的变量 输出

【返回值】

返回值 描述
0 成功。
非 0 失败

【芯片差异】

【需求】

  • 头文件:mpi_fft_api.h
  • 库文件:libfft.a

【注意】

【举例】

int kd_mpi_fft(int point , k_fft_input_mode_e im,  k_fft_out_mode_e om,
                k_u32 timeout , k_u16 shift ,
                short *rx_in, short *iy_in, short *rx_out, short *iy_out)
{
    int ret = 0 ;
    k_fft_args_st fft_args;   
    ret = kd_mpi_fft_args_init(point, FFT_MODE , im, om, \
                 timeout,  shift,   rx_in, iy_in , &fft_args); ERET(ret);
    ret = kd_mpi_fft_or_ifft(&fft_args); ERET(ret);
    ret = kd_mpi_fft_args_2_array(&fft_args, rx_out, iy_out);ERET(ret);
    return 0;
}

【相关主题】

2.3 kd_mpi_fft_args_2_array

【描述】

把fft输出转换成数组(辅助函数,方便打印)。

【语法】

int kd_mpi_fft_args_2_array(k_fft_args_st * fft_args, short *rx, short *iy);    

【参数】

参数名称 描述 输入/输出
fft_args k_fft_args_st 结构体 输入
rx_out 实数数据 输出
iy_out 虚数数据 输出

【返回值】

返回值 描述
0 成功。
非 0 失败

【芯片差异】

【需求】

  • 头文件:mpi_fft_api.h
  • 库文件:libfft.a

【注意】

【举例】

int kd_mpi_fft(int point , fft_input_mode_e im,  fft_out_mode_e om,
                k_u32 timeout , k_u16 shift ,          k_u16 dma_ch,
                short *rx_in, short *iy_in, short *rx_out, short *iy_out)
{
    int ret = 0 ;
    fft_args_st fft_args;   
    ret = kd_mpi_fft_args_init(point, FFT_MODE , im, om, \
                 timeout,  shift, dma_ch,  rx_in, iy_in , &fft_args); ERET(ret);
    ret = kd_mpi_fft_or_ifft(&fft_args); ERET(ret);
    ret = kd_mpi_fft_args_2_array(&fft_args, rx_out, iy_out);ERET(ret);
    return 0;
}

【相关主题】

2.4 kd_mpi_fft

【描述】

fft计算,

核心是kd_mpi_fft_args_init, kd_mpi_fft_or_ifft, kd_mpi_fft_args_2_arra三个函数封装到一起,方便使用。

【语法】

int kd_mpi_fft(int point , k_fft_input_mode_e im,  k_fft_out_mode_e om,
                k_u32 timeout , k_u16 shift ,         
                short *rx_in, short *iy_in, short *rx_out, short *iy_out);

【参数】

参数名称 描述 输入/输出
point_num 点数,有效值为64、128、256、512、1024、2048、4096 输入
im fft_input_mode_e 输入模式 输入
om fft_out_mode_e 输出模式 输入
time_out 超时时间 输入
shift 偏移 输入
rx_input 输入实数数据 输入
iy_input 输入虚数数据 输入
rx_out 计算结果实数数据 输出
iy_out 计算结果虚数数据 输出

【返回值】

返回值 描述
0 成功。
非 0 失败

【芯片差异】

【需求】

  • 头文件:mpi_fft_api.h
  • 库文件:libfft.a

【注意】

【举例】

static int fft_test(int point)
{

    test_build_fft_org_data(point, i_real, i_imag);    

    //soft_fft_ifft_calc(point);
    clock_gettime(CLOCK_MONOTONIC, &begain_time);
    kd_mpi_fft(point,   RIRI,RR_II_OUT, 0, 0x555,  i_real, i_imag, o_h_real, o_h_imag);
    clock_gettime(CLOCK_MONOTONIC, &fft_end);
    kd_mpi_ifft(point,  RIRI,RR_II_OUT, 0, 0xaaa,  o_h_real, o_h_imag, o_h_ifft_real, o_h_ifft_imag);
    clock_gettime(CLOCK_MONOTONIC, &ifft_end);
    display_calc_result(point);

    return 0;
}

【相关主题】

2.5 kd_mpi_ifft

【描述】

ifft计算

核心是kd_mpi_fft_args_init, kd_mpi_fft_or_ifft, kd_mpi_fft_args_2_arra三个函数封装到一起,方便使用。

【语法】

int kd_mpi_ifft(int point , k_fft_input_mode_e im,  k_fft_out_mode_e om,
                k_u32 timeout , k_u16 shift ,         
                short *rx_in, short *iy_in, short *rx_out, short *iy_out);    

【参数】

参数名称 描述 输入/输出
point_num 点数,有效值为64、128、256、512、1024、2048、4096 输入
im fft_input_mode_e 输入模式 输入
om fft_out_mode_e 输出模式 输入
time_out 超时时间 输入
shift 偏移 输入
dma_ch dma通道 0-3有效;其他值非法 输入
rx_input 输入实数数据 输入
iy_input 输入虚数数据 输入
rx_out 计算结果实数数据 输出
iy_out 计算结果虚数数据 输出

【返回值】

返回值 描述
0 成功。
非 0 失败

【芯片差异】

【需求】

  • 头文件:mpi_fft_api.h
  • 库文件:libfft.a

【注意】

【举例】

static int fft_test(int point)
{

    test_build_fft_org_data(point, i_real, i_imag);

    //soft_fft_ifft_calc(point);
    clock_gettime(CLOCK_MONOTONIC, &begain_time);
    kd_mpi_fft(point,   RIRI,RR_II_OUT, 0, 0x555,  i_real, i_imag, o_h_real, o_h_imag);
    clock_gettime(CLOCK_MONOTONIC, &fft_end);
    kd_mpi_ifft(point,  RIRI,RR_II_OUT, 0, 0xaaa,  o_h_real, o_h_imag, o_h_ifft_real, o_h_ifft_imag);
    clock_gettime(CLOCK_MONOTONIC, &ifft_end);
    display_calc_result(point);

    return 0;
}

【相关主题】

3.数据结构

该功能模块的相关数据类型定义如下:

3.1 k_fft_args_st

【说明】fft ioctl 参数

【定义】

typedef union
{
    struct {
        volatile fft_point_e point:3; //2:0  0:64;1:128;2:256;3:512;4:1024;5:2048;6:4096
        volatile k_fft_mode_e mode:1;  //3 0:fft 1:ifft
        volatile k_fft_input_mode_e im:2; //5:4 0:RIRI....;1:RRRR....(纯实部);2:RRRR...IIII..
        volatile k_fft_out_mode_e om:1; //6 0:RIRI....;1:RRRR...IIII...
        volatile k_u64 fft_intr_mask : 1;//7 0:not mask intr; 1:mask intr
        volatile k_u16 shift:12; //19:8  [11]第12级右移使能.....[0]第一级右移使能
        volatile k_u32 fft_disable_cg : 1;//20 clock gating disable使能信号,write 1 disable fft clock gating
        volatile k_u32 reserv : 11 ;//31:21
        volatile k_u32 time_out:32;//63:32 表示fft使能后FFT模块计算超时的门限;该值写0表示不存在FFT超时上报中断功能
    }__attribute__ ((packed));
    volatile k_u64 cfg_value;
} __attribute__ ((packed)) k_fft_cfg_reg_st;


typedef struct {
    k_fft_cfg_reg_st reg;
    k_char rsv[4];
    k_u64 data[FFT_MAX_POINT*4/8]; // input and output;
}k_fft_args_st;

【成员】

成员名称 描述
reg fft的配置寄存器值
data fft的输入输出数据

【注意事项】

3.2 k_fft_mode_e

【说明】fft ioctl 参数

【定义】

typedef enum  {
    FFT_MODE = 0,
    IFFT_MODE,
}k_fft_mode_e;

【成员】

成员名称 描述
FFT_MODE fft
IFFT_MODE ifft

【注意事项】

3.3 k_fft_input_mode_e

【说明】fft ioctl 参数

【定义】

typedef enum {
    RIRI = 0,
    RRRR,
    RR_II,
} k_fft_input_mode_e;

【成员】

成员名称 描述
RIRI RIRI格式数据
RRRR RRRR纯实部数据
RR_II RR_II格式数据

【注意事项】

3.4 k_fft_out_mode_e

【说明】fft ioctl 参数

【定义】

typedef enum {
    RIRI_OUT = 0,
    RR_II_OUT,
} k_fft_out_mode_e;

【成员】

成员名称 描述
RIRI_OUT RIRI格式数据
RR_II_OUT RR_II格式数据

【注意事项】