merlinzjl

导航

傅里叶变换

傅里叶级数 => 傅里叶变换 => 离散傅里叶变换 推导

参考:https://www.zhihu.com/column/c_1299853366366543872

           https://www.matongxue.com/madocs/712/

傅里叶级数

 

傅里叶变换

 

 

总结: 傅里叶级数适用于周期为T的周期函数,对于非周期函数,我们可以看成是T趋向于无穷大时,这样我们就可以通过傅里叶级数得到傅里叶变换。

 

离散傅里叶变换DFT IDFT

 

快速傅里叶变换FFT

参考:https://www.cnblogs.com/liam-ji/p/11685568.html

对于序列:

       

 

 

 

所以对于快速傅里叶变换而言,当数据长度N为2的m次方时,运算最快。

但是如果都补到2的m次方,有些情况下就会造成内存严重浪费,在OpenCV中提供了获得最优长度的函数,但返回的长度并不是2的

m次方,而是2^a * 3^b *5^c这样的乘积的数,兼具了性能和内存。

openCV中提供了方法 getOptimalDFTSize来得到最优长度,该方法通过对预先生成的表进行二分查找,得到最优长度。

int cv::getOptimalDFTSize( int size0 )
{
    int a = 0, b = sizeof(optimalDFTSizeTab)/sizeof(optimalDFTSizeTab[0]) - 1;
    if( (unsigned)size0 >= (unsigned)optimalDFTSizeTab[b] )
        return -1;

    while( a < b )
    {
        int c = (a + b) >> 1;
        if( size0 <= optimalDFTSizeTab[c] )
            b = c;
        else
            a = c+1;
    }

    return optimalDFTSizeTab[b];
} 
optimalDFTSizeTab这个表就是由2^a * 3^b *5^c算出来的,其中丢弃了一些3的幂次项

 

posted on 2020-12-14 00:11  merlinzjl  阅读(281)  评论(0编辑  收藏  举报