傅里叶逆变换_傅里叶逆变换常用公式 - CSDN
精华内容
参与话题
  • 傅立叶变换和逆变换

    万次阅读 2019-10-08 15:49:16
    参考 https://blog.csdn.net/Eastmount/article/details/89645301 ... 1.cv2.dft(进行傅里叶变化) cv2.dft(img, cv2.DFT_COMPLEX_OUTPUT) 进行傅里叶变化 参数说明: img表示输入的图片, ...

    参考
    https://blog.csdn.net/Eastmount/article/details/89645301
    https://www.cnblogs.com/my-love-is-python/p/10406038.html
    1.cv2.dft(进行傅里叶变化)
    cv2.dft(img, cv2.DFT_COMPLEX_OUTPUT) 进行傅里叶变化
    参数说明: img表示输入的图片, cv2.DFT_COMPLEX_OUTPUT表示进行傅里叶变化的方法

    2.np.fft.fftshift(将低频移动到图像的中心)
    np.fft.fftshift(img) 将图像中的低频部分移动到图像的中心
    参数说明:img表示输入的图片

    3.cv2.magnitude(计算矩阵的加和平方根)
    cv2.magnitude(x, y) 将sqrt(x^2 + y^2) 计算矩阵维度的平方根
    参数说明:需要进行x和y平方的数

    4.np.fft.ifftshift(将低频和高频移动到原来位置)
    np.fft.ifftshift(img) # 进图像的低频和高频部分移动到图像原来的位置
    参数说明:img表示输入的图片

    5.cv2.idft(傅里叶逆变换)
    cv2.idft(img) # 进行傅里叶的逆变化
    参数说明:img表示经过傅里叶变化后的图片

    傅里叶变化:将图像从空间域转换为频率域, 下面是傅里叶变化的公式
    在这里插入图片描述在这里插入图片描述对应于频率的方向,我们可以看出红色那条线的频率最小,蓝色线的频率最大, 高频指变化剧烈的灰度分量,即图像边界的地方, 低频指变换缓慢的灰度分量。
    在这里插入图片描述构建出的傅里叶变化的图片,将低频移到中间位置, 通常呈现中间亮,周围暗,是因为对于低频而言,波动较大,比如红色那条线,因此呈现亮,对于高频而言,波动较小,比如蓝色那条线,因此呈现暗
    代码:

    第一步:载入图片

    第二步:使用np.float32进行格式转换

    第三步:使用cv2.dft进行傅里叶变化

    第四步:使用np.fft.shiftfft将低频转移到中间位置

    第五步:使用cv2.magnitude将实部和虚部投影到空间域

    第六步:进行作图操作

    # -*- coding: utf-8 -*-
    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    # 第一步读取图片
    img = cv2.imread('lena.jpg', 0)
    # 第二步:进行float32形式转换
    float32_img = np.float32(img)
    # 第三步: 使用cv2.dft进行傅里叶变化
    dft_img = cv2.dft(float32_img, flags=cv2.DFT_COMPLEX_OUTPUT)
    # 第四步:使用np.fft.shiftfft()将变化后的图像的低频转移到中心位置
    dft_img_ce = np.fft.fftshift(dft_img)
    # 第五步:使用cv2.magnitude将实部和虚部转换为实部,乘以20是为了使得结果更大
    img_dft = 20 * np.log(cv2.magnitude(dft_img_ce[:, :, 0], dft_img_ce[:, :, 1]))
    # 第六步:进行画图操作
    plt.subplot(121)
    plt.imshow(img, cmap='gray')
    plt.subplot(122)
    plt.imshow(img_dft, cmap='gray')
    plt.show()
    

    在这里插入图片描述滤波器

    傅里叶变换的目的并不是为了观察图像的频率分布(至少不是最终目的),更多情况下是为了对频率进行过滤,通过修改频率以达到图像增强、图像去噪、边缘检测、特征提取、压缩加密等目的。
    过滤的方法一般有三种:低通(Low-pass)、高通(High-pass)、带通(Band-pass)。所谓低通就是保留图像中的低频成分,过滤高频成分,可以把过滤器想象成一张渔网,想要低通过滤器,就是将高频区域的信号全部拉黑,而低频区域全部保留。

    低通滤波器

    只保留低频,即进行低通滤波,因为高频表示是一些细节,即图像的轮廓和边缘,失去了高频部分,图像就容易变得模糊

    代码:

    第一步:读取图片

    第二步:np.float32进行类型转换

    第三步:使用cv2.dft进行傅里叶变化

    第四步:使用np.fft.fftshift 将低频部分转换到图像的中心

    第五步:构造掩模,使得掩模的中心位置为1,边缘位置为0

    第六步:将掩模与傅里叶变换后的图像结合,只保留中心部分的低频位置

    第七步:使用np.fft.ifftshift将低频部分转移回图像的原先位置

    第八步:使用cv2.idft进行傅里叶的反转换

    第九步:使用cv2.magnitude将图像的实部和虚部转换为空间域内

    第十步:进行作图操作

    # -*- coding: utf-8 -*-
    import cv2 as cv
    import numpy as np
    from matplotlib import pyplot as plt
    
    # 第一步读入图片
    img = cv2.imread('test.jpg', 0)
    # 第二步:进行数据类型转换
    img_float = np.float32(img)
    # 第三步:使用cv2.dft进行傅里叶变化
    dft = cv2.dft(img_float, flags=cv2.DFT_COMPLEX_OUTPUT)
    # 第四步:使用np.fft.fftshift将低频转移到图像中心
    dft_center = np.fft.fftshift(dft)
    # 第五步:定义掩模:生成的掩模中间为1周围为0
    crow, ccol = int(img.shape[0] / 2), int(img.shape[1] / 2) # 求得图像的中心点位置
    mask = np.zeros((img.shape[0], img.shape[1], 2), np.uint8)
    mask[crow-30:crow+30, ccol-30:ccol+30] = 1
    
    # 第六步:将掩模与傅里叶变化后图像相乘,保留中间部分
    mask_img = dft_center * mask
    
    # 第七步:使用np.fft.ifftshift(将低频移动到原来的位置
    img_idf = np.fft.ifftshift(mask_img)
    
    # 第八步:使用cv2.idft进行傅里叶的反变化
    img_idf = cv2.idft(img_idf)
    
    # 第九步:使用cv2.magnitude转化为空间域内
    img_idf = cv2.magnitude(img_idf[:, :, 0], img_idf[:, :, 1])
    
    # 第十步:进行绘图操作
    plt.subplot(121)
    plt.imshow(img, cmap='gray')
    plt.subplot(122)
    plt.imshow(img_idf, cmap='gray')
    plt.show()
    

    高通滤波器
    高通滤波器是指通过高频的滤波器,衰减低频而通过高频,常用于增强尖锐的细节,但会导致图像的对比度会降低。该滤波器将检测图像的某个区域,根据像素与周围像素的差值来提升像素的亮度。通过傅立叶np.fft.fftshift(),将图像的低频部分移动到图像的中心位置。然后,通过高通滤波器覆盖掉中心低频部分,将255两点变换为0,同时保留高频部分。

    # -*- coding: utf-8 -*-
    import cv2 as cv
    import numpy as np
    from matplotlib import pyplot as plt
    
    #读取图像
    img = cv.imread('test.png', 0)
    
    #傅里叶变换
    f = np.fft.fft2(img)
    fshift = np.fft.fftshift(f)
    
    #设置高通滤波器
    rows, cols = img.shape
    crow,ccol = int(rows/2), int(cols/2)
    fshift[crow-30:crow+30, ccol-30:ccol+30] = 0
    
    #傅里叶逆变换
    ishift = np.fft.ifftshift(fshift)
    iimg = np.fft.ifft2(ishift)
    iimg = np.abs(iimg)
    
    #显示原始图像和高通滤波处理图像
    plt.subplot(121), plt.imshow(img, 'gray'), plt.title('Original Image')
    plt.axis('off')
    plt.subplot(122), plt.imshow(iimg, 'gray'), plt.title('Result Image')
    plt.axis('off')
    plt.show()
    
    

    在这里插入图片描述另为一种写法:

    # -*- coding: utf-8 -*-
    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    
    # 第一步读入图片
    img = cv2.imread('test.jpg', 0)
    # 第二步:进行数据类型转换
    img_float = np.float32(img)
    # 第三步:使用cv2.dft进行傅里叶变化
    dft = cv2.dft(img_float, flags=cv2.DFT_COMPLEX_OUTPUT)
    # 第四步:使用np.fft.fftshift将低频转移到图像中心
    dft_center = np.fft.fftshift(dft)
    # 第五步:定义掩模:生成的掩模中间为0周围为1
    crow, ccol = int(img.shape[0] / 2), int(img.shape[1] / 2) # 求得图像的中心点位置
    mask = np.ones((img.shape[0], img.shape[1], 2), np.uint8)
    mask[crow-30:crow+30, ccol-30:ccol+30] = 0
    
    # 第六步:将掩模与傅里叶变化后图像相乘,保留中间部分
    mask_img = dft_center * mask
    
    # 第七步:使用np.fft.ifftshift(将低频移动到原来的位置
    img_idf = np.fft.ifftshift(mask_img)
    
    # 第八步:使用cv2.idft进行傅里叶的反变化
    img_idf = cv2.idft(img_idf)
    
    # 第九步:使用cv2.magnitude转化为空间域内
    img_idf = cv2.magnitude(img_idf[:, :, 0], img_idf[:, :, 1])
    
    # 第十步:进行绘图操作
    plt.subplot(121)
    plt.imshow(img, cmap='gray')
    plt.subplot(122)
    plt.imshow(img_idf, cmap='gray')
    plt.show()
    
    展开全文
  • 多项式表示法与卷积 多项式有两种表示方法 系数表示法 点值表示法 系数表示法 就是最普通的表示方法,如 f(x)=a0x0+a1x1+a2x2+......+an−1xn−1 f(x) = a_0x^0 + a_1x^1 + a_2x^2 + .........f(x)=a0​x0+a1​x1+a2...

    多项式表示法与卷积

    多项式有两种表示方法

    • 系数表示法
    • 点值表示法

    系数表示法
    就是最普通的表示方法,如
    f(x)=a0x0+a1x1+a2x2+......+an1xn1 f(x) = a_0x^0 + a_1x^1 + a_2x^2 + ...... + a_{n-1}x^{n-1} 则表示为 f(x)={a0,a1,a2,......,an1}f(x) = \{a_0, a_1, a_2, ......, a_{n-1}\}


    点值表示法
    平面坐标系上的来描述多项式的一种表示方法
    对于一个多项式来说有 n 项,则可以通过 n 对 {x,y}\{x, y\} 点对来进行系数求解,即对于上述式子来说还有
    f(x)={(x0,f(x0)),(x1,f(x1)),(x2,f(x2)),......,(xn1,f(xn1))} f(x) = \{(x_0, f(x_0)), (x_1, f(x_1)), (x_2, f(x_2)), ......, (x_{n-1}, f(x_{n-1}))\} 这种表达方式


    卷积
    就是多项式相乘,对于2种不同的多项式表示法来说,做卷积的时间复杂度会不同

    • 系数表示法,由于每2个系数之间都需要做一次处理,所以时间复杂度需要 O(n2)
    • 点值表示法,只要对应的两个点的 f(xi)f(x_i) 相乘即可,所以时间复杂度只有 O(n)

    但是将系数表示法转换成点值表示法,如果用朴素的转换方法,也需要 O(n2) 的时间复杂度,所以采取DFT通过分治法来做

     

    离散傅里叶变换(DFT)

    傅里叶变换中所有的 n 都为 2 的整数次幂
    我们的目标是将系数表示法转换成点值表示法,如果随机选取 nn 个点,再计算出它对应的 f(x)f(x),时间复杂度为 O(n2),因为对每个点都需要求 nnxi,i[0,n1]x^i, i∈[0, n - 1]

    傅里叶选取了一些点,这些点满足它们的若干次方 = 1,这样可以使得带入之后不需要做这么多运算(但是时间复杂度仍是O(n2))

    这些点都在复数平面直角坐标系里
    在这里插入图片描述
    圆上所有的点都满足傅里叶的要求
    我们假设将其 n=8n = 8 等分,则会得到:
    在这里插入图片描述
    (1,0)(1, 0) 按照逆时针进行编号,对于编号为 k 的点,记为 wnkw_n^k,称为 nn 次单位根,且
    wnk=coskn2π+isinkn2π w_n^k = \cos{\frac{k}{n}2\pi} + i\sin{\frac{k}{n}2\pi}


    单位根的性质

    • wnk=w2n2kw_n^k = w_{2n}^{2k},2可以替换为任意整数
    • wnk+n2w_n^{k+\frac{n}{2}} = wnk-w_n^k
    • wn0=wnnw_n^0 = w_n^n
    • 对任意 k[0,n]k∈[0, n],有 Σj=0n1(wnk)j=0\Sigma_{j=0}^{n-1}(w_n^k)^j = 0

            

    快速傅里叶变换(FFT)


    简介

    虽然通过DFT选出了便于计算的点,但是时间复杂度仍为 O(n2),但是通过分析多项式可以得到用分治法处理这些点的方式。
    假设有
    A(x)=Σj=0n1aixi=a0+a1x1+a2x2+......+an1xn1 A(x) = \Sigma_{j=0}^{n-1}a_ix^i = a_0 + a_1x^1 + a_2x^2 + ...... + a_{n-1}x^{n-1} 现在将 A(x)A(x)xx 的下标奇偶性将 A(x)A(x) 分成两部分
    A(x)=(a0+a2x2+a4x4+......+an2xn2)+x(a1+a3x2+......+an1xn2) A(x) = (a_0 + a_2x^2 + a_4x^4 + ...... + a_{n-2}x^{n-2}) + x(a_1 + a_3x^2 + ...... + a_{n-1}x^{n-2}) 所以有
    A(x)=A1(x2)+xA2(x2) A(x) = A_1(x^2) + xA_2(x^2)
    k<n2k < \frac{n}{2} 的时候,将wnkw_n^k 作为 xx 带入 A(x)A(x)
    A(wnk)=A1((wnk)2)+xA2((wnk)2)=A1(wn2k)+xA2(wn2k)=A1(wn2k)+wnkA2(wn2k) \begin {aligned} A(w_n^k) &= A_1((w_n^k)^2) + xA_2((w_n^k)^2) \\ &= A_1(w_n^{2k}) + xA_2(w_n^{2k}) \\ &=A_1(w_{\frac{n}{2}}^k) + w_n^kA_2(w_{\frac{n}{2}}^k) \end {aligned}
    所以当取后半部分的时候,有x=wnk+n2x = w_n^{k+\frac{n}{2}}
    A(wnk+n2)=A1((wnk+n2)2)+xA2((wnk+n2)2)=A1(wn2kwnn)+wnk+n2A2(wn2kwnn)=A1(wn2k)wnkA2(wn2k)=A1(wn2k)wnkA2(wn2k) \begin {aligned} A(w_n^{k+\frac{n}{2}}) &= A_1((w_n^{k+\frac{n}{2}})^2) + xA_2((w_n^{k+\frac{n}{2}})^2) \\ &= A_1(w_n^{2k}w_n^n) + w_n^{k+\frac{n}{2}}A_2(w_n^{2k}w_n^n) \\ &= A_1(w_n^{2k}) - w_n^kA_2(w_n^{2k}) \\ &=A_1(w_{\frac{n}{2}}^k) - w_n^kA_2(w_{\frac{n}{2}}^k) \end {aligned}
    可以看到对于 k=n2k = \frac{n}{2} 的中介线来说,A(wnk)A(w_n^k)A(wnk+n2)A(w_n^{k+\frac{n}{2}}) 都可以通过 wn2kw_{\frac{n}{2}}^k 进行计算

    这样时间复杂度就降为了 O(nlog2n)O(nlog_2n)
            


    蝴蝶变换 Cooley-Turkey

    刚提到对于当前层确定的位置 ii,可以通过下一层的两个值对当前值进行更新

    开始肯定想着用递归的方式进行操作,但是有更为便捷的二进制反转方法

    • 以下 kk 均为 aka_k 中的 kk
    kk 0 1 2 3 4 5 6 7
    二进制 000 001 010 011 100 101 110 111

    一次变换之后,将偶数下标放在一起、奇数下标放在一起,重新变化成以下数列(前4个为一组,后4个为一组)

    kk 0 2 4 6 1 3 5 7

    二次变换之后,将两组的奇次项、偶次项再分开,变成以下数列(2、2、2、2分组)

    kk 0 4 2 6 1 5 3 7

    三次变换之后,已经变成单独的一个一个的了,再观察他们的二进制,和原始序列k作比较

    原始 kk 0 1 2 3 4 5 6 7
    二进制 000 001 010 011 100 101 110 111
    kk 0 4 2 6 1 5 3 7
    二进制 000 100 010 110 001 101 011 111

    这样的对比可以很容易看出,对于原始序列和变换之后的序列来说,他们就是对二进制做了一个反转操作,即 1 (001) 变成了 4 (100)

    那如果我们在最开始的时候,就将序列做了二进制反转操作,就可以从前往后依次顺序运算,而不需要使用递归的方式

    以刚刚的序列为例子

    反转后的 kk 0 4 2 6 1 5 3 7
    计算内容 A(w10)=a0w10A(w_1^0) = a_0w_1^0 A(w14)A(w_1^4) A(w12)A(w_1^2) A(w16)A(w_1^6) A(w11)A(w_1^1) A(w15)A(w_1^5) A(w13)A(w_1^3) A(w17)=a7w17A(w_1^7) = a_7w_1^7

    第一次合并

    kk 0 4 2 6 1 5 3 7
    计算内容 A(w20)=A1(w10)+w20A2(w14)A(w_2^0) = A_1(w_1^0) + w_2^0A_2(w_1^4) A(w24)=A1(w10)w20A2(w14)A(w_2^4) = A_1(w_1^0) - w_2^0A_2(w_1^4) A(w22)A(w_2^2) A(w26)A(w_2^6) A(w21)A(w_2^1) A(w25)A(w_2^5) A(w23)A(w_2^3) A(w27)A(w_2^7)

    这里的 A1(w10)A_1(w_1^0) 就对应了第一个表中的 A(w10)A(w_1^0)
    k=4k = 4 的时候取值为 w20w_2^0 是因为在 k>n2k > \frac{n}{2} 的时候,xx 取的是 wnk+n2w_n^{k + \frac{n}{2}},所以 kk 也要相应的减去 n2\frac{n}{2}

    第二次合并

    kk 0 2 4 6 1 3 5 7
    计算内容 A(w40)=A1(w20)+w40A2(w24)A(w_4^0) = A_1(w_2^0) + w_4^0A_2(w_2^4) A(w42)=A1(w20)w40A2(w24)A(w_4^2) = A_1(w_2^0) - w_4^0A_2(w_2^4) A(w44)A(w_4^4) A(w46)A(w_4^6) A(w41)A(w_4^1) A(w43)A(w_4^3) A(w45)A(w_4^5) A(w47)A(w_4^7)

    这里的 A1(w20)A_1(w_2^0) 就对应了第二个表中的 A(w20)A(w_2^0)

    第三次合并

    kk 0 1 2 3 4 5 6 7
    计算内容 A(w80)=A1(w40)+w80A2(w42)A(w_8^0) = A_1(w_4^0) + w_8^0A_2(w_4^2) A(w81)=A1(w40)w80A2(w42)A(w_8^1) = A_1(w_4^0) - w_8^0A_2(w_4^2) A(w82)A(w_8^2) A(w83)A(w_8^3) A(w84)A(w_8^4) A(w85)A(w_8^5) A(w86)A(w_8^6) A(w87)A(w_8^7)

    所以在最后一次合并之后就得到了所有的 A(x)A(x)
    成功的从系数表示法转换成点值表示法!
            

    逆快速傅里叶变换(IFFT)

    当然我们从系数表示法转换成点值表示法只是为了计算卷积的时候减小时间复杂度,但最后对我们有帮助、便于分析的仍然是系数表示法

    所以在对点值表示法的多项式进行卷积之后,仍需要将其再次转换回系数表示法

    这种转换方式称为逆快速傅里叶变换

    那等于说我们给出了 nn 个线性方程组,然后需要对其进行求解
    a0(wn0)0+a1(wn0)1+......+an1(wn0)n1=A(wn0)a0(wn1)0+a1(wn1)1+......+an1(wn1)n1=A(wn1)......a0(wnn1)0+a1(wnn1)1+......+an1(wnn1)n1=A(wnn1) \begin{aligned} a_0(w_n^0)^0 + a_1(w_n^0)^1 + ...... + a_{n-1}(w_n^0)^{n-1} &= A(w_n^0) \\ a_0(w_n^1)^0 + a_1(w_n^1)^1 + ...... + a_{n-1}(w_n^1)^{n-1} &= A(w_n^1) \\ ......\\ a_0(w_n^{n-1})^0 + a_1(w_n^{n-1})^1 + ...... + a_{n-1}(w_n^{n-1})^{n-1} &= A(w_n^{n-1}) \\ \end{aligned}
    将其写成矩阵的形式有
    [(wn0)0(wn0)1...(wn0)n1(wn1)0(wn1)1...(wn0)n1......(wnn1)0(wnn1)1...(wnn1)n1][a0a1...an1]=[A(wn0)A(wn1)...A(wnn1)] \left[ \begin{matrix} (w_n^0)^0 & (w_n^0)^1 & ... & (w_n^0)^{n-1} \\ (w_n^1)^0 & (w_n^1)^1 & ... & (w_n^0)^{n-1} \\ ...... \\ (w_n^{n-1})^0 & (w_n^{n-1})^1 & ... & (w_n^{n-1})^{n-1} \end{matrix} \right] \left[ \begin{matrix} a_0 & \\ a_1 & \\ ...\\ a_{n-1} & \end{matrix} \right] = \left[ \begin{matrix} A(w_n^0) \\ A(w_n^1) \\ ...\\ A(w_n^{n-1}) \end{matrix} \right]
    定义第一个矩阵为D、第二个矩阵为V、第三个矩阵为E
    按照矩阵乘法,有
    eij=Σk=0n1dikvkj=Σk=0n1wnikwnkj=Σk=0n1wnk(ji) \begin{aligned} e_{ij} & = \Sigma_{k=0}^{n-1}d_{ik}v_{kj} \\ &= \Sigma_{k=0}^{n-1}w_n^{-ik}w_n^{kj} \\ &=\Sigma_{k=0}^{n-1}w_n^{k(j-i)} \end{aligned}
    所以有
    eij={ni=j0ij e_{ij} = \begin{cases} & n & & i = j \\ & 0 & & i ≠ j \\ \end{cases}
    iji≠j 的时候可以根据等比序列求和公式得到和为0

    由此可知,In=1nEI_n = \frac{1}{n}EInI_n是一个 n×n 的单位矩阵

    所以有 1nD=V1\frac{1}{n}D = V^{-1},∵ EE 和单位矩阵扯上联系了嘛

    那么其实IFFT就是一个变换了一点点的FFT
    如果说FFT用公式来表示是
    X(k)=Σn=0N1x(n)wNkn X(k) = \Sigma_{n=0}^{N-1}x(n)w_N^{kn} 则IFFT用公式来表示就是
    x(n)=1NΣn=0N1X(k)wnkn x(n) = \frac{1}{N}\Sigma_{n=0}^{N-1}X(k)w_n^{-kn}
    单位根取个负然后乘个 1N\frac{1}{N}

    那总结一下FFT和IFFT的作用就是减少卷积运算的时间复杂度www
            

    其他

    • 其实是为了学习NTT
    • 然而NTT还没看懂
    • 先总结出一份FFT和IFFT的来
    • NTT的尽快出吧QuQ
    展开全文
  • f(t)的傅里叶变换F(w)=∫ f(t) *e(-iwt)dt ,由于(1,sinwx,coswx,sin2wx,cos2wx,... sinnwx,cosnwx,....)是一组正交函数,傅里叶变换从公式来看就是内积,只有f(t)中含有对应w分 量才能有内积不为零,有对应的...

    f(t)的傅里叶变换F(w)=∫  f(t) *e(-iwt)dt ,由于(1,sinwx,coswx,sin2wx,cos2wx,... sinnwx,cosnwx,....)是一组正交函数,傅里叶变换从公式来看就是内积,只有f(t)中含有对应w分

    量才能有内积不为零,有对应的频谱。可以理解为在f(t)区间的负无穷到正无穷的内积就是f(t)在e(-jwt)上的投影量。整个区间求积分,就是在负无穷到正无穷对应的频谱累加求和,大笑。f(t)在每个频率的分量就求出来了。


    f(t)的傅里叶逆变换F(t)=∫  f(w) *e(iwt)dw,f(w)与e(iwt)内积,只有在t时刻才不为零,叠加的结果就是f(t)在t时刻对应的值,这就回到信号叠加的最初时域。


    对信号进行傅里叶变换后进行傅里叶逆变换是没有意义。我们需要变换后,将不需要的信号进行滤波处理,然后进行傅里叶逆变换,得到需要的有用时间域信号。

    优点:可以很方便得到信号的频率谱。

    缺点:由于积分是在整个区间的叠加,傅里叶逆变换后,不能得出频率对应的时间。

    展开全文
  • //快速傅里叶变换 void fft2Image(InputArray _src, OutputArray _dst) { //得到Mat类型 Mat src = _src.getMat(); //判断位深 CV_Assert(src.type() == CV_32FC1 || src.type() == CV_64FC1); CV_Assert(src....
    //快速傅里叶变换
    void fft2Image(InputArray _src, OutputArray _dst)
    {
    	//得到Mat类型
    	Mat src = _src.getMat();
    	//判断位深
    	CV_Assert(src.type() == CV_32FC1 || src.type() == CV_64FC1);
    	CV_Assert(src.channels() == 1 || src.channels() == 2);
    	int rows = src.rows;
    	int cols = src.cols;
    	//为了进行快速的傅里叶变换,我们经行和列的扩充,找到最合适扩充值
    	Mat padded;
    	int rPadded = getOptimalDFTSize(rows);
    	int cPadded = getOptimalDFTSize(cols);
    	//进行边缘扩充,扩充值为零
    	copyMakeBorder(src, padded, 0, rPadded - rows, 0, cPadded - cols, BORDER_CONSTANT, Scalar::all(0));
    	//快速的傅里叶变换(双通道:用于存储实部 和 虚部)
    	dft(padded, _dst, DFT_COMPLEX_OUTPUT);
    }
    int main()
    {
    	//输入图像矩阵
    	Mat img = imread("lena.jpg", 0);
    	if (!img.data)
    		return -1;
    	//数据类型转换:转换为浮点型
    	Mat fImg;
    	img.convertTo(fImg, CV_64FC1);
    	//快速傅里叶变换
    	Mat fft2;
    	fft2Image(fImg, fft2);
    	//傅里叶逆变换
    	Mat image;
    	cv::dft(fft2, image, DFT_INVERSE + DFT_REAL_OUTPUT + DFT_SCALE);
    	//裁剪傅里叶逆变换
    	image = image(Rect(0, 0, img.cols, img.rows));
            image.convertTo(image, CV_8UC1);
    	return 0;
    }

        原图:

         

      复矩阵:

     

      逆变换后的图:

    展开全文
  • 傅里叶逆变换

    千次阅读 2019-08-01 08:11:47
  • 卷积定理:函数卷积的傅里叶变化是函数傅里叶变化的乘积,即对于函数f(t)与h(t)两者的卷积是其函数傅里叶变换乘积的逆变换: 类比到Graph上并把傅里叶变换的定义带入,f与卷积核h在Graph上的卷积可以由下面步骤得到...
  • 我们先回忆一下DFT F––[m]=Ff––––[m]=∑k=0N−1f––[k]e−2πimkN(1)(1)F_[m]=Ff_[m]=∑k=0N−1f_[k]e−2πimkN\underline{F}[m] = \underline{{\scr F}f}[m] = \sum_{k=0}^{N-1} \underline{f}[k]e^{-2\pi ...
  • 积分线性变换可以将信号或图像在更适合的域内表达,并且使得解决相关问题更容易,在图像分析中最常用的积分显示变换是傅里叶变换、离散余弦变换与小波变换。...逆变换为 相应地,对于下标从0开始的离...
  • 傅里叶变换和傅里叶逆变换的C++代码,亲测,有详细的解释。 有问题可以留言。
  • 快速傅里叶逆变换IFFT算法的C++实现

    热门讨论 2020-07-30 23:33:25
    快速傅里叶逆变换 IFFT算法 C++实现 包括TFFT,整序
  • C++离散傅里叶逆变换 一、序言: 该教程承接上文的离散傅里叶变换,用于进行离散傅里叶逆变换。 二、设计目标 对复数数组进行离散傅里叶逆变换,并生成可供使用的图像类。 三、详细步骤 输入:经傅里叶...
  • 短时傅里叶逆变换

    2020-07-28 23:32:22
    用MATLAB实现的短时傅里叶逆变换,可以直接用来处理数据。
  • 【经典算法实现 40】一维傅里叶变换 及 逆变换代码实现一、一维傅里叶变换 及 其逆变换二、C代码实现 一、一维傅里叶变换 及 其逆变换 一维傅里叶变换: F(u)=∑M=0M−1f(x)e−jux2πM,u=0,1,2,⋯ ,M−1F(u) = \...
  • ifft 快速傅里叶逆变换(Matlab)

    千次阅读 2020-04-22 21:49:34
    1.语法:         X = ifft(Y)         X = ifft(Y,n)         ......
  • 图像傅里叶变换与逆变换OpenCV实现

    千次阅读 2018-03-13 21:10:57
    傅里叶逆变换->读取图像 int main() { cv::Mat img = cv::imread("lena.jpg"); DFTtransform(img); cv::imshow("DFT img", img); cv::waitKey(); system("pause"); ...
  • 【经典算法实现 42】一维傅里叶变换 及 逆变换代码实现 二维傅里叶变换: F(u,v)=∑M=0M−1f(x,y)e−j(ux+vy)2πM,u=0,1,2,⋯ ,M−1F(u,v) = \sum_{M=0}^{M-1} f(x,y) e^{-j (ux+vy) \frac{2\pi} M}, u=0,1,2,\...
  • 实数矩阵f注意:傅里叶逆变换理论上是实数矩阵,但由于计算误差所以造成复数矩阵,可求实部、虚部平方和开根号,或直接取实部#include<opencv2/core/core.hpp> #include<opencv2/highg...
  • 快速傅里叶变换和逆变换的C++实现

    千次阅读 2016-01-08 04:03:21
    近来做一个大整数乘法的ACM题目时候一直被运行超时所困扰,上网搜索下后发现需要用到快速傅里叶变换和逆变换的算法来实现大整数乘法,才能把复杂度降到LogN * N. 看了一个星期的资料, 吃透了算法才把完整的代码敲出来...
  • 本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的、不同方法的处理,以达到对图像进行去噪、锐化等一系列的操作。...
  • 语音学习笔记3------matlab实现傅里叶变换ifft()函数

    万次阅读 多人点赞 2016-12-22 15:09:08
    上一篇博客我们了解到,可以将一个语音信号傅里叶变换,那么,我们能不能逆向推回去呢,用已经存在的数据进行傅里叶逆变换?答案是肯定的。下面就讲讲如何实现傅里叶的反变换。 傅里叶变换的函数是ifft();但是ifft...
1 2 3 4 5 ... 20
收藏数 7,277
精华内容 2,910
关键字:

傅里叶逆变换