CSI-DSP
Version 1.0.0
CSI DSP Software Library
|
函数 | |
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] |
csky_rfft_fast_f32()
和 csky_rfft_fast_init_f32()
. *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] 长度的样本.
*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] | ifftFlag | RFFT 如果标志位是0, RIFFT 如果标志位是 1 |
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 | 实数序列的长度. |
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] | fftLenReal | FFT的长度. |
[in] | ifftFlagR | 标志位选择正向 (ifftFlagR=0) 或者逆向 (ifftFlagR=1) 变换. |
[in] | bitReverseFlag | 标识位选择输出位翻转 (bitReverseFlag=1) 或者不翻转 (bitReverseFlag=0) . |
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] | fftLenReal | FFT的长度. |
[in] | ifftFlagR | 标志位选择正向 (ifftFlagR=0) 或者逆向 (ifftFlagR=1) 变换. |
[in] | bitReverseFlag | 标志位选择输出位翻转使能 (bitReverseFlag=1) 或者禁止 (bitReverseFlag=0)。 |
fftLenReal
的长度是不支持的值,则返回 CSKY_MATH_ARGUMENT_ERRORfftLenReal
执行 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 | 指向输出缓存 |
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 | 指向输出缓存. |
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 |
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)); }
|
static |
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)); }
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)); }
|
static |
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)); }