精华内容
下载资源
问答
  • C#实现FFT和IFFT

    热门讨论 2015-01-04 10:29:00
    用C#实现的FFT和IFFT类,方便初学者进行学习,也可直接在代码里使用
  • 数字信号处理dit-fft和ifft的c语言实现
  • 在这个压缩文件中包含了一个FFT类以及一个复数类,实现了快速傅里叶变换及其反变换(FFT和IFFT)以及复数的运算。综合考虑各细节使碟形算法达到最高的效率。头文件中还包括了FFT类的使用方法。 此算法的准确性经过...
  • FFT和IFFT算法的Verilog实现,可将信号从时间转换为频率,反之亦然 使用MATLAB设计的滤波器 Java源代码,用于生成Verilog FFT和IFFT文件。 只需单击一下按钮,便可以帮助我们生成不同的FFT和IFFT设计(512点,256点...
  • 行业资料-设备研制-一种FFT和IFFT逆序数表的并行处理方法.zip
  • matlab fft 代码 4-IFFT-FFT-Matlab 代码实现的是基于4的FFT和IFFT算法的实现,其实现方式是使用Matlab来实现的
  • FFT和IFFT的Matlab实现

    千次阅读 2020-03-18 23:52:55
    这几天要用C语言做一个FFT和IFFT,所以先在MATLAB中进行仿真,我在网上找了个FFT的matlab仿真,经过验证后,功能是正确的,自己又做了一个IFFT的,又用C语言实现了一遍;先来稍微分析一下我在网上找的FFT的Maltab...

    这几天要用C语言做一个FFT和IFFT,所以先在MATLAB中进行仿真,我在网上找了个FFT的matlab仿真,经过验证后,功能是正确的,自己又做了一个IFFT的,又用C语言实现了一遍;先来稍微分析一下我在网上找的FFT的Maltab代码把,具体的理论知识自己看下书。
    现在有一信号为x=[0 2 4 6 0 2 4 6];那么根据蝶形图运算法则(这里为DIF-FFT),有:
    x(1) = x(1)+x(5);x(5) = (x(1)-x(5))*W1
    x(2) = x(2)+x(6);x(6) = (x(2)-x(6))*W2
    x(3) = x(3)+x(7);x(7) = (x(3)-x(7))*W3
    x(4) = x(4)+x(8);x(8) = (x(4)-x(8))*W4
    这是第一级的规律

    x(1) = x(1)+x(3);x(3) = (x(1)-x(3))*W1
    x(2) = x(2)+x(4);x(4) = (x(2)-x(4))*W2
    x(5) = x(5)+x(7);x(6) = (x(5)-x(7))*W1
    x(7) = x(6)+x(8);x(8) = (x(6)-x(8))*W2
    这是第二级的规律

    x(1) = x(1)+x(2);x(2) = (x(1)-x(2))*W1
    x(3) = x(3)+x(4);x(4) = (x(3)-x(4))*W1
    x(5) = x(5)+x(6);x(6) = (x(5)-x(6))*W1
    x(7) = x(7)+x(8);x(8) = (x(7)-x(8))*W1
    这是第三级的规律

    由上述运算我们可得知,
    只要有三个循环我们就可以实现此算法,一个循环控制蝶形运算级数,一个循环控制旋转因子的值,另外一个循环控制运算过程中参与运算数据的规律,但是这三个循环也还是存在着一些相互联系,具体你们自己看代码,这完全是根据C语言的语法来写的,应该很轻松的改编成C语言。

    所以下面来实现代码:
    下面是FFT的matlab代码:
    在这里插入图片描述

    下面是IFFT的代码:
    在这里插入图片描述
    验证下答案:FFT的和内置FFT做对比,我只放出自己写的FFT后的值:

    再对比下IFFT的效果,结果正确:
    在这里插入图片描述

    但是IFFT有时会出现点误差,具体原因我不解释了,有兴趣可以自己找下原因。

    展开全文
  • itk下FFTW的FFT和IFFT

    千次阅读 2017-03-02 13:06:55
    itk下FFTW的FFT和IFFT

    原文:http://blog.csdn.net/ljp1919/article/details/41890425

    1:先进行FFT变换,再将图像进行逆变换,并对比两者的结果。

    1. #include <tiffio.h>  
    2. #include "fftw3.h"  
    3. #include <stdio.h>  
    4. #include "itkImageFileReader.h"  
    5. #include "itkImageFileWriter.h"  
    6. #include "itkWrapPadImageFilter.h"  
    7. #include "itkForwardFFTImageFilter.h"  
    8. #include "itkCastImageFilter.h"  
    9. #include "itkRescaleIntensityImageFilter.h"  
    10. #include "itkComplexToModulusImageFilter.h"  
    11. #include "itkIntensityWindowingImageFilter.h"  
    12. #include "itkFFTShiftImageFilter.h"  
    13.   
    14. #pragma comment(lib, "libfftw3-3.lib")  
    15. #pragma comment(lib, "libfftw3f-3.lib")  
    16. #pragma comment(lib, "libfftw3l-3.lib")  
    17. #define N 8  
    18. typedef itk:: Image<float , 2> FloatImageType;  
    19. typedef itk ::Image< unsigned char , 2> UnsignedCharImageType;  
    20. typedef float MatrixType;  
    21.   
    22. void CopyMatrix(FloatImageType:: Pointer image , MatrixType **mask);  
    23. void CopyImage(FloatImageType:: Pointer image , fftw_complex *mask);  
    24. void CopyRealImage (FloatImageType:: Pointer image , float ** mask);//仅仅拷贝实部  
    25. void MyCastFloatToUnsichar(FloatImageType::Pointer image, UnsignedCharImageType::Pointer imageNew );//将float转为unsigned char型  
    26. int main()  
    27. {  
    28.     //读取图像  
    29.      FloatImageType::Pointer image;  
    30.       
    31.      const char * inputFileName = "F:\\DIPcode\\SIMC\\imagesrc\\2.jpg" ; //argv[1];  
    32.      const char * outputFileName = "F:\\DIPcode\\SIMC\\2_new.tif" ; //argv[2];  
    33.   
    34.      typedef itk ::ImageFileReader< FloatImageType> ReaderType ;  
    35.      ReaderType::Pointer reader = ReaderType::New ();  
    36.      reader->SetFileName (inputFileName);  
    37.      reader->Update ();  
    38.      image = reader ->GetOutput();  
    39.   
    40.     //遍历图像像素,赋值到一个矩阵  
    41.      MatrixType **pixelColors = new MatrixType*[512]();  
    42.      for (int i=0;i<512;i++)  
    43.      {  
    44.          pixelColors[i] = new MatrixType[512]; //为每个指针都分配8个char元素空间。  
    45.      }  
    46.      CopyMatrix(image ,  pixelColors);  
    47.   
    48.     int width =512;  
    49.     int height=512;  
    50.   
    51.     fftw_plan planR;  
    52.     fftw_complex *inR,  *outR, *resultR;  
    53.   
    54.     //Allocate arrays.  
    55.     inR = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width);  
    56.     outR = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width);  
    57.     resultR = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width);  
    58.   
    59.     //Fill in arrays with the pixelcolors.  
    60.     for (int y = 0; y < height; y++) {  
    61.         for (int x = 0; x < width; x++) {  
    62.             //int currentIndex = ((y * width) + (x)) * 3;  
    63.             int currentIndex = (y * width) + x;  
    64.             inR[y * width + x][0] = (double)pixelColors[y][x];  
    65.             inR[y * width + x][1] = 0.0;      
    66.         }  
    67.     }  
    68.   
    69.     //Forward plans.  
    70.     planR = fftw_plan_dft_2d(width, width, inR, outR, FFTW_FORWARD, FFTW_MEASURE);  
    71.       
    72.     //Forward FFT.  
    73.     fftw_execute(planR);  
    74.       
    75.     //Backward plans.  
    76.     fftw_plan planRR = fftw_plan_dft_2d(width, width, outR, resultR, FFTW_BACKWARD, FFTW_MEASURE);  
    77.       
    78.     //Backward fft  
    79.     fftw_execute(planRR);  
    80.   
    81.      Have to scale the output values to get back to the original.  
    82.     int size=height*width;  
    83.     for(int i = 0; i < size; i++) {  
    84.         resultR[i][0] = resultR[i][0] / size;  
    85.         resultR[i][1] = resultR[i][1] / size;  
    86.     }  
    87.   
    88.     //Overwrite the pixelcolors with the result.  
    89.     for (int y = 0; y < height; y++)   
    90.     {  
    91.         for (int x = 0; x < width; x++)  
    92.         {  
    93.             //int currentIndex = ((y * width) + (x)) * 3;  
    94.             pixelColors[y][x] =resultR[y * width + x][0];//  
    95.             //std::cout<<pixelColors[y][x]<<'\t';  
    96.         }  
    97.     }  
    98.       
    99.     //将图像写出来  
    100.     CopyRealImage(image , pixelColors);//将pixelColors中的像素值复制到image中  
    101.     //调整亮度  
    102.     typedef itk ::RescaleIntensityImageFilter< FloatImageType , FloatImageType > RescaleFilterType;  
    103.     RescaleFilterType::Pointer imaginaryRescaleFilter = RescaleFilterType ::New();  
    104.     imaginaryRescaleFilter->SetInput (image);  
    105.     imaginaryRescaleFilter->SetOutputMinimum (0);  
    106.     imaginaryRescaleFilter->SetOutputMaximum (255);  
    107.     imaginaryRescaleFilter->Update ();  
    108.     //转为8bit  
    109.     //类型转换,float转为8bit的。  
    110.     typedef itk ::CastImageFilter< FloatImageType, UnsignedCharImageType > CastFilterType;  
    111.     CastFilterType::Pointer castFilter = CastFilterType::New ();  
    112.     castFilter->SetInput (imaginaryRescaleFilter->GetOutput());  
    113.     castFilter->Update ();  
    114.     //将图像写出来  
    115.     typedef itk ::ImageFileWriter< UnsignedCharImageType > WriterType ;  
    116.     WriterType::Pointer writer = WriterType::New ();  
    117.     writer->SetFileName ( outputFileName );  
    118.     writer->SetInput (castFilter->GetOutput());  
    119.     try  
    120.     {  
    121.         writer->Update ();  
    122.     }  
    123.     catch( itk ::ExceptionObject & error )  
    124.     {  
    125.         std::cerr << "Error: " << error << std ::endl;  
    126.         return EXIT_FAILURE ;  
    127.     }  
    128.     delete []pixelColors;  
    129.     fftw_free(inR);  
    130.     fftw_free(outR);  
    131.     fftw_free(resultR);  
    132.   
    133.     return 0;  
    134. }  
    135. void CopyMatrix(FloatImageType:: Pointer image , MatrixType **mask)  
    136. {  
    137.     FloatImageType::RegionType region = image->GetLargestPossibleRegion ();  
    138.     FloatImageType::SizeType regionSize = region.GetSize ();  
    139.   
    140.     for (int x=0; x<regionSize [0]; x++)  
    141.         for(int y=0; y<regionSize [1]; y++)  
    142.         {   //3、定义像素索引  
    143.             FloatImageType::IndexType index;  
    144.             index[0] = x ;  
    145.             index[1] = y ;  
    146.             mask[x][y] =(MatrixType) image->GetPixel(index);//获取该位置的像素值  
    147.         }  
    148.   
    149. }  
    150.   
    151. void CopyImage(FloatImageType:: Pointer image , fftw_complex *mask)  
    152. {  
    153.     FloatImageType::RegionType region = image->GetLargestPossibleRegion ();  
    154.     FloatImageType::SizeType regionSize = region.GetSize ();  
    155.   
    156.     for (int x=0; x<regionSize [0]; x++)  
    157.         for(int y=0; y<regionSize [1]; y++)  
    158.         {  
    159.             double re = mask[x*regionSize[1]+y][0];  
    160.             double im = mask[x*regionSize[1]+y][1];  
    161.             double mag = sqrt (re*re + im*im);  
    162.             //3、定义像素索引  
    163.             FloatImageType::IndexType index;  
    164.             index[0] = x ;  
    165.             index[1] = y ;  
    166.             image->SetPixel(index, mag);//获取该位置的像素值  
    167.         }  
    168.   
    169. }  
    170. //仅仅将mask中的值,赋给image中!  
    171. void CopyRealImage (FloatImageType:: Pointer image , MatrixType ** mask)  
    172. {  
    173.     FloatImageType::RegionType region = image->GetLargestPossibleRegion ();  
    174.     FloatImageType::SizeType regionSize = region.GetSize ();  
    175.     int Imgsize = regionSize[0]*regionSize[1];  
    176.   
    177.     for (int x=0; x<regionSize [0]; x++)  
    178.         for(int y=0; y<regionSize [1]; y++)  
    179.         {   //3、定义像素索引  
    180.             FloatImageType::IndexType index;  
    181.             index[0] = x ;  
    182.             index[1] = y ;  
    183.               
    184.             image->SetPixel (index, mask[x ][y]);   
    185.             //获取该位置的像素值  
    186.             //std::cout<<image->GetPixel(index);  
    187.         }  
    188.   
    189. }  
    190. void MyCastFloatToUnsichar(FloatImageType::Pointer image, UnsignedCharImageType::Pointer imageNew )//将float转为unsigned char型  
    191. {  
    192.     FloatImageType::RegionType region = image->GetLargestPossibleRegion ();  
    193.     FloatImageType::SizeType regionSize = region.GetSize ();  
    194.       
    195.     for (int x=0; x<regionSize [0]; x++)  
    196.         for(int y=0; y<regionSize [1]; y++)  
    197.         {   //3、定义像素索引  
    198.             FloatImageType::IndexType index;  
    199.             index[0] = x ;  
    200.             index[1] = y ;  
    201.             //std::cout<<image->GetPixel(index)<<'\t';  
    202.             float temp = static_cast<unsigned char>(image->GetPixel(index));  
    203.             //std::cout<<temp<<'\t';  
    204.             imageNew->SetPixel (index, temp);   
    205.             int tt=imageNew->GetPixel(index);  
    206.             获取该位置的像素值  
    207.             //std::cout<<tt<<'\t';  
    208.         }  
    209.   
    210. }  
    起初在不进行cast进行图像类型转换的时候,因为是float所以结果是32位的,但是直接对image进行cast,映射为unsigned char (8bit)之后,结果一片黑色,说明在进行映射过程中发生了数据截断。后来经过调整,先进行rescale亮度。再重新进行映射,则可以重建出其逆变换的结果。但是对比两者结果图还是有些不一样的。
    展开全文
  • 目录FFT原理简介DSPLib配置图像数据生成DSPLib中的FFT和IFFT二维FFT和IFFT实现图像分析工具(Image Analyzer)测试结果相关资源链接 参考资料: Rafael C. Gonzalez, Richard E. Woods, 数字图像处理(第三版)4.11...

    参考资料:

    1. Rafael C. Gonzalez, Richard E. Woods, 数字图像处理(第三版)4.11,配套书内资源
    2. Alan V.Oppenheim, Ronald W.Schafer, 离散时间信号处理(第三版)9.5
    3. SPRUEB8B - TMS320C64x+ DSP Little-Endian DSP Library Programmer’s Reference
    4. CCS Doc, 7.8 Image Analyzer

    FFT原理简介

      FFT的计算在任意一本《数字信号处理》的书中肯定都有讲,我看的是《离散时间信号处理》这本书。整个第9章对DFT和FFT做了详细的介绍。
      最开始讲的Goertzel算法,引入一个数字序列,通过这一序列的递推公式求第N个值,等价于计算相应的DFT的结果。虽然这一算法的计算量仍然正比于 N 2 N^2 N2,但也在一定程度上降低了计算复杂度。
      而后的按时间抽取和按频率抽取的FFT算法在后面又归结为N为复合数的更为一般的FFT算法。按时间抽取的算法是比较好理解的。一个数字序列,根据标号的奇偶性分为两个序列,分别计算DFT,再由它们的结果计算整个序列的DFT就非常方便。其中可以灵活运用旋转因子的对称性和周期性,最后表示成一个“蝶形运算”。
    蝶形运算

      FFT的计算中,数据存储也是一个需要审慎考虑的问题。蝶形运算两端的数据索引如果不需要发生改变,那样就可以把计算结果再存回原来的位置,而不需要额外开辟空间,这就被称为“同址计算(in-place)”。经过观察可以发现,如果输入是到位序的,然后用同址计算得到的结果就是正序的;如果输入是正序的,再用同址计算得到的结果就是到位序的。也有那种输入输出都是正序的算法,那样就没有采用同址计算。
      我们熟悉的FFT算法,把序列分成奇偶序列递归地运算,就要求序列长度是2的幂次,这种算法称为“radix-2”算法;而如果按照类似的方法,把整个序列分成4组,即x[4n]、x[4n+1]、x[4n+2]、x[4n+3],这被称为“radix-4”算法。那样所需要的级数( l o g 4 N log_4N log4N)就更少,同时也要求序列的的长度是4的幂次。当然,还有将两种算法结合,主要采用radix-4,而在最后根据情况采用radix-2或者radix-4。

    DSPLib配置

      DSP库安装在哪也都无所谓,在Window->Preferences->Code Composer Studio->Products页面下可以找到安装的DSP库。
      但是这个Product我不知道怎么用,就是我在实际的工程里即使勾选这个product好像也没啥用。
      在跑例程的时候,我看到源文件中只包含了dsplib.h,所以只要包含它的路径和对应的静态库就行。
      可以在Window->Preferences->Code Composer Studio->Build->Environment页面下添加DSP的安装路径。方便在工程中设置相应的包含路径和包含的静态库。
    dsplib

    图像数据生成

      用opencv-python读图像数据,调整图像分辨率,长宽同比例缩放,并在空白区域填充“0”,用于满足FFT对2的整数次幂的要求。生成输出.h文件和调整分辨率后的图像。

    import cv2
    
    img = cv2.imread("Fig0431(d)(blown_ic_crop).tif",cv2.IMREAD_GRAYSCALE)
    fp_code = open('..\\FFT2\\image.h','w') #the path should adjust as your need
    
    # the destinate image size
    dst_height = 1024
    dst_width = 1024
    
    # the image size of raw image
    height = img.shape[0]
    width = img.shape[1]
    
    #calculate the scale
    scale = min(dst_height/height,dst_width/width)
    
    #resize the image, using the same scale for both width and height
    res = cv2.resize(img, None, fx=scale, fy=scale,interpolation=cv2.INTER_AREA)
    
    #fill the reigon where is blank with black
    res = cv2.copyMakeBorder(res,0,round(dst_height-height*scale), 0, round(dst_width-width*scale),cv2.BORDER_CONSTANT,value=[0])
    
    # write data to .h file
    linestride = int(dst_width/4)
    fp_code.write('#pragma DATA_ALIGN(img_src, 8);\n')
    fp_code.write('int img_src[] = {\n    ')
    for i in range(dst_height):
        for k in range(4):
            for j in range(linestride):
                if(i==dst_height-1 and k == 3 and j == linestride-1):
                    fp_code.write(str(res[i][k*linestride+j]) + ', 0')
                else:
                    fp_code.write(str(res[i][k*linestride+j]) + ', 0, ')
            fp_code.write('\n    ')
    fp_code.write('};\n')
    
    # write image
    cv2.imwrite("img.png",res)
    

    DSPLib中的FFT和IFFT

      DSPLib中的函数可以从源文件中的注释进行理解,也可以直接看SPRUEB8B这个文档。FFT根据输入和输出数据的位宽也分好多种,我实现的是那种输入输出都是32位的fft,没有缩放系数,也就是在"dsplib安装路径\packages\ti\dsplib\src"路径下的DSP_fft32x32和DSP_ifft32x32。
      在上面的路径下有四个测试例程的文件夹还有三种FFT的实现方式,分别是纯C语言实现(_cn)、带有编译器指令的C语言实现(_i)和汇编实现(_sa)。这三种方式中,直接采用汇编实现的代码效率最高,速度最快。而DSP库默认调用的也就是这个汇编的FFT。
      这三种实现方式,采用的计算方式都是相同的,只是采用专门的汇编指令有更高的效率。所以想要理解这个代码可以直接看_cn版本的。蝶形运算的示意图大概是下面这个样子:
    在这里插入图片描述

      输入输出都是正序,没有同址计算。采用radix-4的算法,一个蝶形运算需要4个数。在第一级运算中,这四个数的标号间隔为N/4(类比图里radix-2是N/2),这在代码中用变量stride表示,后续每级逐级减小。
    IFFT的计算和FFT非常像,我们可以用类似的方式计算IFFT,《数字图像处理》的4.11.2给出了计算方法。
    N x ∗ [ n ] = ∑ n = 0 N − 1 X ∗ [ k ] e − j 2 π k n / N N{x^*}[n] = \sum\limits_{n = 0}^{N - 1} {{X^*}[k]{e^{ - j2\pi kn/N}}} Nx[n]=n=0N1X[k]ej2πkn/N
      一般情况下 x ∗ [ n ] = x [ n ] x^*[n]=x[n] x[n]=x[n],所以我们只需要对原复数序列取共轭后做DFT,再把得到的结果除以“N”就能得到IFFT的结果。

    二维FFT和IFFT实现

      在《数字图像处理》4.11.1中介绍了二维DFT的可分性,即要实现二维DFT,可以对行列两个维度分别做DFT。在代码中实现时,可以先对行做FFT,再将结果转置,之后再对行做FFT,最后再转置回去就能够得到对应的二维DFT的结果。\

    /*
     * @func	fft2, because of transpose function, this function can be only used when width is equal to height!!!
     *
     * @param	w	=	twiddle factors
     * @param	psrc	=	source pointer, point to the image data to be processed
     * @param	ptmp	=	a pointer point to a data space, witch size is as same as the source image, just for temporary use
     * @param	width	=	image width
     * @param	height	=	image height
     */
    void DSP_fft2(int *w, int *psrc, int *ptmp, int width, int height){
        int *ps = psrc;
        int *pd = ptmp;
        int i;
    
        // fft for the row
        for(i=0;i<height;i++){
            DSP_fft32x32(w, width, ps, pd);
            ps = ps + 2*width;
            pd = pd + 2*width;
        }
    
        //transpose
        transpose(ptmp, width, height);
    
        //fft for the column
        ps = ptmp;
        pd = psrc;
        for(i=0;i<width;i++){
            DSP_fft32x32(w, width, ps, pd);
            ps = ps + 2*width;
            pd = pd + 2*width;
        }
    
        //transpose
        transpose(psrc, width, height);
    }
    

      这里的转置就是一般的转置,不是共轭转置。如果图像的行和列长度是相等的,转置只需要交换行列坐标相对的两个位置的数据。而如果图像的行和列的长度不相等,则需要额外开辟空间用来存放转置的数据,额外的存储开销较大,因此我就没写这部分代码,而是要求图像行列等长。
      DSP库中提供的IFFT仅是在FFT的基础上进行了一点修改,改了一些符号,实现了取复共轭的计算,但是没有除以序列长度。因此在每次调用DSP_ifft32x32后需要对结果再除以“N”才是IFFT的结果。

    /*
     * @func	ifft2, because of transpose function, this function can be only used when width is equal to height!!!
     *
     * @param	w		=	twiddle factors
     * @param	psrc	=	source pointer, point to the image data to be processed
     * @param	ptmp	=	a pointer point to a data space, witch size is as same as the source image, just for temporary use
     * @param	width	=	image width
     * @param	height	=	image height
     */
    void DSP_ifft2(int *w, int *psrc, int *ptmp, int width, int height){
    	int *ps = psrc;
    	int *pd = ptmp;
    	int i;
    
    	//ifft for the row
    	for(i=0;i<height;i++){
    		DSP_ifft32x32(w, width, ps, pd);
    		ps = ps + 2*width;
    		pd = pd + 2*width;
    	}
    	for(i=0;i<2*width*height;i++){
    		ptmp[i] = ptmp[i]/width;
    	}
    
    	//transpose
    	transpose(ptmp, width, height);
    
    	//ifft for the column
    	ps = ptmp;
    	pd = psrc;
    	for(i=0;i<width;i++){
    		DSP_ifft32x32(w, width, ps, pd);
    		ps = ps + 2*width;
    		pd = pd + 2*width;
    	}
    	for(i=0;i<2*width*height;i++){
    		psrc[i] = psrc[i]/width;
    	}
    
    	//transpose
    	transpose(psrc, width, height);
    }
    

    图像分析工具(Image Analyzer)

      CCS自带图像分析工具。在调试界面,从Tools->Image Analyzer打开,电梯Image窗口内的区域,可以编辑Properties窗口中的属性。
    imageanalyzer

    • Image Format: 输入图像格式,取决于具体的数据格式
    • Number of pixels per line: 每行像素
    • Number of lines: 图像行数
    • Data format: 数据格式,packed就是一个像素的数据是连续存放的,还有一种planar的就是同一通道的数据是连续存放的
    • Pixel stride (bytes): 像素步进,就是每个像素占几个字节
    • Red/Green/Blue/Alpha mask: “1”有效,可以让ARGB从几个字节中找到对应位置的值,可以重叠,RGB三个通道重叠就是灰度图像。
    • Line stride (bytes): 每行占多少字节
    • Start address: 图像起始地址
    • Read data as: 读数据的格式,根据图像的数据格式设置,int(32bit), short(16bit), char(8bit)
    • Start address: 图像起始地址
    • Read data as: 读数据的格式,根据图像的数据格式设置,int(32bit), short(16bit), char(8bit)

       设置完成后在Image窗口中点刷新按钮,即可刷新显示图像。

    测试结果

      预先存入的图像:
    step1
      经过FFT变换,实际数据已经超出灰度范围,无法显示正常的FFT频谱:
    step2
      IFFT变换后的图像:
    step3

    相关资源链接

    展开全文
  • FFT和iFFT,FFTiFFT,public classpublic class FFT { public static void fft(double pr[], double pi[], double fr[], double fi[]) { int N = pr.length; for (int i = 0; i < N; i++) { ...

    FFT和iFFT,FFTiFFT,public classpublic class FFT { public static void fft(double pr[], double pi[], double fr[], double fi[]) { int N = pr.length; for (int i = 0; i < N; i++) { fr[i] = 0; fi[i] = 0; for (int j = 0; j < N; j++) { fr[i] += pr[j] * Math.cos(2 * Math.PI * i * j / N) + pi[j] * Math.sin(2 * Math.PI * i * j / N); fi[i] += (-pr[j] * Math.sin(2 * Math.PI * i * j / N)) + pi[j] * Math.cos(2 * Math.PI * i * j / N); } } } public static void ifft(double fr[], double fi[], double pr[], double pi[]) { int N = pr.length; for (int i = 0; i < N; i++) { pr[i] = 0; pi[i] = 0; for (int j = 0; j < N; j++) { pr[i] += fr[j] * Math.cos(2 * Math.PI * i * j / N) / N - fi[j] * Math.sin(2 * Math.PI * i * j / N) / N; pi[i] += fr[j] * Math.sin(2 * Math.PI * i * j / N) / N + fi[j] * Math.cos(2 * Math.PI * i * j / N) / N; } } } public static int greater2p2(int n) { for (int i = 1;; i++) { if (n < Math.pow(2, i)) { return (int) Math.pow(2, i); } } } public static void main(String[] args) { double pr[] = { 1, 2, 3, 4, 5 }; double pi[] = { 0, 0, 0, 0, 0 }; /*double fr[] = new double[5]; double fi[] = new double[5]; double pr1[] = new double[5]; double pi1[] = new double[5]; fft(pr, pi, fr, fi); for (int i = 0; i < pr.length; i++) { System.out.printf("%3.3f %3.3f", fr[i], fi[i]); System.out.println(); } System.out.println(); ifft(fr, fi, pr1, pi1); for (int i = 0; i < fr.length; i++) { System.out.printf("%3.3f %3.3f", pr1[i], pi1[i]); System.out.println(); }*/ int KK = greater2p2(pr.length); double pr2[] = new double[KK]; double pi2[] = new double[KK]; double fr2[] = new double[KK]; double fi2[] = new double[KK]; for (int i = 0; i < KK; i++) { pr2[i] = 0; pi2[i] = 0; if (i < pr.length) { pr2[i] = pr[i]; pi2[i] = pi[i]; } } fft(pr2, pi2, fr2, fi2); for (int i = 0; i < KK; i++) { System.out.printf("%3.3f %3.3f", fr2[i], fi2[i]); System.out.println(); } }}//该片段来自于http://byrx.net

    展开全文
  • 一维的FFT和IFFT代码

    2017-01-13 22:40:58
    一维的FFTIFFT计算代码。需要配合有蝶形算法的书看懂代码。C++/C
  • c++ 实现FFT和IFFT

    2015-03-28 14:34:07
    用c++ 实现傅里叶变换FFT和傅里叶逆变换IFFT
  • 行业分类-设备装置-一种FFT和IFFT逆序数表的并行处理方法
  • 在MatLab中FFT和IFFT的互相转换

    万次阅读 多人点赞 2018-05-26 15:39:39
    其实IFFT的计算原理之一就是将频域(注意频域是复数)数据进行取共轭复数(虚部取反),然后再进行FFT变换,这样便将频域信号转换到时域。因为FFT变换的结果是复数,所以从频域进行FFT变换过来的结果也是复数,而...
  • 本章主要讲解fftifft和fftshift在matlab上的实现。 目录 第28章 FFT和IFFT的Matlab实现(幅频响应和相频响应) 28.1 初学者重要提示 28.2 Matlab的FFT函数 28.2.1 函数语法 28.2.2 函数定义 ...
  • matlab FFT 和IFFT

    千次阅读 2019-11-25 14:43:37
    代码: fs=100;N=128; n=0:N-1;t=n/fs; x=sin(2*pi*40*t)+sin(2*pi*15*t); subplot(221);plot(n,x,'b'); xlabel('时间/s');ylabel('x');...y=fft(x,N); mag=abs(y); f=n*fs/N; subplot(222);plo...
  • 基于MKL的FFT和IFFT Intel数学核心函数库(MKL)是一套高度优化、线程安全的数学例程、函数,面向高性能的工程、科学与财务应用。英特尔 MKL 的集群版本包括 ScaLAPACK 与分布式内存快速傅立叶转换,并提供了线性...
  • tid=94547 ...本章主要讲解fftifft和fftshift在matlab上的实现。 目录 第28章 FFT和IFFT的Matlab实现(幅频响应和相频响应) 28.1 初学者重要提示 28.2 Matlab的FFT函数 28.2.1 函数语法 28.2.2...
  • FFT和IFFT的MATLAB实现代码

    热门讨论 2013-06-01 15:23:11
    快速傅里叶变换(FFT和IFFT的MATLAB实现代码,编成了MATLAB函数形式,可以直接进行调用。便于大家学习研究。
  • 在GPU下做fft和Ifft----pycuda

    千次阅读 2017-09-10 12:55:32
    1.调用keikna库 keikna库中有fft,所以为了减小任务量我就调用keikan的fft的库来完成。...2.介绍FFT和IFFT的实现 对于二维的傅里叶变换的实现,冈萨雷斯《数字图像处理》有详细的介绍。 通过对这两个
  • 本章主要讲解fftifft和fftshift在matlab上的实现。 目录 第28章 FFT和IFFT的Matlab实现(幅频响应和相频响应) 28.1 初学者重要提示 28.2 Matlab的FFT函数 28.2.1 函数语法 28.2.2 函数定义 28...
  • 自己绘制一段正弦函数并在时域中绘出,进行FFT和IFFT变换验证算法程序的正确性,适合初学者,或为频谱分析系统做准备条件
  • 关于OFDM中的FFT和IFFT

    万次阅读 2013-08-27 15:48:13
    1. 正经的FFT和IFFT就是像MATLAB那样,FFT完的能量会变大。(至于为啥,需要详细研究)   2. OFDM系统中为了使得时域频域的能量一致,在做fft 的时候除以sqrt(N)。在做ifft 的时候乘以sqrt(N)。 但是做理想...
  • 我们一般意义上学习的FFT都是基于的,即FFT中的单位根我们取的是,但是在某些情况下我们需要上的FFT和IFFT变换。 1、直接想到的思路是把的根替换成的根。 解法:的根可以使用的2n个根中的奇数次根得到,即,但是...
  • MKL的FFT和IFFT实现 MKL是Intel公司推出的一项数学库,其功能主要是用于加速矩阵运算等。最近的工作中接触到了MKL。 但你以为MKL除了加速处理矩阵就啥也不会了么? 非也!它甚至可以进行快速傅里叶及其逆运算!简直...
  • 计算FFT和IFFT

    2009-07-02 00:17:17
    calculates discrete Fourier transform
  • 本次实验中在Microsoft Visual Studio 2010环境下编写,实现FFT和IFFT,并用MATLAB编写显示的结果,两者相对比,进行验证。 #include “stdafx.h” #include #include<math.h> #include const double pi=3....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,416
精华内容 2,966
关键字:

fft和ifft