[转]FFT倒序算法—雷德算法

转载文章,文字说明部分修改文字错误、补充一些文字以及在程序中加一些注释,原文网址:

http://www.xuebuyuan.com/2117668.html

程序部分是借鉴介绍FFT算法程序的文章《网上找的纯C实现的FFT,与matlab计算结果完全一样》,网址:

https://blog.csdn.net/cp1300/article/details/28850309

在实现FFT计算的时候,第一步要做的就是实现倒位序的实现,这里有一种算法,叫做雷德(Rader)算法。

自然序排列的二进制数,其下面一个数总比上面的数大1,而倒序二进制数的下面一个数是上面一个数在最高位加1并由高位向低位进位而得到的。 若已知某数的倒序数是J,求下一个倒序数,应先判断J的最高位是否为0,与k=N/2进行比较即可得到结果:

i)如果J<k,说明最高位为0,应把其变成1,即J+N/2,这样就得到倒序数了。

ii)如果J>=k,即J的最高位为1,将最高位化为0,即J-N/2;此时,需要再判断次高位(即与k=N/4进行比较),若为0,将其变位1(即J+N/4),即得到倒序数;如果次高位为1,将其化为0(即J-N/4),再判断下一位为0还是1,为0则变为1,得到倒序数;如果为1则变为0后继续判断下一位......直到判断到某位为0或者判断完全部的位数都为1才会结束判断。


若倒序数大于顺序数,进行换位,否则不变,防止重复交换,变回原数。


C代码如下:


/*----以int型数据为例,假设数据长度N为2的整数次幂*----/
void Rader(int *f, int N)
{
int i,j,t,k;
/*----按照倒位序重新排列原信号----*/
for(i=1,j=N/2;i<=N-2;i++)  // 第一个和最后一个数据是位置不变的,因此i=0和i=N-1不处理
{
if(i<j)  // 原始下标小于变换下标才交换
{
t=f[j];
f[j]=f[i];
f[i]=t;
}
k=N/2; // 用于比较最高位
while(k<=j)  // 位判断为1
{
j=j-k;  // 该位变为0
k=k/2;  // 用于比较下一高位
}
j=j+k;  // 判断为0的位变为1
}
}


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值