問題描述:
處理音訊訊號是經常用到傅利葉變換將時域波形轉變為頻域波形,而
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...