CSI-DSP  Version 1.0.0
CSI DSP Software Library
函数 | 变量
实数FFT函数

函数

void csky_rfft_fast_f32 (csky_rfft_fast_instance_f32 *S, float32_t *p, float32_t *pOut, uint8_t ifftFlag)
 浮点实数FFT处理函数 更多...
 
csky_status csky_rfft_fast_init_f32 (csky_rfft_fast_instance_f32 *S, uint16_t fftLen)
 浮点实数FFT初始化函数 更多...
 
csky_status csky_rfft_init_q15 (csky_rfft_instance_q15 *S, uint32_t fftLenReal, uint32_t ifftFlagR, uint32_t bitReverseFlag)
 Q15 RFFT/RIFFT 的初始化函数. 更多...
 
csky_status csky_rfft_init_q31 (csky_rfft_instance_q31 *S, uint32_t fftLenReal, uint32_t ifftFlagR, uint32_t bitReverseFlag)
 Q31 RFFT/RIFFT 初始化函数. 更多...
 
void csky_rfft_q15 (const csky_rfft_instance_q15 *S, q15_t *pSrc, q15_t *pDst)
 Q15 RFFT/RIFFT 的处理函数 更多...
 
void csky_rfft_q31 (const csky_rfft_instance_q31 *S, q31_t *pSrc, q31_t *pDst)
 Q31 RFFT/RIFFT 处理函数. 更多...
 

变量

static const q15_t ALIGN4 realCoefAQ15 [8192]
 
static const q15_t ALIGN4 realCoefBQ15 [8192]
 
static const q31_t realCoefAQ31 [8192]
 
static const q31_t realCoefBQ31 [8192]
 

简要说明

CSI DSP库为计算实数数据序列的FFT实现了特别的算法。 FFT的定义包括了复数数据,但是很多应用的输入只是实数。 实数FFT算法有对称性的优点,相同长度下比复数算法有速度优势。
快速 RFFT 算法继承自混合基的CFFT,但是减少了计算量。
长度为N的正向实数FFT序列计算使用的步骤如下:
RFFT.gif
实数快速傅里叶变换
实数序列初始化的时候,跟CFFT的复数处理一样. 之后,一个处理步骤重新整理数据,获取复数频谱的一半。 除了第一个复数值包括了两个实数值 X[0] 和 X[N/2],其他所有的数据都是复数. 换句话说,第一个复数样本包装了两个实数值。
逆RFFT的输入应该保持和正向RFFT的结果相同的格式。 第一步处理步骤为逆CFFT预处理数据。
RIFFT.gif
实数逆向快速傅里叶变换
浮点,Q15和Q31的算法略有不同,我们依次描述各个算法。
浮点
主要的函数是 csky_rfft_fast_f32()csky_rfft_fast_init_f32().
一个N-点序列FFT在频域是偶对称的。 数据的第二半等于在频率上被翻转的第一半的共轭:
*X[0] - real data
*X[1] - complex data
*X[2] - complex data
*...
*X[fftLen/2-1] - complex data
*X[fftLen/2] - real data
*X[fftLen/2+1] - conjugate of X[fftLen/2-1]
*X[fftLen/2+2] - conjugate of X[fftLen/2-2]
*...
*X[fftLen-1] - conjugate of X[1]
  
这些数据,我们可以统一的表示FFT为
*N/2+1 samples:
*X[0] - real data
*X[1] - complex data
*X[2] - complex data
*...
*X[fftLen/2-1] - complex data
*X[fftLen/2] - real data
  
更近一步,第一个和最后一个样本是实数值,它们可以包装到一起。因此,我们可以将N-点实数序列表示为N/2复数值:
*X[0],X[N/2] - packed real data: X[0] + jX[N/2]
*X[1] - complex data
*X[2] - complex data
*...
*X[fftLen/2-1] - complex data
  
实数FFT函数将频域数据包装成这种方式。正向变换以这种方式输出数据,逆向变换期望接收的输入也是这种方式。函数总是根据需要处理位翻转,所有输入和输出总是正常顺序。函数支持 [32, 64, 128, ..., 4096] 长度的样本.
正向和逆向实数FFT函数应用标准FFT;正向变换不需要缩放,逆向变换缩放 1/fftLen 。
Q15 and Q31
实数算法相似的方式定义实数算法,并且应用了N/2复数变换。
复数变换内部使用缩放防止定点溢出,总共的缩放等于 1/(fftLen/2).
每个变换分别有单独的结构体实例,但是旋转因子和位翻转表可以复用。
每种数据类型都有相应的初始化函数。 初始化函数处理下列操作:
  • 设置内部结构体字段值.
  • 初始化选择因子表和位翻转表指针.
  • 初始化中间复数FFT数据结构.
