提供了 FFT 算法的 C 语言实现,只供用户在使用 RN8302 进行谐波分析时进行参考。
1、 数据的提取及处理
以 50HZ 为例,RN8302 一个周期提供 128 个点的瞬时值,所以采样频率为 6.4HZ。
2、 倒位序算法
倒位序:就是将数字的各个尾反过来排序后得到的数字后的顺序,举个例子吧如我们的
输入 8 个信号,我们只需要三个位就可以描述着写信号的下标,比如 1 = 001B, 2 =
010B 等等,那么 1 的倒位后为 100B = 4, 010B = 2,依此类推,这就是倒位序,最后
生成的新的顺序就是排序后的结果,这个结果有一个特点,那就是把偶数和奇数分开,
这也就是 FFT 的理论基础。注:但是这个排序需要收到输入信号总量的限制,比如我们
输入 8 个信号,虽然在计算机里我们的取值范围为 00000000B ~ 00000111B 但是倒位序
的却只针对最后三位,即只在最后三位的范围内倒位排序,如上面 1 的倒位序是 100B
而不是 10000000B,这点请非常注意!
在此介绍两种实现方法:
1、 由于 C 的位操作能力强,可提取出 b6,b5,b4,b3,b2,b1,b0,在重新组合成
b0,b1,b2,b3,b4,b5,b6,即是倒位序的位置。
2、 假设为 128 点的数据的倒序,我们可以将倒序后的位置以表格方式列出,直接查找
倒序后的下标,减少 FFT 的运算时间。
3、 蝶形运算
因进行分析的数据只有实数,我们需将虚数数组全部赋值为 0,下图为蝶形图
蝶形公式:
X(K) = X’(K) + X’(K+B)W PN ,
X(K+B) = X’(K) - X’(K+B) W PN
其中 W PN= cos(2πP/N)- jsin(2πP/N)。
设 X(K+B) = XR(K+B) + jXI(K+B),
X(K) = XR(K) + jXI(K) ,
有:
XR(K)+jXI(K)= XR’(K)+jXI’(K)+[ XR’(K+B) + jXI’(K+B)]*[ cos(2πP/N)-jsin
(2πP/N)];
继续分解得到下列两式:
XR(K)= XR’(K)+ XR’(K+B) cos(2πP/N)+ XI’(K+B) sin (2πP/N) (1)
评论1