免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6216 | 回复: 8

[算法] 谁有图像 FFT 正反变换的源码 [复制链接]

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
发表于 2010-12-28 14:00 |显示全部楼层
10可用积分
谁有图像 FFT 正反变换的源码,最近在恶补图像处理。  {:3_189:}

最佳答案

查看完整内容

直接用FFTW就可以了,但要注意处理的时候如果有卷积可能会有移位的问题,可能需要扩充和补零。

论坛徽章:
0
发表于 2010-12-28 14:00 |显示全部楼层
直接用FFTW就可以了,但要注意处理的时候如果有卷积可能会有移位的问题,可能需要扩充和补零。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
发表于 2010-12-28 14:11 |显示全部楼层
正反几乎一样的,就一个系数差.
2^n*2^n的fft
先每个2*2变换,然后两两个两个根据公式合并

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
发表于 2010-12-28 14:40 |显示全部楼层
正反几乎一样的,就一个系数差.
2^n*2^n的fft
先每个2*2变换,然后两两个两个根据公式合并
cjaizss 发表于 2010-12-28 14:11



    是不是要先算一维的FFT,还是有更好的算法。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
发表于 2010-12-28 14:54 |显示全部楼层
是不是要先算一维的FFT,还是有更好的算法。
zhujiang73 发表于 2010-12-28 14:40



   还是二维的,你可以自己去查一下fft的递归公式

论坛徽章:
0
发表于 2010-12-28 18:36 |显示全部楼层
楼上果然钟爱数学