是否使用初始化函数是可选的。 但是,如果使用初始化函数,结构体实例就不能放在常量数据段。 要讲结构体实例放在常量数据段,结构体实例就要如下手动初始化:
*csky_rfft_instance_q31 S = {fftLenReal, fftLenBy2, ifftFlagR, bitReverseFlagR, twidCoefRModifier, pTwiddleAReal, pTwiddleBReal, pCfft};
*csky_rfft_instance_q15 S = {fftLenReal, fftLenBy2, ifftFlagR, bitReverseFlagR, twidCoefRModifier, pTwiddleAReal, pTwiddleBReal, pCfft};
  
其中 fftLenReal 是实数变换的长度; fftLenBy2 是中间复数变换的长度. ifftFlagR 选择正向 (=0) 或逆向 (=1) 变换. bitReverseFlagR 选择输出位翻转 (=0) 或者输出正常顺序 (=1). twidCoefRModifier 旋转因子表的步幅调节。这个值基于FFT长度; pTwiddleAReal指向旋转系数A数组; pTwiddleBReal指向选择系数B数组; pCfft 指向CFFT结构体实例. CFFT结构体也必须被初始化 复数结构体实例初始化详细参考 csky_cfft_radix4_f32()

函数说明

void csky_rfft_fast_f32 ( csky_rfft_fast_instance_f32 S,
float32_t p,
float32_t pOut,
uint8_t  ifftFlag 
)
参数
[in]*S指向一个 csky_rfft_fast_instance_f32 结构体.
[in]*p指向输入缓存.
[in]*pOut指向输出缓存.
[in]ifftFlagRFFT 如果标志位是0, RIFFT 如果标志位是 1
返回
none.
csky_status csky_rfft_fast_init_f32 ( csky_rfft_fast_instance_f32 S,
uint16_t  fftLen 
)
参数
[in,out]*S指向一个 csky_rfft_fast_instance_f32 结构体.
[in]fftLen实数序列的长度.
返回
初始化成功,则返回 CSKY_MATH_SUCCESS ,如果 fftLen 是一个不支持的值,则返回CSKY_MATH_ARGUMENT_ERROR.
说明描述:
参数 fftLen 执行 RFFT/CIFFT 处理的长度. FFT支持的长度是 32, 64, 128, 256, 512, 1024, 2048, 4096.
这个函数也初始化旋转因子表的指针和位翻转表的指针。
csky_status csky_rfft_init_q15 ( csky_rfft_instance_q15 S,
uint32_t  fftLenReal,
uint32_t  ifftFlagR,
uint32_t  bitReverseFlag 
)
参数
[in,out]*S指向 Q15 RFFT/RIFFT 结构体实例.
[in]fftLenRealFFT的长度.
[in]ifftFlagR标志位选择正向 (ifftFlagR=0) 或者逆向 (ifftFlagR=1) 变换.
[in]bitReverseFlag标识位选择输出位翻转 (bitReverseFlag=1) 或者不翻转 (bitReverseFlag=0) .
返回
初始化成功,则函数返回 CSKY_MATH_SUCCESS ,如果 fftLenReal不是 支持的长度,则返回 CSKY_MATH_ARGUMENT_ERROR。
说明描述:
参数 fftLenReal 指定 RFFT/RIFFT 处理的长度. 支持的 FFT 长度有 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192.
参数 ifftFlagR 控制正向或者逆向计算. 设置(=1) ifftFlagR 计算 RIFFT, 否则计算 RFFT.
参数 bitReverseFlag 控制输出是正常顺序或者位翻转顺序。 设置(=1) bitReverseFlag ,输出是正常顺序,否则,输出是说字节翻转顺序。
函数也初始化旋转因子表。
csky_status csky_rfft_init_q31 ( csky_rfft_instance_q31 S,
uint32_t  fftLenReal,
uint32_t  ifftFlagR,
uint32_t  bitReverseFlag 
)
参数
[in,out]*S指向 Q31 RFFT/RIFFT 结构体实例.
[in]fftLenRealFFT的长度.
[in]ifftFlagR标志位选择正向 (ifftFlagR=0) 或者逆向 (ifftFlagR=1) 变换.
[in]bitReverseFlag标志位选择输出位翻转使能 (bitReverseFlag=1) 或者禁止 (bitReverseFlag=0)。
返回
初始化成功,则返回 CSKY_MATH_SUCCESS,如果fftLenReal的长度是不支持的值,则返回 CSKY_MATH_ARGUMENT_ERROR
说明描述:
参数 fftLenReal 执行 RFFT/RIFFT 处理的长度. 支持的 FFT 长度有 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192.
参数 ifftFlagR 控制计算正向或者逆向变换。 设置(=1) ifftFlagR 则计算 RIFFT, 否则计算 RFFT .
参数 bitReverseFlag 控制输出是正常顺序或者位翻转顺序。 设置(=1) bitReverseFlag 则输出是正常顺序,否则输出是位翻转顺序。
函数也初始化旋转因子表。
void csky_rfft_q15 ( const csky_rfft_instance_q15 S,
q15_t pSrc,
q15_t pDst 
)
参数
[in]*S指向 Q15 RFFT/RIFFT 结构体实例
[in]*pSrc指向输入缓存
[out]*pDst指向输出缓存
返回
none.
输入和输出格式:
每个步骤的内部输入缩小2,以防止CFFT/CIFFT处理中饱和。 因此,不同的RFFT大小的输出格式不同。 不同大小的RFFT输入和输出格式,下表罗列了RFFT和RIFFT的缩放位数:
RFFT大小 输入格式 输出格式 向上缩放的位数
32 1.15 5.11 4
64 1.15 6.10 5
128 1.15 7.9 6
256 1.15 8.8 7
512 1.15 9.7 8
1024 1.15 10.6 9
2048 1.15 11.5 10
4096 1.15 12.4 11
8192 1.15 13.3 12
RIFFT大小 输入格式 输出格式 向上缩放的位数
32 1.15 5.11 0
64 1.15 6.10 0
128 1.15 7.9 0
256 1.15 8.8 0
512 1.15 9.7 0
1024 1.15 10.6 0
2048 1.15 11.5 0
4096 1.15 12.4 0
8192 1.15 13.3 0
void csky_rfft_q31 ( const csky_rfft_instance_q31 S,
q31_t pSrc,
q31_t pDst 
)
参数
[in]*S指向 Q31 RFFT/RIFFT 结构体实例.
[in]*pSrc指向输入缓存.
[out]*pDst指向输出缓存.
返回
none.
输入和输出格式:
每个步骤的内部输入缩小2,以防止CFFT/CIFFT处理中饱和。 因此,不同的RFFT大小的输出格式不同。 不同大小的RFFT输入和输出格式,下表罗列了RFFT和RIFFT的缩放位数:
RFFT大小 输入格式 输出格式 向上缩放的位数
32 1.31 5.27 4
64 1.31 6.26 5
128 1.31 7.25 6
256 1.31 8.24 7
512 1.31 9.23 8
1024 1.31 10.22 9
2048 1.31 11.21 10
4096 1.31 12.20 11
8192 1.31 13.19 12
RIFFT大小 输入格式 输出格式 向上缩放的位数
32 1.31 5.27 0
64 1.31 6.26 0
128 1.31 7.25 0
256 1.31 8.24 0
512 1.31 9.23 0
1024 1.31 10.22 0
2048 1.31 11.21 0
4096 1.31 12.20 0
8192 1.31 13.19 0

