線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3885
推到 Plurk!
推到 Facebook!

請問一下二維的FFT......

尚未結案
Weak
一般會員


發表:12
回覆:6
積分:3
註冊:2004-10-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-22 23:30:08 IP:140.113.xxx.xxx 未訂閱
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(1.0,0.0); wn = complex( wr, -wi); for(int m=1; m <= stepN2 ; m加加) { for(int i=m; i <= ImgWidth ; i加=stepN) { p = i-1; q = p 加 stepN2; Fodd_Wn = FFTImage[k][q] * Wn; // Fodd * Wn FFTImage[k][q] = FFTImage[k][p] - Fodd_Wn; FFTImage[k][p] = FFTImage[k][p] 加 Fodd_Wn; } Wn = Wn * wn; } } } //之後對X方向做FFT,先重排每一行的位元,再做FFT 本來做出來的spectrum應該只有ㄧ個 可是變成這樣 請問是我的FFT觀念有錯 還是程式哪裡出了問題??
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-02 21:30:31 IP:211.76.xxx.xxx 未訂閱
... 我還不知道我已被點名了  class="code"> for(int i=0;i 像這樣一層一層以 { } 對齊, 別人才容易看懂, 不然, 還要先花時間整理 code, 整理好, 再來看是否有問題, 實在是太累人了... 另外, 在貼原始碼時, 要使用如下的方式來貼 [code] // BCB, Delphi 的程式碼 [/code] 程式碼就會對齊了, 不會全部都靠左, 不易讀... 關於 FFT, 以一般的圖片, 作出來應該都是低頻較強, 所以在中間有 peak, 而您應該也使用了 DyanmicRangeCompression S(r) = c * log( 1 | r | ) 的方式來處理 FFT 後的資料, 否則應該只有中心一個亮點, 因為其他相對中心 都太小了,所以您應該很接近完成了才是。 以下是我以前作業的可執行檔的連結, 提供您參考 http://free.greenworld.com.tw/~dllee/leesoft/imagep.zip (功能很陽春,只能處理固定的256x256灰階BMP影像,而且如果螢幕使用低於32位元的色彩解析度還會失真,而程式自己已經不太能看懂... ) 最好是把您的原圖 > < href="http://free.greenworld.com.tw/~dllee/" target="blank">吃軟也吃硬 dllee.ktop.com.tw StatPlus 系統資源監測器 @ KTOP VMASK - ViewMove Automation Software Kernel
------
http://www.ViewMove.com
Weak
一般會員


發表:12
回覆:6
積分:3
註冊:2004-10-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-05 22:34:25 IP:140.113.xxx.xxx 未訂閱
對不起  我沒注意到  下次我絕對不會再犯了....對不起 謝謝您的回答  我的原圖是這個 本來做完FFT會變 可是我做完後卻變成 請問我是哪裡沒注意到嗎??謝謝前輩的回答....
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-06 14:07:48 IP:220.139.xxx.xxx 未訂閱
應該是 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-06 20:20:11 IP:140.113.xxx.xxx 未訂閱
最後的整圖需要把四個象限 0 1 2 3 變成 3 2 1 0 這樣,亮點(低頻) 就會在中心了。    ---------------------------------------------------------------    請問是指在處理之後要乘上 (-1)^(x+y)嗎?? 如果是的話  那我有做這個動作     我之後用這張圖片測試 得到的結果是 還是很明顯的被分成許多重複的部分 很奇怪....
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-12-06 22:28:59 IP:211.76.xxx.xxx 未訂閱
//---------------------------------------------------------------------------
// 在右圖秀出左圖經 FFT 運算再以 Compress with Dyanmic Range 後的圖
void __fastcall TForm1::CmpDynaRangeClick(TObject *Sender)
{
   complex **ppcpxFFT;
   int *pBitRevIndex=new int[256];
   ppcpxFFT=Allocate2DComplex(256,256);
   StatusBar1->Panels->Items[1]->Text= "FFT...";
   ProgressBar1->Visible=true;
   FFTTranslation(ppcpxFFT,Image1);                // 1. FFT Translation
   BitReversal(pBitRevIndex,256);                  // 2. Bit Reversal
   FFT1D(ppcpxFFT,256,pBitRevIndex,0);             // 3. FFT in Y direction
   FFT1D(ppcpxFFT,256,pBitRevIndex,1);             // 4. FFT in X direction
   FFTCompressDynaRange(Image2,ppcpxFFT);          // 5. DyanmicRangeCompression
   Free2D(ppcpxFFT,256,256);
   delete[] pBitRevIndex;
   ProgressBar1->Visible=false;
}
基本上我是按上述的步驟來完成 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-12-08 11:46:27 IP:140.113.xxx.xxx 未訂閱
嗯 抱歉 因為我一直覺得是自己不知道哪裡把程式碼改錯了 可是自己又找不出來  所以才想請前輩看我到底哪裡弄錯了 請問一下前輩第一步做的 FFT Translation 是指什麼??
//-------------------------------------------------------------            for(int i=0;i(pow(-1,i j)*Datatemp[i][j],0.0);
          }       //將input image 乘上(-1)^(i j)            for(int i=0;i(1.0,0.0);
            wn = complex( wr, -wi);
            steptemp=complex(stepN,0.0);
            for(int m=1; m <= stepN2 ; m  )                    
            {
              for(int i=m; i <= ImgWidth ; i =stepN)
              {
                p = i-1;
                q = p   stepN2;
                Fodd_Wn = FFTImage[k][q] * Wn;
                FFTImage[k][q] = FFTImage[k][p] - Fodd_Wn;
                FFTImage[k][p] = FFTImage[k][p]   Fodd_Wn;
              }
            Wn = Wn * wn;
           }
          }
        }   
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-12-09 21:20:03 IP:211.76.xxx.xxx 未訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-12-12 21:40:34 IP:140.113.xxx.xxx 未訂閱
呃 圖片本來是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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-12-13 09:37:44 IP:220.139.xxx.xxx 未訂閱
如果您的 Log2N 給錯,則在 FFT 的主迴圈內就多執行或少執行了, 因為您可以發現,Log2N 的那個迴圈是與影像的 Index 沒有關係的, 如果多作或少作,只是 FFT 疊代的次數不同而已,而其結果自然不同。 如果您的圖不是 2 的次方大小,就像您說的一樣,先變大到某個 2 的次方 大小的圖,再作 FFT,再作頻域相關的運算,如濾波等等,IFFT 後再取原大小。 要驗證有沒有作對很簡單,把相同的圖那到不同的軟體去處理,就可以知道。    吃軟也吃硬 dllee.ktop.com.tw StatPlus 系統資源監測器 @ KTOP VMASK - ViewMove Automation Software Kernel
------
http://www.ViewMove.com
系統時間:2024-05-20 22:36:23
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!