论坛徽章:
0
发表于 2010-12-28 23:26 |显示全部楼层
有库可用

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
发表于 2010-12-29 10:42 |显示全部楼层
还是二维的,你可以自己去查一下fft的递归公式
cjaizss 发表于 2010-12-28 14:54



   是这样的?  google  到这个:  http://blog.163.com/ld081055@126 ... 691520105144852433/
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>

  4. #define intsize sizeof(int)
  5. #define complexsize sizeof(complex)
  6. #define PI 3.1415926

  7. int *a,*b;
  8. int nLen,init_nLen,mLen,init_mLen,N,M;
  9. FILE *dataFile;

  10. typedef struct{
  11.     float real;
  12.     float image;
  13. }complex;

  14. complex *A,*A_In,*W;

  15. complex Add(complex, complex);
  16. complex Sub(complex, complex);
  17. complex Mul(complex, complex);
  18. int calculate_M(int);
  19. void reverse(int,int);
  20. void readData();
  21. void fft(int,int);
  22. void Ifft();
  23. void printResult_fft();
  24. void printResult_Ifft();

  25. int main()
  26. {
  27.     int i,j;
  28.     readData();
  29.     A = (complex *)malloc(complexsize*nLen);
  30.     reverse(nLen,N);
  31.     for(i=0; i<mLen; i++)
  32.     {
  33.         for(j=0; j<nLen; j++)
  34.         {
  35.             A[j].real = A_In[i*nLen+b[j]].real;
  36.             A[j].image = A_In[i*nLen+b[j]].image;
  37.         }
  38.       
  39.         fft(nLen,N);
  40.         for(j=0; j<nLen; j++)
  41.         {
  42.             A_In[i*nLen+j].real = A[j].real;
  43.             A_In[i*nLen+j].image = A[j].image;
  44.         }
  45.     }

  46.     free(a);
  47.     free(b);
  48.     free(A);

  49.     A = (complex *)malloc(complexsize*mLen);
  50.     reverse(mLen,M);
  51.     for(i=0; i<nLen; i++)
  52.     {
  53.         for(j=0; j<mLen; j++)
  54.         {
  55.             A[j].real = A_In[b[j]*nLen+i].real;
  56.             A[j].image = A_In[b[j]*nLen+i].image;
  57.         }

  58.         fft(mLen,M);
  59.         for(j=0; j<mLen; j++)
  60.         {
  61.             A_In[j*nLen+i].real = A[j].real;
  62.             A_In[j*nLen+i].image = A[j].image;
  63.         }
  64.     }
  65.     free(A);
  66.     printResult_fft();
  67.     Ifft();
  68.     printResult_Ifft();
  69.     return 0;
  70. }

  71. void readData()
  72. {
  73.      int i,j;

  74.      dataFile = fopen("dataIn.txt","r");
  75.      fscanf(dataFile,"%d %d",&init_mLen,&init_nLen);
  76.      M = calculate_M(init_mLen);
  77.      N = calculate_M(init_nLen);
  78.      nLen = (int)pow(2,N);
  79.      mLen = (int)pow(2,M);
  80.      A_In = (complex *)malloc(complexsize*nLen*mLen);

  81.      for(i=0; i<init_mLen; i++)
  82.      {
  83.          for(j=0; j<init_nLen; j++)
  84.          {
  85.              fscanf(dataFile,"%f",&A_In[i*nLen+j].real);
  86.              A_In[i*nLen+j].image = 0.0;
  87.          }
  88.      }
  89.      fclose(dataFile);

  90.      for(i=0; i<mLen; i++)
  91.      {
  92.          for(j=init_nLen; j<nLen; j++)
  93.          {
  94.              A_In[i*nLen+j].real = 0.0;
  95.              A_In[i*nLen+j].image = 0.0;
  96.          }
  97.      }

  98.      for(i=init_mLen; i<mLen; i++)
  99.      {
  100.          for(j=0; j<init_nLen; j++)
  101.          {
  102.              A_In[i*nLen+j].real = 0.0;
  103.              A_In[i*nLen+j].image = 0.0;
  104.          }
  105.      }

  106.      printf("Reading initial datas:\n");
  107.      for(i=0; i<init_mLen; i++)
  108.      {
  109.          for(j=0; j<init_nLen; j++)
  110.          {
  111.              if(A_In[i*nLen+j].image < 0)
  112.              {
  113.                  printf("%f%fi\t",A_In[i*nLen+j].real,A_In[i*nLen+j].image);
  114.              }
  115.              else
  116.              {
  117.                  printf("%f+%fi\t",A_In[i*nLen+j].real,A_In[i*nLen+j].image);
  118.              }
  119.          }
  120.          printf("\n");
  121.      }

  122.      printf("\n");

  123.      printf("Reading formal datas:\n");
  124.      for(i=0; i<mLen; i++)
  125.      {
  126.          for(j=0; j<nLen; j++)
  127.          {
  128.              if(A_In[i*nLen+j].image < 0)
  129.              {
  130.                  printf("%f%fi\t",A_In[i*nLen+j].real,A_In[i*nLen+j].image);
  131.              }
  132.              else
  133.              {
  134.                  printf("%f+%fi\t",A_In[i*nLen+j].real,A_In[i*nLen+j].image);
  135.              }
  136.          }
  137.          printf("\n");
  138.      }
  139. }


  140. void fft(int fft_nLen, int fft_M)
  141. {
  142.      int i;
  143.      int lev,dist,p,t;
  144.      complex B;

  145.      W = (complex *)malloc(complexsize*fft_nLen/2);

  146.      for(lev=1; lev<=fft_M; lev++)
  147.      {
  148.          dist = (int)pow(2,lev-1);
  149.          for(t=0; t<dist; t++)
  150.          {
  151.              p = t*(int)pow(2,fft_M-lev);
  152.              W[p].real = (float)cos(2*PI*p/fft_nLen);
  153.              W[p].image = (float)(-1*sin(2*PI*p/fft_nLen));
  154.              for(i=t; i<fft_nLen; i=i+(int)pow(2,lev))
  155.              {
  156.                  B = Add(A[i],Mul(A[i+dist],W[p]));
  157.                  A[i+dist] = Sub(A[i],Mul(A[i+dist],W[p]));
  158.                  A[i].real = B.real;
  159.                  A[i].image = B.image;
  160.              }
  161.          }
  162.      }

  163.      free(W);
  164. }


  165. void printResult_fft()
  166. {
  167.      int i,j;

  168.      printf("Output FFT results:\n");
  169.      for(i=0; i<mLen; i++)
  170.      {
  171.          for(j=0; j<nLen; j++)
  172.          {
  173.              if(A_In[i*nLen+j].image < 0)
  174.              {
  175.                  printf("%f%fi\t",A_In[i*nLen+j].real,A_In[i*nLen+j].image);
  176.              }
  177.              else
  178.              {
  179.                  printf("%f+%fi\t",A_In[i*nLen+j].real,A_In[i*nLen+j].image);
  180.              }
  181.          }
  182.          printf("\n");
  183.      }
  184. }

  185. void printResult_Ifft()
  186. {
  187.      int i,j;

  188.      printf("Output IFFT results:\n");
  189.      for(i=0; i<mLen; i++)
  190.      {
  191.          for(j=0; j<nLen; j++)
  192.          {
  193.              if(A_In[i*nLen+j].image < 0)
  194.              {
  195.                  printf("%f%fi\t",A_In[i*nLen+j].real,A_In[i*nLen+j].image);
  196.              }
  197.              else
  198.              {
  199.                  printf("%f+%fi\t",A_In[i*nLen+j].real,A_In[i*nLen+j].image);
  200.              }
  201.          }
  202.          printf("\n");
  203.      }

  204.      free(A_In);
  205. }

  206. int calculate_M(int len)
  207. {
  208.     int i;
  209.     int k;

  210.     i = 0;
  211.     k = 1;
  212.     while(k < len)
  213.     {
  214.         k = k*2;
  215.         i++;
  216.     }

  217.     return i;
  218. }

  219. void reverse(int len, int M)
  220. {
  221.     int i,j;

  222.     a = (int *)malloc(intsize*M);
  223.     b = (int *)malloc(intsize*len);

  224.     for(i=0; i<M; i++)
  225.     {
  226.         a[i] = 0;
  227.     }

  228.     b[0] = 0;
  229.     for(i=1; i<len; i++)
  230.     {
  231.         j = 0;
  232.         while(a[j] != 0)
  233.         {
  234.             a[j] = 0;
  235.             j++;
  236.         }

  237.         a[j] = 1;
  238.         b[i] = 0;
  239.         for(j=0; j<M; j++)
  240.         {
  241.             b[i] = b[i]+a[j]*(int)pow(2,M-1-j);
  242.         }
  243.     }
  244. }

  245. complex Add(complex c1, complex c2)
  246. {
  247.     complex c;
  248.     c.real = c1.real+c2.real;
  249.     c.image = c1.image+c2.image;
  250.     return c;
  251. }

  252. complex Sub(complex c1, complex c2)
  253. {
  254.     complex c;
  255.     c.real = c1.real-c2.real;
  256.     c.image = c1.image-c2.image;
  257.     return c;
  258. }

  259. complex Mul(complex c1, complex c2)
  260. {
  261.     complex c;
  262.     c.real = c1.real*c2.real-c1.image*c2.image;
  263.     c.image = c1.real*c2.image+c2.real*c1.image;
  264.     return c;
  265. }

  266. void Ifft()
  267. {
  268.     int i,j;

  269.     for(i=0; i<mLen; i++)
  270.     {
  271.         for(j=0; j<nLen; j++)
  272.         {
  273.             A_In[i*nLen+j].image = -A_In[i*nLen+j].image;
  274.         }
  275.     }

  276.     A = (complex *)malloc(complexsize*nLen);
  277.     reverse(nLen,N);
  278.     for(i=0; i<mLen; i++)
  279.     {
  280.         for(j=0; j<nLen; j++)
  281.         {
  282.             A[j].real = A_In[i*nLen+b[j]].real;
  283.             A[j].image = A_In[i*nLen+b[j]].image;  
  284.         }

  285.         fft(nLen,N);
  286.         for(j=0; j<nLen; j++)
  287.         {   
  288.             A_In[i*nLen+j].real = A[j].real/nLen;
  289.             A_In[i*nLen+j].image = A[j].image/nLen;
  290.         }
  291.     }
  292.     free(A);
  293.     free(a);
  294.     free(b);

  295.     A = (complex *)malloc(complexsize*mLen);
  296.     reverse(mLen,M);
  297.     for(i=0; i<nLen; i++)
  298.     {
  299.         for(j=0; j<mLen; j++)
  300.         {
  301.             A[j].real = A_In[b[j]*nLen+i].real;
  302.             A[j].image = A_In[b[j]*nLen+i].image;
  303.         }

  304.         fft(mLen,M);
  305.         for(j=0; j<mLen; j++)
  306.         {
  307.             A_In[j*nLen+i].real = A[j].real/mLen;
  308.             A_In[j*nLen+i].image = A[j].image/mLen;
  309.         }
  310.     }
  311.     free(A);
  312.     free(a);
  313.     free(b);
  314. }
复制代码

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
发表于 2010-12-30 10:43 |显示全部楼层
直接用FFTW就可以了,但要注意处理的时候如果有卷积可能会有移位的问题,可能需要扩充和补零。
mfzz1134 发表于 2010-12-29 13:45



    是要算卷积用,我想做个卷积的 GPU 加速,想找个 FFT 的源码参考参考...。  {:3_189:}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP