armBitRevIndexTable1024 是一个用于 ARM 架构下 1024 点数据位反转寻址的索引表,这类表通常用在 FFT(快速傅里叶变换)等需要位反转操作的算法中。
- 什么是位反转索引表
在 FFT 算法中,输入数据需要按照 "位反转顺序" 重新排列(也叫倒位序),而 armBitRevIndexTable1024 就是 ARM 官方 CMSIS-DSP 库中预定义的、长度为 1024 的位反转索引表,它直接给出了每个原始索引对应的位反转后索引值,避免了实时计算位反转的开销,提升算法效率。 - 1024 点位反转索引表的核心实现
以下是基于 ARM CMSIS-DSP 标准的 armBitRevIndexTable1024 完整实现(可直接用于 ARM Cortex-M 系列芯片):
c
/**
* @brief ARM 1024点位反转索引表(10位地址位反转)
* @note 适用于1024点FFT/IFFT的倒位序操作,索引范围0~1023
*/
const uint16_t armBitRevIndexTable1024[] = {
0x0000, 0x0200, 0x0100, 0x0300, 0x0080, 0x0280, 0x0180, 0x0380,
0x0040, 0x0240, 0x0140, 0x0340, 0x00C0, 0x02C0, 0x01C0, 0x03C0,
0x0020, 0x0220, 0x0120, 0x0320, 0x00A0, 0x02A0, 0x01A0, 0x03A0,
0x0060, 0x0260, 0x0160, 0x0360, 0x00E0, 0x02E0, 0x01E0, 0x03E0,
0x0010, 0x0210, 0x0110, 0x0310, 0x0090, 0x0290, 0x0190, 0x0390,
0x0050, 0x0250, 0x0150, 0x0350, 0x00D0, 0x02D0, 0x01D0, 0x03D0,
0x0030, 0x0230, 0x0130, 0x0330, 0x00B0, 0x02B0, 0x01B0, 0x03B0,
0x0070, 0x0270, 0x0170, 0x0370, 0x00F0, 0x02F0, 0x01F0, 0x03F0,
// 以下省略中间992个索引值(完整表共1024项),可从CMSIS-DSP库获取完整版本
// 最后几项示例:
0x000F, 0x020F, 0x010F, 0x030F, 0x008F, 0x028F, 0x018F, 0x038F,
0x004F, 0x024F, 0x014F, 0x034F, 0x00CF, 0x02CF, 0x01CF, 0x03CF,
0x002F, 0x022F, 0x012F, 0x032F, 0x00AF, 0x02AF, 0x01AF, 0x03AF,
0x006F, 0x026F, 0x016F, 0x036F, 0x00EF, 0x02EF, 0x01EF, 0x03EF
};
/**
* @brief 利用位反转索引表实现1024点数据倒位序
* @param pSrc: 输入数据数组(长度1024)
* @param pDst: 输出倒位序后的数据数组(长度1024)
* @retval 无
*/
void arm_fft_1024_bit_reverse(float32_t *pSrc, float32_t *pDst)
{
uint32_t i;
// 遍历所有索引,按位反转表重新排列数据
for (i = 0; i < 1024; i++)
{
pDst[i] = pSrc[armBitRevIndexTable1024[i]];
}
}
- 关键说明
数值含义:表中每个元素是 10 位二进制数的位反转结果(1024=2^10)。例如:
索引0(二进制0000000000)的位反转值是0;
索引1(二进制0000000001)的位反转值是512(二进制1000000000);
索引2(二进制0000000010)的位反转值是256(二进制0100000000)。
获取完整表:上述代码仅展示部分值,完整的armBitRevIndexTable1024可从 ARM 官方 CMSIS-DSP 库(arm_common_tables.h)中获取,也可通过位反转算法动态生成:
c
// 动态生成1024点位反转索引表的函数
void generate_bitrev_table_1024(uint16_t *table)
{
uint32_t i, j, k;
for (i = 0; i < 1024; i++)
{
j = i;
k = 0;
// 10位位反转
for (uint8_t bit = 0; bit < 10; bit++)
{
k = (k << 1) | (j & 1);
j >>= 1;
}
table[i] = k;
}
}
使用场景:主要配合 ARM CMSIS-DSP 库的arm_cfft_1024_f32等 FFT 函数使用,用于预处理输入数据或后处理输出数据。
总结
armBitRevIndexTable1024是 ARM CMSIS-DSP 库中预定义的 1024 点 FFT 位反转索引表,核心作用是快速实现数据倒位序;
表中每个值对应原始索引的 10 位二进制位反转结果,避免实时计算位反转的性能损耗;
可直接使用库中预定义表,也可通过位反转算法动态生成,适用于 ARM Cortex-M 系列芯片的 FFT 算法优化。