FFT之數組逆序C語言實現

前言:FFT算法是DFT的快速算法實現,FFT算法中有一個關鍵步驟就是將原始序列逆序。比如對於個點的FFT變換,首先對序列號進行編碼。比如M=4階,共N=16個點,編碼爲0000,0001,0010,0011,……,1111。至於逆序的過程,就是將當前編碼從右向左書寫重新編碼,比如說,0001編碼後爲1000,對於1101編碼後爲1011,0011編碼後爲1100。逆序之後,需要把原來位置上序列號對應的值更換爲更改序列號後對應的值,比如說,原始序列第2個位置即序列號0001,對應的值爲50,第9個位置即序列號1000,對應的值爲100,更換後的序列第2個位置值爲100,第9個位置值爲50。以下我們要探討的程序,就是想要如何在C語言上實現上述過程。

具體代碼如下:

#include<stdio.h>
#include<stdlib.h>
int main()//
{
	int X1[16]={0,50,2,3,4,5,6,7,8,100,10,11,12,13,14,15};//存儲原始序列
	int FD[16];//存儲逆序後的序列
	int p;
	for (int j=0;j<16;j++)
	{
		p=0;
		for (int i=0;i<4;i++)
		{
			if (j&(1<<i))
				p+=1<<(4-i-1);
		}
		FD[j]=X1[p];
	}
	for (int j=0;j<16;j++)
		printf("%d\n",FD[j]);
}
下面具體分析一下這段代碼。0000的逆序還是本身,對於其它每一個原始序列號,由於本例中爲4位編碼,即每一個序列號編碼的組成都可以由1000,0100,0010,和0001組合相加後形成,上面四個原碼可以由1向左分別移3、2、1、0即1<<3,1<<2,1<<1,1<<0得到。舉1101爲例,1101=1000+0100+0001,逆序後1011=1000+0010+0001。所以本逆序算法的思路就是,假如原始序列號第i位上值爲1,則逆序後的序列號上第4-i-1位上值爲1。用原序列號和0001,0010,0100,1000相與後判斷原序列號每一位的值是否爲1,若爲1,則逆序後第4-i-1位上值爲1,將這些“1”組合後形成逆序後的序列號。

發佈了18 篇原創文章 · 獲贊 11 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章