蝶形變換初試序列

2021-08-17 13:14:01 字數 1634 閱讀 4882

問題描述:

處理音訊訊號是經常用到傅利葉變換將時域波形轉變為頻域波形,而

fft是快速計算這一變換的乙個方法。基

2時域抽選法是乙個時間

fft的方法,通過按數字下標的奇偶分組,可以獲得蝶形變換的初試序列。請模擬這個過程。

關於輸入:

第一行表示輸入的組數

t,每組的第一行是乙個整數

k(1<=k<=12),

表示數列長度為

2^k。然後接著一行是待分組的數列,元素的大小範圍為

[0,10000].

關於輸出:

分組後輸出。

樣例輸入:13

1 3 5 7 11 13 17 19

樣例輸出:

1 11 5 17 3 13 7 19

比如數列長度為

8,奇偶分組如下:

初始:0 1 2 3 4 5 6 7

第一次分組:

0 2 4 6 1 3 5 7

然後接著

分別對分開的兩組

再進行奇偶分組,再得到:

0 4 2 6 1 5 3 7

再分組是數列不再變化,這就是進行基

2時域抽選法的初試序列。

思路:對組內元素進行奇偶項分組,假設對n個元素分組,則奇偶邊界為m=n/2;再對m個資料進行分組,邊界為m=m/2;以此類推

若用樹狀圖可表示如下:

即,假設原始佇列有32個元素,每經過一次分組分為2x16;

定義butterflytrans(int e, int n)為一次分組,e儲存原始佇列,n為佇列長度(每一組有n個元素),運用遞迴思想,每一次分組n=n/2,直到n==0(每組元素個數為1時,佇列不再變換);此時遞迴走過的路徑為上圖黑色數字部分(從32到2);

遞迴返回部分是上圖紅色部分(從2到16,指每組內元素的個數),但詳細路徑是2—4,此時4可再分為兩組(圖中省略),當做完其中一組的奇偶劃分後,返回到另一組,即此時是從4—2,而非4—8;

同理當紅字4部分分組完後,返回到8,再從8分兩個四組,四組中再分兩個二組,以此類推,詳細的遞迴返回應是2—4—2—8—2—4—2—16—2—4—2—8—2—4—2(......);

由上述資料得出的規律是:

int fir = pow(2, p);

if ((c + fir) % (2 * fir) == 0)

else

else}}

}}void butterflytrans(int e,int n,int count)

else   //偶數項

}  //完成一輪蝶形變換,將n個數分為兩組,一組m個數

for (int index = 0; index < n; index++)   //更新原陣列

butterflytrans(e, m, count);

}else

else

//每輪返回位置}}

int main()

butterflytrans(buf, pow(2, k), 0);

for (int p = 0; p < pow(2,k); p++)

cout << endl;

t--;}}

Z字形變換

題目 將字串 paypalishiring 以z字形排列成給定的行數 p a h n a p l s i i g y i r 之後從左往右,逐行讀取字元 pahnaplsiigyir 思路 通過從左向右迭代字串,我們可以輕鬆地確定字元位於 z 字形圖案中的哪一行。演算法 我們可以使用 min num...

Z 字形變換

將乙個給定字串根據給定的行數,以從上往下 從左到右進行 z 字形排列。輸入 s leetcodeishiring numrows 4 輸出 ldreoeiiecihntsg l d r e o e i i e c i h n t s g 注釋思路 class solution 有了列數和行數,總個數...

N 字形變換

n 字形變換 user hihone date 2019 2 1 time 14 26 description 將乙個給定字串根據給定的行數,以從上往下 從左到右進行 n 字形排列。比如輸入字串為 leetcodeishiring 行數為 3 時,排列如下 l c i r e t o e s i i...