变量说明

const q15_t ALIGN4 realCoefAQ15[8192]
static
Q15格式的定点 realCoefAQ15 数组:
n = 4096
for (i = 0; i < n; i++)
 {
   pATable[2 * i] = 0.5 * (1.0 - sin (2 * PI / (double) (2 * n) * (double) i));
   pATable[2 * i + 1] = 0.5 * (-1.0 * cos (2 * PI / (double) (2 * n) * (double) i));
 } 
转换为定点Q15格式 round(pATable[i] * pow(2, 15))
const q31_t realCoefAQ31[8192]
static
生成Q31定点格式 realCoefAQ31 数组:
n = 4096
for (i = 0; i < n; i++)
{
   pATable[2 * i] = 0.5 * (1.0 - sin (2 * PI / (double) (2 * n) * (double) i));
   pATable[2 * i + 1] = 0.5 * (-1.0 * cos (2 * PI / (double) (2 * n) * (double) i));
}
转换为定点 Q31 格式 round(pATable[i] * pow(2, 31))
const q15_t ALIGN4 realCoefBQ15[8192]
static
生成real_CoefB 数组:
n = 4096
for (i = 0; i < n; i++)
 {
   pBTable[2 * i] = 0.5 * (1.0 + sin (2 * PI / (double) (2 * n) * (double) i));
   pBTable[2 * i + 1] = 0.5 * (1.0 * cos (2 * PI / (double) (2 * n) * (double) i));
 } 
转换为定点 Q15 格式 round(pBTable[i] * pow(2, 15))
const q31_t realCoefBQ31[8192]
static
生成 realCoefBQ31 数组:
n = 4096
for (i = 0; i < n; i++)
{
   pBTable[2 * i] = 0.5 * (1.0 + sin (2 * PI / (double) (2 * n) * (double) i));
   pBTable[2 * i + 1] = 0.5 * (1.0 * cos (2 * PI / (double) (2 * n) * (double) i));
} 
转换为定点 Q31 格式 round(pBTable[i] * pow(2, 31))