[問題] FFT

看板C_and_CPP (C/C++)作者 (kuan)時間16年前 (2009/03/29 19:14), 編輯推噓3(307)
留言10則, 5人參與, 最新討論串2/2 (看更多)
我這邊有一段FFT程式 可是他規定是只能用256點去跑 請問各位 有沒有辦法再這段程式的基礎上改成可以給定任意點呢? void FFT(double *segment, double **X) { int M = 8 , iN = Dim; int i, j, k, limit_1, limit_2, limit_3, ij, il; double farg, fpi = 3.1415926, fCos, fSin, fbr, fbi, fcr, fci, fx1, fx2; double *fxr = new double[window + 1]; double *fxi = new double[window + 1]; //****************** 將segment[256] => fxr[window] *************// for (i = 1; i <= window; i++) fxr[i] = fxi[i] = 0; //初始化fxr[window], fxi[window] for (i = 1; i <= window; i++) fxr[i] = segment[i - 1]; //將原始信號的256點個值 => fxr[window] // ***************** 傅立葉主程式開始 *************// limit_1 = iN - 1; limit_2 = iN / 2; ij = 1; // **************** 重排輸入值 ************// for (i = 1; i <= limit_1; i++) { if ((float) i <= ((float) ij - 0.01)) { fx1 = fxr[ij]; fx2 = fxi[ij]; fxr[ij] = fxr[i]; fxi[ij] = fxi[i]; fxr[i] = fx1; fxi[i] = fx2; } il = limit_2; while(1) { if ((float)il > ((float) (ij) - 0.01)) break; ij -= il; il /=2; } ij += il; } // **************** 傅立葉轉換 *************** // for(i = 1; i <= M; i++) // (limit_1, limit_2) =>(1, 256) (2, 128) (4, 64) (8, 32)..(256,1) { limit_1 = (int) pow(2, i - 1); limit_2 = (int) pow(2, (M - i)); for(j = 1; j <= limit_2; j++) //(1:256) (1:128) (1:64)..........(1:1) { for (k = 1; k <= limit_1; k++) { limit_3 = (k - 1) + (j - 1) * 2 * limit_1 + 1; //Odd Points //******************* fbr = fxr[limit_3]; fbi = fxi[limit_3]; fcr = fxr[limit_3 + limit_1]; fci = fxi[limit_3 + limit_1]; //******************* farg = 2.0 * fpi * (k - 1) * limit_2 / iN; fCos = cosl (farg); fSin = sinl (farg); //******************* fx1 = fcr * fCos + fci * fSin ; fx2 = fci * fCos + (0 - fcr) * fSin ; // fxr[limit_3] = fbr + fx1; fxi[limit_3] = fbi + fx2; fxr[limit_3 + limit_1] = fbr - fx1; fxi[limit_3 + limit_1] = fbi - fx2; } } } // for (i = 1; i <= window; i++) { X[0][i - 1] = fxr[i]; X[1][i - 1] = fxi[i]; } //cout << "X[] = " << X[0][0]; delete[] fxr, fxi; } 謝謝各位了!! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.120.90.193

03/29 20:14, , 1F
我可以先問一下,你希望的數字是多少嗎?
03/29 20:14, 1F

03/30 00:22, , 2F
上網隨邊抓都有現成的CODE 就256 512 1024 最普遍
03/30 00:22, 2F

03/30 00:23, , 3F
我是自己可以找到512 1024的 可是我是要用128~256中間的
03/30 00:23, 3F

03/30 00:23, , 4F
數字阿 ORZ
03/30 00:23, 4F

03/30 22:45, , 5F
目前需要用到192~~
03/30 22:45, 5F

03/31 13:05, , 6F
FFT沒有192的= =也不可能有 把192後面的值補零 補到256
03/31 13:05, 6F

03/31 13:28, , 7F
可是為什麼matlab的FFT可以用任意數去轉換呢?
03/31 13:28, 7F

03/31 22:18, , 8F
去看FFT的演算法 你就知道為什麼一定是2^n點
03/31 22:18, 8F

04/02 14:23, , 9F
想要任意點數就只能跑DFT了吧
04/02 14:23, 9F

04/02 16:32, , 10F
恩 DFT我會寫 只是速度太慢了 ORZ
04/02 16:32, 10F
文章代碼(AID): #19prWi-N (C_and_CPP)
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):
3
10
16年前, 03/29
1
4
16年前, 03/09
文章代碼(AID): #19prWi-N (C_and_CPP)