[转]FFT倒序算法—雷德算法
轉(zhuǎn)載文章,文字說明部分修改文字錯誤、補(bǔ)充一些文字以及在程序中加一些注釋,原文網(wǎng)址:
http://www.xuebuyuan.com/2117668.html
程序部分是借鑒介紹FFT算法程序的文章《網(wǎng)上找的純C實(shí)現(xiàn)的FFT,與matlab計(jì)算結(jié)果完全一樣》,網(wǎng)址:
https://blog.csdn.net/cp1300/article/details/28850309
在實(shí)現(xiàn)FFT計(jì)算的時候,第一步要做的就是實(shí)現(xiàn)倒位序的實(shí)現(xiàn),這里有一種算法,叫做雷德(Rader)算法。
自然序排列的二進(jìn)制數(shù),其下面一個數(shù)總比上面的數(shù)大1,而倒序二進(jìn)制數(shù)的下面一個數(shù)是上面一個數(shù)在最高位加1并由高位向低位進(jìn)位而得到的。?若已知某數(shù)的倒序數(shù)是J,求下一個倒序數(shù),應(yīng)先判斷J的最高位是否為0,與k=N/2進(jìn)行比較即可得到結(jié)果:
i)如果J<k,說明最高位為0,應(yīng)把其變成1,即J+N/2,這樣就得到倒序數(shù)了。
ii)如果J>=k,即J的最高位為1,將最高位化為0,即J-N/2;此時,需要再判斷次高位(即與k=N/4進(jìn)行比較),若為0,將其變位1(即J+N/4),即得到倒序數(shù);如果次高位為1,將其化為0(即J-N/4),再判斷下一位為0還是1,為0則變?yōu)?,得到倒序數(shù);如果為1則變?yōu)?后繼續(xù)判斷下一位......直到判斷到某位為0或者判斷完全部的位數(shù)都為1才會結(jié)束判斷。
若倒序數(shù)大于順序數(shù),進(jìn)行換位,否則不變,防止重復(fù)交換,變回原數(shù)。
C代碼如下:
/*----以int型數(shù)據(jù)為例,假設(shè)數(shù)據(jù)長度N為2的整數(shù)次冪*----/
void Rader(int *f, int N)
{
int i,j,t,k;
/*----按照倒位序重新排列原信號----*/
for(i=1,j=N/2;i<=N-2;i++) ?// 第一個和最后一個數(shù)據(jù)是位置不變的,因此i=0和i=N-1不處理
{
if(i<j) ?// 原始下標(biāo)小于變換下標(biāo)才交換
{
t=f[j];
f[j]=f[i];
f[i]=t;
}
k=N/2; // 用于比較最高位
while(k<=j) ?// 位判斷為1
{
j=j-k; ?// 該位變?yōu)?
k=k/2; ?// 用于比較下一高位
}
j=j+k; ?// 判斷為0的位變?yōu)?
}
}
總結(jié)
以上是生活随笔為你收集整理的[转]FFT倒序算法—雷德算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nat Biotechnol | 杨弋团
- 下一篇: 很有用很有效的操作之批量操作一组图片