# fft320 **Repository Path**: WeiKangZhao/fft320 ## Basic Information - **Project Name**: fft320 - **Description**: 固定点数(320点)的高速fft,包含浮点和定点 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-10-21 - **Last Updated**: 2025-03-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 固定点数fft说明 提供两种点数(160,320),两种方式(浮点和定点)的fft和ifft函数 特点:由于点数固定, 因此不需要初始化申请句柄, 所有的需要反复使用的固定参数都以const的形式存放在常量区, 160点和320点的fft/ifft可以共用旋转因子和索引. 旋转因子和索引的计算可以在编译期完成, 效率更高. # 命名规则 - `fft/ifft`: 分别代表快速傅里叶变化和快速傅里叶逆变换; - `320/160`: 分别代表fft和ifft的点数, 只支持320点和160点; - `float/fix`: 代表实现方法, 浮点方案和定点方案; - `r/i`: 下标的r和i代表实部(real),虚部(imag) - `in/out`: 代表输入和输出, 需要将输入的数据存放在in代表的指针下, 为输出准备好指针, 算法输出会输出在out指针下. # 用法 暴露给用户的有8个函数: 其中在`fft_float.h`中声明的有下面四个: - `void fft320_float(float* in, float* out_r, float* out_i)`: 浮点320点实信号fft, 输入320点float数组的首地址, 输出两个分别表示fft输出的实部和虚部的161点float数组(实信号的fft共轭对称,因此另外一半不需要存储); - `void ifft320_float(float* in_r, float* in_i, float* out)`: 浮点320点实ifft, 输入两个161点float数组首地址,分别代表共轭对称的频域数据的左半边(同样是因为共轭对称的原因,不需要提供对称的另一半),输出是320点的float型实信号; - `fft160_float(float* in, float* out_r, float* out_i)`: 浮点160点是实信号fft, 输入表示信号的160float数组首地址, 输出两个81点实部和虚部float数组; - `ifft160_float(float* in_r, float* in_i, float* out)`: 浮点160点实ifft, 输入两个81点float数组首地址, 输出160点实信号; `fft_fix.h`中声明的有下面四个: - `void fft320_fix(short* in, int* out_r, int* out_i)`: fft320_float的定点版本, 注意输入的是short数, 如果需要改成int型,可以在fft320layer1中更改输入的类型, 此举是为了防止用户输入q值过大的定点数, 导致溢出. 假设输入的数据是qx, 输出的int型数据是q(x+11), 其中x不建议大于15.也就说假设输入q15,输出是q26. - `void ifft320_fix(int* in_r, int* in_i, int* out)`: ifft320_float的定点版本, 输入的q值和输出一致, 同样的不建议超过15 - `void fft160_fix(int* in, int* out_r, int* out_i)`: 160点fft定点版本, 定点化方案同`fft320_fix`; - `void ifft160_fix(int* in_r, int* in_i, int* out)`: 160点ifft定点版本, 定点化方案同`ifft320_fix` 具体用法参考demo.c中的用例 # 算法原理 fft使用的是时域抽取, ifft使用的是频域抽取, 这样的好处是可以共用一组