精华内容
下载资源
问答
  • VS2010下实现的离散傅里叶变换离散傅里叶逆变化代码。
  • 接下来我们验证一下离散傅里叶逆变换的正确性 F − 1 F f ‾ [ n ] = 1 N ∑ m = 0 N − 1 F f ‾ [ m ] e 2 π i m n N = 1 N ∑ m = 0 N − 1 ∑ k = 0 N − 1 f ‾ [ k ] e − 2 π i m k N e 2 π i m n N = 1...

    我们先回忆一下DFT

    F ‾ [ m ] = F f ‾ [ m ] = ∑ k = 0 N − 1 f ‾ [ k ] e − 2 π i m k N (1) \underline{F}[m] = \underline{\mathscr{F}f}[m] = \sum_{k=0}^{N-1} \underline{f}[k]e^{-2\pi i\frac{mk}{N}}\tag1 F[m]=Ff[m]=k=0N1f[k]e2πiNmk(1)

    我们给出离散傅里叶逆变换

    F − 1 f ‾ [ m ] = 1 N ∑ k = 0 N − 1 f ‾ [ k ] e 2 π i m k N (2) \huge\underline{\mathscr{F}^{-1}f}[m] = \frac{1}{N} \sum_{k=0}^{N-1} \underline{f}[k]e^{2\pi i\frac{mk}{N}}\tag2 F1f[m]=N1k=0N1f[k]e2πiNmk(2)

    对于这个式子,我们最想问的问题是为什么它比连续傅里叶变换多了一个系数 1 N \frac{1}{N} N1


    为了解答这个问题,我们先改写一下DFT与inverse DFT

    我们定义向量 ω \omega ω 为:

    ω ‾ [ m ] = e 2 π i m N \underline{\omega}[m] = e^{2\pi i\frac{m}{N}} ω[m]=e2πiNm

    即,

    ω ‾ = ( 1 , e 2 π i 1 N , e 2 π i 2 N , … , e 2 π i N − 1 N ) (3) \huge\underline{\omega} = (1, e^{2\pi i\frac{1}{N}}, e^{2\pi i\frac{2}{N}}, \dots, e^{2\pi i\frac{N-1}{N}})\tag3 ω=(1,e2πiN1,e2πiN2,,e2πiNN1)(3)

    并将变量 k k k 写为 n n n,那么 ( 1 ) (1) (1) 式就可以改写为:

    F ‾ [ m ] = ∑ n = 0 N − 1 f ‾ [ n ] ω ‾ − n [ m ] \underline{F}[m] = \sum_{n=0}^{N-1} \underline{f}[n] \underline{\omega}^{-n}[m] F[m]=n=0N1f[n]ωn[m]

    或者更一般地( ( 2 ) (2) (2) 式同理),

    F f ‾ = ∑ n = 0 N − 1 f ‾ [ n ] ω ‾ − n (4) \huge\underline{\mathscr{F}f} = \sum_{n=0}^{N-1} \underline{f}[n] \underline{\omega}^{-n}\tag4 Ff=n=0N1f[n]ωn(4)

    F − 1 f ‾ = 1 N ∑ k = 0 N − 1 f ‾ [ n ] ω ‾ n (5) \huge\underline{\mathscr{F}^{-1}f} = \frac{1}{N} \sum_{k=0}^{N-1} \underline{f}[n] \underline{\omega}^{n}\tag5 F1f=N1k=0N1f[n]ωn(5)

    ω \omega ω可以看作是向量,也可以看作是离散复指数

    那么类比于连续傅里叶变换(傅里叶级数)中对复指数的讨论,离散复指数又有怎样的特点呢?

    对于 < w k , w l > <w^k, w^l> <wk,wl>

    < w k , w l > = ∑ n = 0 N − 1 w k [ n ] w l [ n ] ‾ = ∑ n = 0 N − 1 e 2 π i k n N e − 2 π i l n N = ∑ n = 0 N − 1 e 2 π i ( k − l ) n N = ∑ n = 0 N − 1 ( e 2 π i ( k − l ) N ) n (6) \begin{aligned} <w^k, w^l> &= \sum_{n=0}^{N-1} w^k[n] \overline{w^l[n]}\\ &= \sum_{n=0}^{N-1} e^{2\pi i\frac{kn}{N}} e^{-2\pi i\frac{ln}{N}}\\ &= \sum_{n=0}^{N-1} e^{2\pi i\frac{(k-l)n}{N}}\\ &= \sum_{n=0}^{N-1} \left( e^{2\pi i\frac{(k-l)}{N}} \right)^n\tag6 \end{aligned} <wk,wl>=n=0N1wk[n]wl[n]=n=0N1e2πiNkne2πiNln=n=0N1e2πiN(kl)n=n=0N1(e2πiN(kl))n(6)

    1. 我们来看看当 k ≠ l k\neq l k=l 时,即求离散复指数的内积。我们发现 ( 6 ) (6) (6) 式是一个等比数列的求和,因此利用等比数列求和公式,有

    < w k , w l > = 1 ⋅ ( 1 − ( e 2 π i ( k − l ) N ) N ) 1 − e 2 π i ( k − l ) N = 1 − e 2 π i ( k − l ) 1 − e 2 π i ( k − l ) N \begin{aligned} <w^k, w^l> &= \frac{1\cdot \left(1-\left( e^{2\pi i\frac{(k-l)}{N}} \right)^N\right)}{1 - e^{2\pi i\frac{(k-l)}{N}}}\\ &= \frac{1- e^{2\pi i (k-l)}}{1 - e^{2\pi i\frac{(k-l)}{N}}} \end{aligned} <wk,wl>=1e2πiN(kl)1(1(e2πiN(kl))N)=1e2πiN(kl)1e2πi(kl)

    显然当 k ≠ l k \neq l k=l 时,由于 k k k l l l均为整数,故 e 2 π i ( k − l ) = 1 e^{2\pi i (k-l)} = 1 e2πi(kl)=1,从而

    < w k , w l > = 0 , k ≠ l <w^k, w^l> = 0, k\neq l <wk,wl>=0,k=l

    1. 当$ k = l $时,即求离散复指数的模长。我们发现 ( 6 ) (6) (6) 式的每一项都为 1 1 1,因此

    < w k , w k > = ∑ n = 0 N − 1 1 = N <w^k, w^k> = \sum_{n=0}^{N-1} 1 = N <wk,wk>=n=0N11=N

    也可以写成

    ∣ ∣ w k ∣ ∣ 2 2 = N ||w^k||_2^2 = N wk22=N

    即离散复指数的长度为 N \sqrt{N} N

    证明到这里,我们就可以看出离散复指数和连续(或级数)复指数的一个很大的不同,在之前的文章中,我们说过,傅里叶变换相当于从一个标准正交坐标系映射到另一个标准正交坐标系的过程,是 o r t h o n o r m a l orthonormal orthonormal的;而DFT则不同,它的变换取决于取的采样点的数量,它是正交的但不是归一化的,是 o r t h o g o n a l orthogonal orthogonal的。


    接下来我们验证一下离散傅里叶逆变换的正确性

    F − 1 F f ‾ [ n ] = 1 N ∑ m = 0 N − 1 F f ‾ [ m ] e 2 π i m n N = 1 N ∑ m = 0 N − 1 ∑ k = 0 N − 1 f ‾ [ k ] e − 2 π i m k N e 2 π i m n N = 1 N ∑ k = 0 N − 1 f ‾ [ k ] ∑ m = 0 N − 1 ( e 2 π i n − k N ) m \begin{aligned} \underline{\mathscr{F}^{-1}\mathscr{F}f}[n] &=\frac{1}{N} \sum_{m=0}^{N-1} \underline{\mathscr{F}f}[m] e^{2\pi i\frac{mn}{N}} \\ & = \frac{1}{N} \sum_{m=0}^{N-1} \sum_{k=0}^{N-1} \underline{f}[k]e^{-2\pi i\frac{mk}{N}} e^{2\pi i\frac{mn}{N}} \\ & = \frac{1}{N} \sum_{k=0}^{N-1} \underline{f}[k] \sum_{m=0}^{N-1} \left( e^{2\pi i\frac{n-k}{N}} \right)^m\\ \end{aligned} F1Ff[n]=N1m=0N1Ff[m]e2πiNmn=N1m=0N1k=0N1f[k]e2πiNmke2πiNmn=N1k=0N1f[k]m=0N1(e2πiNnk)m

    根据前文证明的正交性可知,仅当 n = k n=k n=k ( e 2 π i n − k N ) m = 1 \left( e^{2\pi i\frac{n-k}{N}} \right)^m =1 (e2πiNnk)m=1,其余情况均为 0 0 0,故

    F − 1 F f ‾ [ n ] = 1 N f ‾ [ n ] ∑ m = 0 N − 1 1 = f ‾ [ n ] \begin{aligned} \underline{\mathscr{F}^{-1}\mathscr{F}f}[n] &= \frac{1}{N} \underline{f}[n] \sum_{m=0}^{N-1} 1 \\ &= \underline{f}[n] \end{aligned} F1Ff[n]=N1f[n]m=0N11=f[n]

    不难发现,正是因为离散复指数的模长为 N \sqrt N N ,才导致了离散傅里叶逆变换中出现了系数 N N N


    最后,我们应该把DFT的输入、输出都看作是周期为 N N N 的信号(或把它们看作进行了以 N N N 为周期的周期延拓的信号)

    简单证明一下:

    ω [ m + N ] ‾ = e 2 π i m + N N = e 2 π i m N = ω [ m ] ‾ \underline{\omega[m + N]} = e^{2\pi i \frac{m+N}{N}} = e^{2\pi i \frac{m}{N}} = \underline{\omega[m]} ω[m+N]=e2πiNm+N=e2πiNm=ω[m]

    F f [ m + N ] ‾ = ∑ n = 0 N − 1 f ‾ [ n ] ω [ m + N ] ‾ − n = ∑ n = 0 N − 1 f ‾ [ n ] ω [ m ] ‾ − n = F f [ m ] ‾ \underline{\mathscr{F}f[m+N]} = \sum_{n=0}^{N-1} \underline{f}[n] \underline{\omega[m+N]}^{-n} = \sum_{n=0}^{N-1} \underline{f}[n] \underline{\omega[m]}^{-n} = \underline{\mathscr{F}f[m]} Ff[m+N]=n=0N1f[n]ω[m+N]n=n=0N1f[n]ω[m]n=Ff[m]

    同理可证逆DFT

    因此, f ‾ \underline{f} f F f ‾ \underline{\mathscr{F}f} Ff都应被看作周期为 N N N的离散信号

    展开全文
  • 文章目录1. 定义2. 变换和处理3. 函数4. 实例演示例1:单频正弦信号(整数周期采样)例2:含有...这一篇来研究如何进行利用离散傅里叶逆变换(iDFT)从频谱中恢复时域信号。 离散傅里叶逆变换 (iDFT)的定义为: x(n)=i

    1. 定义

    上一篇研究了Matlab如何进行离散傅里叶变换DFT(快速傅里叶变换FFT)进行频谱分析。工程上我们还会遇到这样的问题:获取了信号的频谱,希望从信号的频谱来恢复时域信号。这一篇来研究如何进行利用离散傅里叶逆变换(iDFT)从频谱中恢复时域信号。
    离散傅里叶逆变换 (iDFT)的定义为:

    x ( n ) = i D F T [ X ( k ) ] = 1 N ∑ k = 0 N − 1 X ( k ) e j 2 π N n k x(n) = {\rm{iDFT}}[X(k)] = \frac{1}{N}\sum\limits_{k = 0}^{N - 1} {X(k){e^{j\frac{{2\pi }}{N}nk}}} x(n)=iDFT[X(k)]=N1k=0N1X(k)ejN2πnk, 0 ≤ n ≤ N − 1 0 \le n \le N-1 0nN1
    式中, x ( n ) x(n) x(n)为时域离散采样序列(通常为实数序列), N N N为时域离散采样序列 x ( n ) x(n) x(n)的长度, X ( k ) X(k) X(k)为频域离散采样序列(通常为复数序列)。

    也存在快速傅里叶逆变换(iFFT)来实现iDFT的快速算法,其主要作用也是减小计算量、节约计算资源、便于在线计算。

    2. 变换和处理

    Matlab软件自带ifft函数实现快速傅里叶逆变换算法,与上一篇DFT变换一样,要想从频谱恢复时域信号,也需要解决以下问题(建议与上一篇对应起来看):
    在这里插入图片描述

    a) 幅值变换:真实频谱幅值乘以 N / 2 N/2 N/2得到频谱序列 X ( k ) X(k) X(k)的幅值 ∣ X ( k ) ∣ |X(k)| X(k)
    b) 频谱延拓:真实频谱的频率范围为 0 − f s / 2 0-f_s/2 0fs/2,而参与iDFT变换的频谱序列 X ( k ) X(k) X(k)为两部分共轭复数序列组成,因此需要对物理频谱进行延拓得到 X ( k ) X(k) X(k)。频谱延拓的方案上图所示。
    c) 直流信号的处理:直流信号幅值乘以2,再进行幅值变换乘以 N / 2 N/2 N/2,得到频谱序列 X ( k ) X(k) X(k)的直流分量 ∣ X ( 0 ) ∣ |X(0)| X(0)

    3. 函数

    作者在Matlab软件自带ifft函数的基础上,使用Matlab开发了函数iDFT.m,通过函数来实现上述幅值变换、频谱延拓和直流信号的处理,能够直接从从频谱恢复时域信号,函数简单、易用、通用性好。

    function [xn,t] = iDFT(X_m,X_phi,ts,drawflag)
    % [xn,t] = iDFT(X_m,X_phi,ts) 离散序列的快速傅里叶逆变换,频域转换为时域信号
    % 输入 X_m为幅值向量
    %      X_phi为相位向量,单位为°
    %      ts为序列的采样时间/s
    %      drawflag为绘图标识位,取0时不绘图,其余非0值时绘图,默认为绘图
    % 输出  xn为离散序列向量
    %       t为与xn对应的时间向量
    % 注意计算出来的0频分量在进行ifft计算时,幅值应乘以2
    % By ZFS@wust  2020
    % 获取更多Matlab/Simulink原创资料和程序,清关注微信公众号:Matlab Fans
    

    4. 实例演示

    下面结合实例进行演示和分析。

    例1:单频正弦信号(整数周期采样)

    %% Eg 1 单频正弦信号
    ts = 0.01;
    t = 0:ts:1;
    A = 1.5;       % 幅值  
    f = 2;         % 频率
    w = 2*pi*f;    % 角频率
    phi = pi/3;    % 初始相位 
    x = A*cos(w*t+phi);   % 时域信号
    figure
    plot(t,x)
    xlabel('时间/s')
    ylabel('时域信号x(t)')
    % DFT变换将时域转换到频域,并绘制频谱图
    [f,X_m,X_phi] = DFT(x,ts);
    % iDFT逆变换将频域转换到时域,并绘制时域图
    [xn,t2] = iDFT(X_m,X_phi,ts);
    hold on
    plot(t,x,'r--')
    legend('恢复的时域信号','原始时域信号')
    

    结果:
    在这里插入图片描述
    在这里插入图片描述

    例2:含有直流分量的单频正弦信号

    %% Eg 2 含有直流分量的单频正弦信号
    ts = 0.01;
    t = 0:ts:1;
    A = 1.5;       % 幅值  
    f = 5;         % 频率
    w = 2*pi*f;    % 角频率
    phi = pi/6;    % 初始相位 
    x = 0.5 + A*cos(w*t+phi);   % 时域信号,带有直流偏移0.5
    figure
    plot(t,x)
    xlabel('时间/s')
    ylabel('时域信号x(t)')
    % DFT变换将时域转换到频域,并绘制频谱图
    [f,X_m,X_phi] = DFT(x,ts);
    % iDFT逆变换将频域转换到时域,并绘制时域图
    [xn,t2] = iDFT(X_m,X_phi,ts);
    hold on
    plot(t,x,'r--')
    legend('恢复的时域信号','原始时域信号')
    

    结果:
    在这里插入图片描述
    在这里插入图片描述

    例3:正弦复合信号

    %% Eg 3 正弦复合信号
    ts = 0.01;
    t = 0:ts:2;
    A = [1.5 1 0.5 0.2];    % 幅值  
    f = [3 6 9 15];         % 频率
    w = 2*pi*f;             % 角频率
    phi = (1:4)*pi/4;       % 初始相位 
    x = -0.5 + A(1)*cos(w(1)*t+phi(1)) + A(2)*cos(w(2)*t+phi(2)) + A(3)*cos(w(3)*t+phi(3)) + A(4)*cos(w(4)*t+phi(4));     % 时域信号
    figure
    plot(t,x)
    xlabel('时间/s')
    ylabel('时域信号x(t)')
    % DFT变换将时域转换到频域,并绘制频谱图
    [f,X_m,X_phi] = DFT(x,ts);
    % iDFT逆变换将频域转换到时域,并绘制时域图
    [xn,t2] = iDFT(X_m,X_phi,ts);
    hold on
    plot(t,x,'r--')
    legend('恢复的时域信号','原始时域信号')
    

    结果:
    在这里插入图片描述
    在这里插入图片描述

    例4:含有随机干扰的正弦信号

    %% Eg 4 含有随机干扰的正弦信号
    ts = 0.01;
    t = 0:ts:2;
    A = [1 0.5];    % 幅值  
    f = [3 10];         % 频率
    w = 2*pi*f;             % 角频率
    phi = (1:2)*pi/3;       % 初始相位 
    x =  A(1)*cos(w(1)*t+phi(1)) + A(2)*cos(w(2)*t+phi(2)) + 0.8*(rand(size(t))-0.5);     % 时域信号
    figure
    plot(t,x)
    xlabel('时间/s')
    ylabel('时域信号x(t)')
    % DFT变换将时域转换到频域,并绘制频谱图
    [f,X_m,X_phi] = DFT(x,ts);
    % iDFT逆变换将频域转换到时域,并绘制时域图
    [xn,t2] = iDFT(X_m,X_phi,ts);
    hold on
    plot(t,x,'r--')
    legend('恢复的时域信号','原始时域信号')
    

    结果:
    在这里插入图片描述
    在这里插入图片描述

    例5:实际案例

    %% Eg 5 实际案例
    load data
    ts = 0.001;
    x = Jsd;
    t = [0:length(x)-1]*ts;
    figure
    plot(t,x)
    xlabel('时间/s')
    ylabel('时域信号x(t)')
    % DFT变换将时域转换到频域,并绘制频谱图
    [f,X_m,X_phi] = DFT(x,ts);
    % iDFT逆变换将频域转换到时域,并绘制时域图
    [xn,t2] = iDFT(X_m,X_phi,ts);
    hold on
    plot(t,x,'r--')
    legend('恢复的时域信号','原始时域信号')
    

    结果:
    在这里插入图片描述
    在这里插入图片描述

    上述各例中,通过iDFT恢复的时域信号与原始信号完全重合,说明利用离散傅里叶逆变换(iDFT)可以从频谱恢复时域信号。

    5. 联系作者

    有Matlab/Simulink方面的技术问题,欢迎发送邮件至944077462@qq.com讨论。
    更多Matlab/Simulink原创资料,欢迎关注微信公众号:Matlab Fans

    源程序下载:
    1. csdn资源: Matlab如何进行离散傅里叶变换DFT(快速傅里叶变换FFT)进行频谱分析
    2. 扫码关注微信公众号Matlab Fans,回复BK07获取百度网盘下载链接。

    在这里插入图片描述

    展开全文
  • IDFT函数的计算结果与matlab的ifft(X)函数计算结果完全相同,运行速度超级快,文件包含使用示例代码和说明,写的很详细了,保证你看了就会用。
  • C++离散傅里叶逆变换 一、序言: 该教程承接上文的离散傅里叶变换,用于进行离散傅里叶逆变换。 二、设计目标 对复数数组进行离散傅里叶逆变换,并生成可供使用的图像类。 三、详细步骤 输入:经傅里叶...

    C++离散傅里叶逆变换

    一、序言:

    该教程承接上文的离散傅里叶变换,用于进行离散傅里叶逆变换。

     

    二、设计目标

    对复数数组进行离散傅里叶逆变换,并生成可供使用的图像类。

     

    三、详细步骤

    输入:经傅里叶变换后产生的复数数组

    输出:MyImage图像

    定义:

    static MyImage* Idft2(ComplexNumber *Scr,int const width,int const height);

     

    实现:MyImage* MyCV::Idft2(ComplexNumber *Scr, int width, int height)

    {
    
        int bytesPerLine = (width*8+31)/32*4;
    
     
    
        double* double_data = new double[width*height];
    
        memset(double_data,0,sizeof(double_data)*sizeof(double)); //全部赋值为0
    
     
    
        double fixed_factor_for_axisX = (2 * PI) / height;                  // evaluate i2π/N of i2πux/N, and store the value for computing efficiency
    
        double fixed_factor_for_axisY = (2 * PI) / width;                   // evaluate i2π/N of i2πux/N, and store the value for computing efficiency
    
        for (int x = 0; x<height; x++) {
    
            for (int y = 0; y<width; y++) {
    
                for (int u = 0; u<height; u++) {
    
                    for (int v = 0; v<width; v++) {
    
                        double powerU = u * x * fixed_factor_for_axisX;         // evaluate i2πux/N
    
                        double powerV = v * y * fixed_factor_for_axisY;         // evaluate i2πux/N
    
                        ComplexNumber cplTemp;
    
                        cplTemp.SetValue(cos(powerU + powerV), sin(powerU + powerV));
    
                        double_data[y + x*width] = double_data[y + x*width] +
    
                                ((Scr[v + u*width] * cplTemp).m_rl
    
                                /(height*width));
    
                    }
    
                }
    
            }
    
        }
    
     
    
        unsigned char *idft2_data = new unsigned char[bytesPerLine*height];//存储处理后的数据
    
     
    
        for(int i=0;i<height;i++)
    
            for(int j=0;j<width;j++)
    
            {
    
                idft2_data[i*bytesPerLine+j] = (unsigned char)double_data[i*width+j];
    
            }
    
     
    
        return new MyImage(idft2_data,width,height,MyImage::format::GRAY8);
    
    }

     

    至此,离散傅里叶逆变换的方法实现完成,效果图如下:

     

     

    如果上述教程或代码中有任何错误,欢迎批评和指证。

     

    转载于:https://www.cnblogs.com/akakakkk/p/8595156.html

    展开全文
  • 二维离散傅里叶变换与逆变换的原理与实现(Matlab)

    千次阅读 多人点赞 2020-03-20 20:52:30
    我们已经知道一维噪声可以用一维傅里叶变换到频域滤波,同理二维噪声也可以用二维傅里叶变换到"频率滤波"。 二维傅里叶变换的原理 笔者很讨厌一上来就看到一连串复杂的公式!因此当我看懂一个原理后,我就会用最好...

    前言

    在野外数据采集中,虽然单个仪器采集的是一维信号,但是当把多台仪器数据汇总并生成做二维剖面的图像时,噪声可不只有一维的,更有x,y两个方差同时存在的"二维噪声"!我们已经知道一维噪声可以用一维傅里叶变换到频域滤波,同理二维噪声也可以用二维傅里叶变换到"频率滤波"。

    二维傅里叶正变换的原理

    笔者很讨厌一上来就看到一连串复杂的公式!因此当我看懂一个原理后,我就会用最好理解的方式来重述它,毕竟我更偏重于应用。二维傅里叶变化,只用一个公式:

    公式1:二维傅里叶变换公式(其实不用看它)
    公式中参数说明:

    公式(1)
    公式中参数说明:
    M、N分别是图像的长和宽;
    u、x范围从1到M-1;v、y范围从1到N-1。
    公式看上去不难,但其实还是不太明确到底怎么用啊!它其实可以矩阵相乘的形式表示:
    在这里插入图片描述
    公式(2)
    公式2中f是原始二维数据矩阵,G_{1}和G_{2}分别是如下:
    在这里插入图片描述
    公式(3)
    在这里插入图片描述
    公式(4)
    这用Matlab太好实现了叭!G_{1}和G_{2}这么有规律,很容易就编程出来了~ 然后3个矩阵做个乘积,就换到频率域了!二维傅里叶变换就结束了!

    二维傅里叶反变换

    定义的公式为公式5(不用看),矩阵形式的公式为公式6(看这个即可):
    在这里插入图片描述
    公式5:二维傅里叶反变换公式
    在这里插入图片描述
    公式6:矩阵形式(看这个)
    其中G_{3}和G_{4}矩阵为:
    在这里插入图片描述
    公式(7)
    在这里插入图片描述
    公式(8)
    到此,二维傅里叶逆变换也结束了!整个二维傅里叶变换就都结束了!真的很简单!下面我们就在Matlab中手写实现正、逆这两个过程。

    Matlab程序实现

    首先实现正变换程序,对应Matlab自带函数为:fft2

    clc; clear;
    
    data = imread('zxc.jpg');  % 数据——最好比卷积核的尺寸大
    data = im2double(data); 
    data = rgb2gray(data);     % rgb转为灰度图像
    subplot(1,3,1);
    imshow(data);
    title('原始图像')
    
    zidai = fft2(data);   % matlab自带函数,来用对比
    subplot(1,3,2);
    imshow(real(zidai));  % 一般只要实部
    title('自带的fft2生成的"频域"图像');
    
    size_data = size(data);
    M = size_data(1);  %(原始数据矩阵)的长
    N = size_data(2);  %(原始数据矩阵)的宽
    
    % 下面是傅里叶正变换必备的一些矩阵:
    Wm = exp(-j*2*pi/M);
    Wn = exp(-j*2*pi/N); % 不同G中用不同的W
    Em = zeros(M);
    En = zeros(N);     % E是辅助计算矩阵
    Gm = zeros(M)+Wm;
    Gn = zeros(N)+Wn;  % G是计算时要用的矩阵
    F = zeros(M,N);    % F是转换到频域的结果
    
    % 对Gm的计算: 循环长度为M
    fprintf('二维离散傅里叶变换开始:\n');
    for row = 0:M-1
        for col = 0:M-1
            Em(row+1,col+1) = row * col;
            Gm(row+1,col+1) = Gm(row+1,col+1)^Em(row+1,col+1);
        end
    end
    % 对Gn的计算: 循环长度为N
    for row = 0:N-1
        for col = 0:N-1
            En(row+1,col+1) = row * col;
            Gn(row+1,col+1) = Gn(row+1,col+1)^En(row+1,col+1);
        end
    end
    
    F = real(Gm*data*Gn);  % F = Gm*f*Gn是计算公式,一般只要实部
    subplot(1,3,3);
    imshow(F);
    title('手写的myfft2生成的"频域"图像');
    
    error = sum(sum((real(F)-real(zidai)).^2));
    if error < 10^(-10)
        fprintf('自带与手写结果一致!\n');
    else
        fprintf('不一致!\n');
    end
    

    接着正变换结果(把频域结果当输入)逆变换程序如下,对应Matlab自带函数:ifft2

    % 鉴于正向fft2手写与自带结果一致;
    % ifft2的输入就直接用自带的fft2的结果。
    clc; clear;
    
    data = imread('zxc.jpg');  % 数据——最好比卷积核的尺寸大
    data = im2double(data); 
    data = rgb2gray(data);     % rgb转为灰度图像
    subplot(1,3,1);
    imshow(data);
    title('原始图像')
    
    F = fft2(data);
    subplot(1,3,2);
    imshow(real(F));  % 一般画图只要实部, 作为输入时实虚都要!!
    title('自带的fft2生成的"频域"图像');
    
    % s = ifft2(F);
    % subplot(1,3,3);
    % imshow(s);
    % return;
    
    size_data = size(F);
    M = size_data(1);  %(原始数据矩阵)的长
    N = size_data(2);  %(原始数据矩阵)的宽
    
    % 下面是傅里叶逆变换必备的一些矩阵:
    Wm = exp(-j*2*pi/M);
    Wn = exp(-j*2*pi/N);  % 不同G中用不同的W
    Em = zeros(M);
    En = zeros(N);        % E是辅助计算矩阵
    Gm = zeros(M)+Wm;
    Gn = zeros(N)+Wn;  % G是计算时要用的矩阵
    f = zeros(M,N);    % F是转换到频域的结果
    
    % 对Gm的计算: 循环长度为M
    fprintf('二维离散反傅里叶变换开始:\n');
    for row = 0:M-1
        for col = 0:M-1
            Em(row+1,col+1) = -row * col;
            Gm(row+1,col+1) = Gm(row+1,col+1)^Em(row+1,col+1);
        end
    end
    Gm = Gm/M;
    % 对Gn的计算: 循环长度为N
    for row = 0:N-1
        for col = 0:N-1
            En(row+1,col+1) = -row * col;
            Gn(row+1,col+1) = Gn(row+1,col+1)^En(row+1,col+1);
        end
    end
    Gn = Gn/N;   % 注意:这个/N和上面的/M都是算完G之后才除以的!因为上面计算的时候是幂项变化!
    
    f = real(Gm*F*Gn);  % f = Gm*F*Gn是计算公式,一般只要实部
    subplot(1,3,3);
    imshow(f);
    title('手写的myidft2生成的"原始"图像');
    
    error = sum(sum((real(f)-real(data)).^2));
    if error < 10^(-10)
        fprintf('反变换后与原图一致!\n');
    else
        fprintf('不一致!\n');
    end
    
    展开全文
  • 积分线性变换可以将信号或图像在更适合的域内表达,并且使得解决相关问题更容易,在图像分析中最常用的积分显示变换是傅里叶变换、离散余弦变换与小波变换。...逆变换为 相应地,对于下标从0开始的离...
  • WORD格式 专业资料整理 MATLAB作业 方法一 N=200;dt=0.001;n=1:200; x=3*sin(2*pi*10*n*dt)+3*sin(2*pi*30*n*dt)+sin(2*pi*40*n*dt)+sin(2 *pi*50*n*dt)+sin(2*pi*60*n*dt)+6*sin(2*pi*80*n*dt;...
  • 利用c语言实现的快速离散傅里叶变换,代码都是自己写的,绝无copy!
  • Python 二维离散傅里叶变换

    千次阅读 2019-10-29 21:26:25
    文章目录Python 二维离散傅里叶变换需要的库计算两张图片的PSNR二维离散傅里叶变换二维离散傅里叶逆变换频域平移绘制频域图像 需要的库 import numpy as np import cv2 import matplotlib.pyplot as plt 计算两张...
  • 快速傅里叶逆变换IFFT算法的C++实现

    热门讨论 2009-11-14 14:54:57
    快速傅里叶逆变换 IFFT算法 C++实现 包括TFFT,整序
  • 离散傅里叶变换不是一种神奇的东西,它和离散傅里叶级数关系很紧密,紧密到使用MATLAB编写离散傅里叶变换以及逆变换的函数一模一样,只需改个名字即可。 因为离散傅里叶级数是一个周期的信号,我们编写DFS以及IDFS...
  • 离散傅里叶变换 离散傅里叶变换
  • 离散傅里叶变换终极推导

    千次阅读 2019-11-24 21:17:43
    为了引入离散傅里叶变换,首先需要依次推导: 1,周期函数的傅里叶级数形式: 2,非周期函数的傅里叶变换: 3,非周期函数的时域和频域抽样: 3.1时域抽样 函数p(t)和其频域函数P(w): 根据频域...
  • 傅里叶变换 一维离散傅里叶变换

    万次阅读 热门讨论 2019-11-06 21:08:43
    DFT:(Discrete Fourier Transform)离散傅里叶变换是傅里叶变换在时域和频域上都呈离散的形式,将信号的时域采样变换为其DTFT的频域采样。在形式上,变换两端(时域和频域上)的序列是有限长的,而实际上这两组序列...
  • 傅里叶变换 二维离散傅里叶变换

    万次阅读 热门讨论 2019-11-07 15:41:28
    DFT:(Discrete Fourier Transform)离散傅里叶变换是傅里叶变换在时域和频域上都呈离散的形式,将信号的时域采样变换为其DTFT的频域采样。在形式上,变换两端(时域和频域上)的序列是有限长的,而实际上这两组序列...
  • 使用快速傅里叶逆变换,分析离散时间信号中频率分辨率和信号的样本数之间的关系,并通过不同的滤波器进行对比。
  • 离散傅立叶变换与逆变换

    千次阅读 2015-08-28 09:39:44
    傅立叶逆变换实现韩式为idft,逆变换后输出的为复数,我们可取其实部显示即可 int main(){ Mat I = imread( "F:\\opencv_test\\6.tif" , 0 ); if (I.empty()) return - 1 ; //傅立叶变换 int m=...
  • 从一维连续Fouier变换和逆变换公式推导一维离散Fourier变换和逆变换公式,并对得到的公式进行系数修正。
  • 离散傅里叶变换-DFT(FFT基础)

    万次阅读 多人点赞 2018-08-13 11:50:03
    离散傅里叶变换的缩写,咱们先来详细讨论 DFT ,因为 DFT 懂了之后, FFT 就容易的多了 DFT(FFT) 的作用 : 可以将信号从时域变换到频域,而且时域和频域都是离散的,通俗的说,可以求出一个信号由哪些正弦波叠加而...
  • python模拟离散傅里叶变换

    千次阅读 2018-02-02 21:01:29
     傅里叶变换是信号处理领域的一种极其重要的手段,很多的滤波算法也是基于傅里叶变换而来,通过这个实验我们可以简单模拟傅里叶变换极其逆变换,同时也可以看出低通和高通滤波无非也是讲个别信号抑制,通过设置阈值...
  • 离散傅里叶变换(DFS)、逆离散傅里叶变换(IDFS)的实现 代码如下,其中xn为时序序列 clc;clear; xn=[7,6,5,4,3,2]; Xk=dfs(xn,6); x=idfs(Xk,6); subplot(2,2,1);stem(0:5,abs(Xk),'filled'); axis([0,5,0,1.1...
  • 1. 离散傅里叶级数
  • 图像的傅里叶变换和逆变换C++版

    千次阅读 2021-01-04 13:52:48
    进行离散傅里叶变换和逆变换 //快速傅里叶变换 void ImageDFT(InputArray srcImage, OutputArray dstImage) { //得到Mat类型 Mat src = srcImage.getMat(); int rows = src.rows; int cols = src.cols; //快速...
  • 离散傅里叶变换(DFT) C代码

    热门讨论 2009-07-31 09:28:46
    是《数字信号处理C语言程序集》的DFT的C语言源代码,已测试!
  • 根据离散傅里叶变换的原始公式和自己编写复数计算函数进行离散傅里叶变换 对10000个点的加有噪声或干净的正弦波的数据进行离散傅里叶变换,生成10000个点的复数数据序列到文本文件中。 数据格式为实部+虚部,用空格...
  • 傅里叶变换中有一个离散傅里叶变换是现代数字系统经常用的变换,甚至比连续傅里叶变换的应用场合还要多,毕竟我们目前处在一个数字化的世界中,那么离散傅里叶变换要怎样理解呢? 离散傅里叶变换本质是周期信号求...
  • 二维离散傅里叶变换(Two-Dimensional Discrete Fourier Transform)常用于图像处理中,对图像进行傅里叶变换后得到其频谱图。频谱图中频率高低表征图像中灰度变化的剧烈程度。图像中边缘和噪声往往是高频信号,而...
  • 离散时间傅里叶变换

    千次阅读 2018-11-03 20:52:07
    1. 离散时间傅里叶变换的导出 针对离散时间非周期序列,为了建立它的傅里叶变换表示,我们将采用与连续情况下完全类似的步骤进行。 考虑某一序列 x[n]x[n]x[n],它具有有限持续期;也就是说,对于某个整数 N1N_1N1​...
  • Matlab实现快速傅里叶逆变换 昨晚分享了matlab的快速傅里叶变换,应群友要求,分享一下快速傅里叶逆变换 昨晚文章:Matlab实现傅里叶变换 https://blog.csdn.net/qingfengxd1/article/details/117091349 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,741
精华内容 2,296
关键字:

离散傅里叶逆变换