請問一下二維的FFT...... |
尚未結案
|
Weak
一般會員 發表:12 回覆:6 積分:3 註冊:2004-10-11 發送簡訊給我 |
for(int i = 0; i < ImgHeight ;i加加)
{
int num = 0;
for (int l = 1 ; l < (ImgWidth-1) ; l加加) {
k = ImgWidth/2;
while(k <= num) {
num = num-k;
k = k/2;
}
num = num 加 k;
if (l < num) {
xi = l;
xj = num;
temp = FFTImage[i][xi];
FFTImage[i][xi]=FFTImage[i][xj];
FFTImage[i][xj]=temp;
}
}
} //重新排列讓FFTImage[i][1]的値=FFTImage[i][ImgWidth/2]
//dllee前輩的FFT程式碼
for(int k=0; k < ImgHeight ; k加加)
{
int stepN=1,stepN2;
for(int j=0 ; j < LogWidth ; j加加)
{
stepN *= 2;
stepN2 =stepN/2;
wr = cos(PI/(double)stepN2);
wi = sin(PI/(double)stepN2);
Wn = complex
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
... 我還不知道我已被點名了 class="code">
for(int i=0;i
------
http://www.ViewMove.com |
Weak
一般會員 發表:12 回覆:6 積分:3 註冊:2004-10-11 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
應該是 FFT 已經作完了,剩下最後的整理成人看的圖時有問題。
因為 FFT 作完本來就是 (0,0) 點是最大值,所以就像您有問題的圖一樣,
角落是最大值(有亮點), 而您的圖重覆了 X, Y 都多了 8 份。
最後的整圖需要把四個象限
0 1
2 3
變成
3 2
1 0
這樣,亮點(低頻) 就會在中心了。 建議您一開始最好是用類似我那個小工具所產生的黑底, 及一個小白方塊來測試,如果能產生類似的圖,就表示是 OK 了。 用一般的照片 FFT 出來實在是無法看... 也無法除錯... 吃軟也吃硬 dllee.ktop.com.tw StatPlus 系統資源監測器 @ KTOP VMASK - ViewMove Automation Software Kernel
------
http://www.ViewMove.com |
Weak
一般會員 發表:12 回覆:6 積分:3 註冊:2004-10-11 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
//--------------------------------------------------------------------------- // 在右圖秀出左圖經 FFT 運算再以 Compress with Dyanmic Range 後的圖 void __fastcall TForm1::CmpDynaRangeClick(TObject *Sender) { complex基本上我是按上述的步驟來完成 2D FFT, 提供參考,如果您還是認為主要是在 FFT 轉換出了問題,那就請整理好程式碼(至少 { } 要對齊),再使用 [code] // BCB, Delphi 的程式碼 [/code] 來貼您的程式碼。 吃軟也吃硬 dllee.ktop.com.tw StatPlus 系統資源監測器 @ KTOP VMASK - ViewMove Automation Software Kernel
------
http://www.ViewMove.com |
Weak
一般會員 發表:12 回覆:6 積分:3 註冊:2004-10-11 發送簡訊給我 |
嗯 抱歉 因為我一直覺得是自己不知道哪裡把程式碼改錯了 可是自己又找不出來 所以才想請前輩看我到底哪裡弄錯了
請問一下前輩第一步做的 FFT Translation 是指什麼??
//------------------------------------------------------------- for(int i=0;i |
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
1. FFT Translation 就是您的 //將input image 乘上(-1)^(i+j)
看起來您的流程,好像是沒有問題... 只有一點... 請問您的圖大小是多少呢? FFT 適用於 2 的次方大小的圖,在我的作業中是限制圖檔一定是 256x256 的
大小,而您貼上來的圖好像是 513x513 為什麼不是 512x512 的大小呢? 還有,您也可以先只作 FFT X 或 FFT Y 來看是否只作一個方向時是 OK 的。 如果您有下載測試我的作業,
在左圖 256x256 的黑底畫 8x8 的小白方塊,在作完 FFT 的右圖也是分成
8x8 的大區塊,只是中間的部分結合了,如果畫的是 40x20 的小白方塊,
則在作完 FFT 的右圖也是分成 40x20 的區塊,只是中間的部分結合了。
使用 FFT in X 或 FFT in Y 則可以算出在 X 方向及 Y 方向 FFT 後的
方塊數,建議先使用 256x256 的大小,利用我的作業來作驗證,應該
可以比較快找出 BUG。 吃軟也吃硬 dllee.ktop.com.tw StatPlus 系統資源監測器 @ KTOP VMASK - ViewMove Automation Software Kernel
------
http://www.ViewMove.com |
Weak
一般會員 發表:12 回覆:6 積分:3 註冊:2004-10-11 發送簡訊給我 |
呃 圖片本來是512*512 只是我抓圖的時候沒注意 真是抱歉 嗯 本來我LogHeight 是等於 log(ImgHeight*2) 然後產生之前的結果 今天心血來潮 把它改成 log(ImgHeight*16)
竟然就跟正確結果差不多了 做Inverse FFT 回去也沒有問題....
請問是什麼原因呢?? 又 如果我做的是688*688 那是不是要把圖擴充成1024*1024 多餘項補零
再對擴充後的圖做 位元重排 FFT......最後可以得到一個1024*1024的spectrum 是這樣嗎?? 謝謝前輩解答我的問題 感激不盡....
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
如果您的 Log2N 給錯,則在 FFT 的主迴圈內就多執行或少執行了,
因為您可以發現,Log2N 的那個迴圈是與影像的 Index 沒有關係的,
如果多作或少作,只是 FFT 疊代的次數不同而已,而其結果自然不同。
如果您的圖不是 2 的次方大小,就像您說的一樣,先變大到某個 2 的次方
大小的圖,再作 FFT,再作頻域相關的運算,如濾波等等,IFFT 後再取原大小。
要驗證有沒有作對很簡單,把相同的圖那到不同的軟體去處理,就可以知道。 吃軟也吃硬 dllee.ktop.com.tw StatPlus 系統資源監測器 @ KTOP VMASK - ViewMove Automation Software Kernel
------
http://www.ViewMove.com |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |