精华内容
下载资源
问答
  • iDFT
    2021-04-24 00:58:04

    MATLAB 离散傅里叶变换及应用 一、DFT 与 IDFT、DFS、DTFT 的联系 1、 序列的傅里叶变换(DFT)和逆变换(IDFT) 在实际中常常使用有限长序列。如果有限长序列......

    MATLAB 离散傅里叶变换及应用 一、DFT 与 IDFT、DFS、DTFT 的联系 1、 序列的傅里叶变换(DFT)和逆变换(IDFT) 在实际中常常使用有限长序列。如果有限长序列......

    (2)画出原信号与傅里叶逆变换IDFT[X(k)]图形进行比较 Matlab程序...

    {1,2,4,5,6,7,8,10} ,求此序列的 DFT 及 IDFT 并画出原信号 x(n) 及其 DFT 的 X(k) 和 IDFT[X(k)]的图像。 xn=[1,2,4,5,6,7,8,10]......

    4. 二维快速逆傅里叶变换函数 ifft2 格式:X=ifft2(x) 功能:返回矩阵 X 的二维 IDFT 变换。 MATLAB GUI 设计工具简介图形用户界面的程序是在图形界面下创建与......

    IDFT [ X (k )] ? DFT 变换的 Matlab 实现: n=0:...

    ,. MATLAB 离散傅里叶变换及应用 一、DFT 与 IDFT、DFS、DTFT 的联系 1、 序列的傅里叶变换(DFT)和逆变换(IDFT) 在实际中常常使用有限长序列。如果有限长......

    nq N (3-4) 15 基于 MATLAB 实现 OFDM 的仿真 有很多不同的 FFT 算法可以实现离散傅里叶变换(DFT)及离散傅里叶反 变换(IDFT)这样就很方便实际应用中形成 ......

    本文在简要介绍了 OFDM 基本原理后,基于 MATLAB 构建了 一个完整的 OFDM 动态...通过 N 点的 IDFT 运算,把频域数据符号 di 变换为时域数据符号 Sk , 经过......

    掌握用 Matlab 进行离散傅里叶变换 DFT 及其逆变换 IDFT 的方法。...

    例3-2 一个简单的MATLAB函数 ? 例3-2:编写一个对序列 x(n)作N点离散傅...函数idft.m function [xn] = idft(Xk,N) % idft求序列X(k)的N点IDFT %......

    ? 利用matlab验证有关性质。 ? 利用傅立叶变换进行相关运算。 2020/4/25 二...e j 2 N n k ,并最后乘以1/N,那么 ,DFT的计算程序就可以用来计算IDFT。...

    thesystemis originwhichachievesa theOFDMsystembyusingIDFTconclusionis andDFT.AndMatlabthe simulationof Code-0FDM implemented,and relative acquiredaccordingto ......

    基于 MATLAB 的 OFDM 系统的实现代码和波形: 3 运行环境 硬件:Windows XP 4 ...这样样值可以通过 IDFT 来得到,这就是用 IDFT 和 DFT 可以实现 OFDM 系统的......

    本文在简要介绍了 OFDM 基本原理后,基于 MATLAB 构建了一个完整的 OFDM 动态...通过 N 点的 IDFT 运算,把频域数据符号 di 变换为时域数据符号 Sk ,经过射频......

    实验环境 MATLAB7.0 四、实验原理 1.有限长序列的傅里叶变换 有限长序列的傅里叶变换(DFT)和逆变换 和逆变换(IDFT) 有限长序列的傅里叶变换 和逆变换在实际......

    ∞ ∞ (b)由上式可知,频域采样点数 N 必须大于等于时域离散信号的长度 M(即 N≥M),才能使 时域不产生混叠, N 点 IDFT[ X N ( k ) ]得到的序列 xN ......

    本文分析了OFDM系统的基本原理,采用MATLAB对三种估计信道下的OFDM的传输性能进行了...输入经过调制(符号匹配)的复信号经过串、并变换后,进行IDFT或IFFT和并、串 ......

    ⑷掌握用 MATLAB 进行离散傅里叶变换 DFT 及其逆变换 IDFT 的方法。 三、实验内容 ⑴已知有限长序列 x(n)=[7,6,5,4,3,2], 求 x(n)的 IDFT。要求: ......

    3、学习利用 DFT 计算程序计算 IDFT 的方法。 二、实验原理及方法在工程...

    更多相关内容
  • 该文件包括用于 DFT 和 IDFT 的 matlab 代码
  • matlab的idft代码Matlab的 用于时域和频域采样的Matlab代码用于使用DFT和IDFT进行线性和圆形卷积
  • 利用二维离散傅里叶变换(DFT)的一些性质,将Gunther提出的关于同时计算一个N点实序列的DFT和另一个N点实序列的DFT的逆离散傅里叶变换(IDFT)的4个新的直接公式中的第1和第4个公式,以及他提出的关于同时计算2个N...
  • 使用 DFT-IDFT 的循环卷积 第一个序列(*) 第二个序列 = IDFT(第一个序列的 DFT * 第二个序列的 DFT)
  • DFT_idft_matlab_

    2021-10-02 17:55:37
    2d picture idft
  • 使用 Direct 和 FFT 方法计算 DFT、IDFT
  • matlab的idft代码DFT编码器 该python项目基于DFT实现了音频编码器的第一个版本/方法。 它由一个增量编码器组成,从任何数字信号处理的分析/合成的最基础开始,到基于能量检测的“智能”可变位分配。 该项目的目的是...
  • Matlab代码,用于DFT,IDFT,脉冲,采样定理,自相关,线性和圆形卷积等功能。 DFT 离散傅里叶变换(DFT)是用于数字信号处理中数值计算的主要变换。 它非常广泛地用于频谱分析,快速卷积和许多其他应用。 DFT将N个...
  • IDFT函数的计算结果与matlab的ifft(X)函数计算结果完全相同,运行速度超级快,文件包含使用示例代码和说明,写的很详细了,保证你看了就会用。
  • 无需使用内置函数即可找到离散信号的 DFT 和 IDFT。它是快速傅立叶变换 (FFT) 的替代算法
  • 在资源中构造了两个函数dft和idft,dft可以用fft来代替。里面表示了线性卷积的幅度和角度表示,并且有补0与添加采样点并进行dft算法。最后进行了圆周卷积和线性卷积的对比。第一种情况进行的圆周卷积采样点小于N1+N2...
  • 基于CZT与混合基算法的LTE-DFT/IDFT模块的研究与实现,刘建霞,回海生,本文分析了LTE系统在不同配置带宽条件及随机接入过程中DFT/IDFT模块的需求,采用混合基算法和CZT算法设计了通用的LTE-DFT/IDFT模块,分析�
  • 图像的dft和idft变换,不使用matlab自带的函数
  • 腐蚀膨胀DFT IDFT

    2018-05-07 20:28:31
    形态学处理,腐蚀膨胀来处理图形边缘,以及图像用傅里叶变换由空间域转换为频域,由频域转换回空间域
  • OFDM系统仿真 ----比较OFDM系统的IDFT/DFT实现与模拟调制实现仿真代码,其中假设OFDM系统包含8个子载波,fc=1 Hz,子载波频率间隔为1 Hz,每个子载波采用4-QAM调制,符号周期为1秒
  • 熟知,两个N维实向量的DFT,可以用一个N维复向量的DFT计算。最近,S.MOshe和D.Hertz提出一个方法:用一个N维复向量的DFT计算一个N维实向量的DFT和另一个N维实向量的DFT的IDI。这是一个优美的结果,具有理论意义和...
  • 此matlab程序用来实现fft,idft变换
  • IDFT的python实现

    千次阅读 2018-11-07 16:19:12
    IDFT IDFT(Inverse Discrete Fourier Transform), 傅里叶逆变换,可以将频域信号转换到时域中, 它的公式非常简单: x[n]=1N∑k=0N−1X[k]ej2πkn/N x[n] = \frac{1}{N} \sum_{k=0}^{N-1} X[k] e^{j2\pi kn/N} x[n]=...

    IDFT

    IDFT(Inverse Discrete Fourier Transform), 傅里叶逆变换,可以将频域信号转换到时域中, 它的公式非常简单:
    x [ n ] = 1 N ∑ k = 0 N − 1 X [ k ] e j 2 π k n / N x[n] = \frac{1}{N} \sum_{k=0}^{N-1} X[k] e^{j2\pi kn/N} x[n]=N1k=0N1X[k]ej2πkn/N

    X [ k ] X[k] X[k]:离散频率下标为k时的频率大小

    x [ n ] x[n] x[n]: 离散时域信号序列

    N N N: 信号序列的长度,也就是采样的个数

    对比我们之前讲过的DFT,两者公式类似,但是注意在DFT中指数带负号,而IDFT中不带

    从矩阵的角度看IDFT

    DFT的矩阵表示

    讲IDFT之前,我们先复习DFT的矩阵表示形式:
    [ s 0 0 s 0 1 ⋯ s 0 N − 1 ⋮ ⋮ ⋮ ⋮ s k 0 s k 1 ⋯ s k N − 1 ⋮ ⋮ ⋱ ⋮ s N − 1 0 s N − 1 1 ⋯ s N − 1 N − 1 ] [ x [ 0 ] x [ 1 ] ⋮ x [ n ] ⋮ x [ N − 1 ] ] = [ X [ 0 ] X [ 1 ] ⋮ X [ k ] ⋮ X [ N − 1 ] ] \begin{bmatrix} s_0^0 & s_0^1 & \cdots & s_0^{N-1} \\ \vdots & \vdots & \vdots & \vdots\\ s_k^0 & s_k^1 & \cdots & s_k^{N-1} \\ \vdots & \vdots & \ddots & \vdots\\ s_{N-1}^0 & s_{N-1}^1 & \cdots & s_{N-1}^{N-1} \\ \end{bmatrix} \begin{bmatrix} x[0] \\ x[1] \\ \vdots\\ x[n] \\ \vdots \\ x[N-1] \end{bmatrix} = \begin{bmatrix} X[0] \\ X[1] \\ \vdots\\ X[k] \\ \vdots \\ X[N-1] \end{bmatrix} s00sk0sN10s01sk1sN11s0N1skN1sN1N1x[0]x[1]x[n]x[N1]=X[0]X[1]X[k]X[N1]
    S S S矩阵中的每一行都是一个 S k S_k Sk向量, S k = e − j 2 π k n / N , n = 0 , 1 , ⋯   , N − 1 S_k = e^{-j2\pi kn/N}, n=0,1,\cdots,N-1 Sk=ej2πkn/N,n=0,1,,N1,进一步简化上面的表示,得到:
    [ ⋯ S 0 ⋯ ⋮ ⋯ S k ⋯ ⋮ ⋯ S N − 1 ⋯ ] [ x [ 0 ] x [ 1 ] ⋮ x [ n ] ⋮ x [ N − 1 ] ] = [ X [ 0 ] X [ 1 ] ⋮ X [ k ] ⋮ X [ N − 1 ] ] \begin{bmatrix} \cdots & S_0 & \cdots \\ & \vdots & \\ \cdots & S_k & \cdots \\ & \vdots & \\ \cdots & S_{N-1} & \cdots \\ \end{bmatrix} \begin{bmatrix} x[0] \\ x[1] \\ \vdots\\ x[n] \\ \vdots \\ x[N-1] \end{bmatrix} = \begin{bmatrix} X[0] \\ X[1] \\ \vdots\\ X[k] \\ \vdots \\ X[N-1] \end{bmatrix} S0SkSN1x[0]x[1]x[n]x[N1]=X[0]X[1]X[k]X[N1]

    IDFT的矩阵表示

    从IDFT的公式,可以看出,其实IDFT和DFT表示是一样的,只是对象发生了变化。具体来说,有两个变化:

    • 由于指数部分不再有符号, S k S_k Sk进行了共轭操作,得到 S k ∗ S_k^* Sk
    • 输入是频率信息X[k]

    因此,矩阵表示变成了下面这样:
    [ ⋯ S 0 ∗ ⋯ ⋮ ⋯ S k ∗ ⋯ ⋮ ⋯ S N − 1 ∗ ⋯ ] [ X [ 0 ] X [ 1 ] ⋮ X [ n ] ⋮ X [ N − 1 ] ] = [ x [ 0 ] x [ 1 ] ⋮ x [ k ] ⋮ x [ N − 1 ] ] \begin{bmatrix} \cdots & S_0^* & \cdots \\ & \vdots & \\ \cdots & S_k^* & \cdots \\ & \vdots & \\ \cdots & S_{N-1}^* & \cdots \\ \end{bmatrix} \begin{bmatrix} X[0] \\ X[1] \\ \vdots\\ X[n] \\ \vdots \\ X[N-1] \end{bmatrix} = \begin{bmatrix} x[0] \\ x[1] \\ \vdots\\ x[k] \\ \vdots \\ x[N-1] \end{bmatrix} S0SkSN1X[0]X[1]X[n]X[N1]=x[0]x[1]x[k]x[N1]

    Talk is cheap, show me the code

    接下来就简单多了,我们将先介绍如何使用scipy中ifft,然后自己动手实现一份ifft

    导入必要的包

    import numpy as np
    from scipy.fftpack import fft, ifft
    
    import matplotlib.pyplot as plt
    
    %matplotlib notebook
    

    生成信号用于测试

    def generate_sine(N, A, fs, f0, phi):
        '''
        N : number of samples
        A : amplitude
        fs: sample rate
        f0: frequency
        phi: initial phase
        '''
        
        T = 1/fs
        n = np.arange(N)
        x = A*np.cos( 2*np.pi*f0*n*T + phi )
        
        return x
    
    # generate signal
    N = 501
    A = 0.8
    fs = 44100
    f0 = 1000
    phi = 0.0
    
    x = generate_sine(N, A, fs, f0, phi)
    
    plt.figure()
    plt.plot(x)
    plt.show()
    

    png

    使用scipy中的ifft

    # fft the signal
    N = 512                       # fft size
    X = fft(x, N)
    mX = np.abs(X)
    pX = np.angle(X)
    
    freq_axis = np.arange(N)/N * fs
    plt.figure(figsize=(10, 12))
    ax = plt.subplot(3,1,1)
    plt.plot(freq_axis, mX)
    ax.set_title('Magnitude')
    
    ax = plt.subplot(3,1,2)
    plt.plot(freq_axis, pX)
    ax.set_title('Phase')
    
    
    # ifft it
    ifft_x = ifft(X)
    ax = plt.subplot(3,1,3)
    plt.plot(ifft_x)
    ax.set_title('Synthesise')
    
    plt.show()
    

    png

    自己动手写ifft

    只有两个地方要注意:

    • 不要忘记乘上 1/N
    • S k ∗ S_k^* Sk S k S_k Sk向量的共轭后的结果。反映在代码中,就是 S k ∗ S_k^* Sk不要共轭操作之间返回
    def generate_complex_sinusoid(n, N):
        '''
        n : time index (or frequency index)
        N : number of sample
        '''
        
        k = np.arange(N)
        
        c_sin = np.exp(1j*2*np.pi*k*n/N)
        
        return c_sin
    
    # ifft loop
    ifft_x = np.array([])
    
    for i in range(N):
        s = generate_complex_sinusoid(i, N)
        ifft_x = np.append(ifft_x, 1/N * np.sum(X*s))
    
    plt.figure()
    plt.plot(ifft_x)
    plt.show()
    

    png

    总结

    通过自己动手,我们发现IDFT的原来和实现很简单,几乎与DFT一模一样,唯一需要注意的点就是 S k ∗ S_k^* Sk

    展开全文
  • DFT和IDFT分析

    千次阅读 2019-08-26 20:45:00
    DFT和IDFT分析DFT和IDFT的意义DFT的定义DFT的矩阵分析 DFT和IDFT的意义 DFT:离散傅里叶变换 离散傅里叶变换可以将连续的频谱转化成离散的频谱去计算,这样就易于计算机编程实现傅里叶变换的计算。FFT算法的出现...

    DFT和IDFT的意义

    DFT:离散傅里叶变换
    离散傅里叶变换可以将连续的频谱转化成离散的频谱去计算,这样就易于计算机编程实现傅里叶变换的计算。FFT算法的出现,使得DFT的计算速度更快。

    定义

    DFT的定义

    x ( n ) x(n) x(n) 是一个长度为 M M M的有限长序列,则定义 x ( n ) x(n) x(n) N N N点离散傅里叶变换为
    X ( k ) = D F T [ x ( n ) ] = ∑ n = 0 N − 1 x ( n ) W N k n         ( k = 0 , 1 , . . . , N − 1 ) X(k) = DFT[x(n)] = \sum\limits_{n = 0}^{N - 1} {x(n)W_N^{kn}} \ \ \ \ \ \ \ (k=0, 1, ..., N-1) X(k)=DFT[x(n)]=n=0N1x(n)WNkn       (k=0,1,...,N1)
    注意: x ( n ) x(n) x(n)的离散傅里叶变换结果与变换区间长度 N N N的取值有关。

    DFT的定义

    X ( k ) X(k) X(k)的离散傅里叶逆变换(Inverse Discrete Fourier Transform, IDFT)为
    x ( n ) = I D F T [ X ( k ) ] = 1 N ∑ n = 0 N − 1 X ( k ) W N − k n         ( n = 0 , 1 , . . . , N − 1 ) x(n) = IDFT[X(k)]=\frac{1}{N} \sum\limits_{n = 0}^{N - 1} {X(k)W_N^{-kn}} \ \ \ \ \ \ \ (n=0, 1, ..., N-1) x(n)=IDFT[X(k)]=N1n=0N1X(k)WNkn       (n=0,1,...,N1)
    式中, W N = e − j 2 π N W_{N}=e^{-j\frac{2\pi}{N}} WN=ejN2π, N N N称为DFT变换区间长度, N ≥ M N \ge M NM

    DFT的矩阵分析

    由DFT的数学表达式可以看出:

    1. 对于每一个 X ( k ) X(k) X(k)的计算,为两个向量的内积形式

    2. 对于 k = 0 , 1 , . . . , N − 1 k=0, 1, ..., N-1 k=0,1,...,N1,则 X ( k ) X(k) X(k)的计算可以看做向量 x ( n ) x(n) x(n)一个矩阵的乘积,我们一般讲这个矩阵称作DFT矩阵 X ( k ) = D F T [ x ( n ) ] = ∑ n = 0 N − 1 x ( n ) W N k n = x ( n ) ∗ P         ( k = 0 , 1 , . . . , N − 1 ) X(k) = DFT[x(n)] = \sum\limits_{n = 0}^{N - 1} {x(n)W_N^{kn}} = x(n)*P \ \ \ \ \ \ \ (k=0, 1, ..., N-1) X(k)=DFT[x(n)]=n=0N1x(n)WNkn=x(n)P       (k=0,1,...,N1) P = [ W N 0 ∗ 0    W N 0 ∗ 1    . . . W N 0 ∗ n W N 1 ∗ 0    W N 1 ∗ 1    . . . W N 1 ∗ n . . . W N k ∗ 0    W N k ∗ 1    . . . W N k ∗ n ] P= \left[ \begin{array}{l} W_N^{0*0}\ \ W_N^{0*1} \ \ ...W_N^{0*n}\\ W_N^{1*0}\ \ W_N^{1*1} \ \ ...W_N^{1*n}\\ ... \\ W_N^{k*0}\ \ W_N^{k*1} \ \ ...W_N^{k*n}\\ \end{array} \right] P=WN00  WN01  ...WN0nWN10  WN11  ...WN1n...WNk0  WNk1  ...WNkn

    3. 同理,对于IDFT的运算,同样会有一个对应的IDFT矩阵,且和DFT矩阵有如下的关系: x ( n ) = I D F T [ X ( k ) ] = 1 N ∑ n = 0 N − 1 X ( k ) W N − k n = 1 N X ( k ) ∗ Q ( k = 0 , 1 , . . . , N − 1 ) x(n) = IDFT[X(k)]=\frac{1}{N} \sum\limits_{n = 0}^{N - 1} {X(k)W_N^{-kn}} =\frac{1}{N} X(k)*Q \\ (k=0, 1, ..., N-1) x(n)=IDFT[X(k)]=N1n=0N1X(k)WNkn=N1X(k)Q(k=0,1,...,N1) Q = [ W N − 0 ∗ 0    W N − 0 ∗ 1    . . . W N − 0 ∗ n W N − 1 ∗ 0    W N − 1 ∗ 1    . . . W N − 1 ∗ n . . . W N − k ∗ 0    W N − k ∗ 1    . . . W N − k ∗ n ] Q= \left[ \begin{array}{l} W_N^{-0*0}\ \ W_N^{-0*1} \ \ ...W_N^{-0*n}\\ W_N^{-1*0}\ \ W_N^{-1*1} \ \ ...W_N^{-1*n}\\ ... \\ W_N^{-k*0}\ \ W_N^{-k*1} \ \ ...W_N^{-k*n}\\ \end{array} \right] Q=WN00  WN01  ...WN0nWN10  WN11  ...WN1n...WNk0  WNk1  ...WNkn

    4. P P P Q Q Q的形式进行分析,则可得到如下结论:
      Q = P ∗ Q = P^{*} Q=P
      其中, P P P D F T DFT DFT矩阵, Q Q Q I D F T IDFT IDFT矩阵,且 P P P Q Q Q均为对称阵。
      P P P Q Q Q的第一行和第一列全为1。

    5. P P P Q Q Q应用于DFT和IDFT中,则有
      X ( k ) = D F T [ x ( n ) ] = x ( n ) ∗ P x ( n ) = I D F T [ X ( k ) ] = 1 N X ( k ) ∗ Q = 1 N x ( n ) ∗ P ∗ Q 1 N x ( n ) ∗ P ∗ Q = I N X(k) = DFT[x(n)] = x(n)*P \\ x(n) = IDFT[X(k)]=\frac{1}{N} X(k)*Q =\frac{1}{N} x(n)*P*Q \\ \frac{1}{N} x(n)*P*Q = I_{N} X(k)=DFT[x(n)]=x(n)Px(n)=IDFT[X(k)]=N1X(k)Q=N1x(n)PQN1x(n)PQ=IN
      P ∗ Q = N ∗ I N P*Q = N * I_{N} PQ=NIN
      说明 D F T DFT DFT矩阵 P P P I D F T IDFT IDFT矩阵 Q Q Q均为正交矩阵 A ∗ A H = E A*A^{H}=E AAH=E)。
      这两个矩阵的每一行(列)都是有个基,在N个方向上都有不同的基向量。
      因此, D F T DFT DFT I D F T IDFT IDFT都是一种正交变换。

    DFT在matlab

    对于matlab中的 D F T DFT DFT正变换,可使用内置函数dftmtx(n),而对于 I D F T IDFT IDFT的矩阵,可以通过 1 N ∗ d f t m t x ( N ) ∗ \frac{1}{N}*dftmtx(N)^{*} N1dftmtx(N)来得到。

    相关的代码分析

    %% Prepare
    clc;
    close all;
    clear;
    
    %% Define the signal
    N = 8;
    x = [0:N-1];
    
    %% Generate the vector of n and k
    N = length(x);
    n = [0:N-1];
    k = [0:N-1];
    
    %% Generate the twist-factor W
    imag_unit = sqrt(-1);
    W = exp(-1*imag_unit*2*pi/N);
    
    %% Generate P matrix
    P = W.^(n'*k);
    
    %% DFT transformation
    X_P = x*P;
    X_fft = fft(x);
    X_err = norm(X_P - X_fft)
    
    %% Generate Q matrix
    Q = conj(P);
    
    % IDFT transformation
    x_Q = 1/N * X_P * Q;
    x_ifft = ifft(X_fft);
    x_err = norm(x_Q - x_ifft)
    
    %% Test: P*Q == N*I_n
    I_n = eye(N);
    left = P*Q;
    right = N*I_n;
    err = norm(left - right)
    
    %% Generate P and Q using dftmtx
    P_dftmtx = dftmtx(N);
    P_err = norm(P_dftmtx - P)
    
    Q_dftmtx = conj(dftmtx(N));
    Q_err = norm(Q_dftmtx - Q)
    
    
    展开全文
  • 当您对图像进行idft时,源文件是通过dft命令创建的.idft文件。 然后它将进行逆dft运算并吐出结果。 该实用程序使用: simple_fft进行dft和idft操作: 机顶盒读取和写入图像: 例如:LokiAlan DFT dft assets/...
  • 我当年在学习FFT的时候,大部分文章都会在讲完DFT的过程之后说“对于IDFT,我们只需要把单位根全部取个共轭,最后把结果除以 nnn 就行了”之类的话,当然它们会对此做出解释:DFT的过程本质上就是在做一个线性变换,...

    注:考虑到对高中生友好的需要,本文尽量减少了对于高数和线代等前置知识的依赖。如果你是正在学习FFT的oi选手,可以放心食用。

    我当年在学习FFT的时候,大部分文章都会在讲完DFT的过程之后说“对于IDFT,我们只需要把单位根全部取个共轭,最后把结果除以 n n n 就行了”之类的话,当然它们会对此做出解释:DFT的过程本质上就是在做一个线性变换,我们对着线性变换的矩阵求个逆折腾一下就能变换回去了。
    设原始的多项式是 f ( x ) = a 0 + a 1 x + a 2 x 2 + . . . + a n − 1 x n − 1 f(x) = a_0 + a_1x + a_2x^2 + ... + a_{n-1}x^{n-1} f(x)=a0+a1x+a2x2+...+an1xn1 ,我们要对 k = 0 , 1 , . . . , n − 1 k=0,1,...,n-1 k=0,1,...,n1 b k = f ( ω k ) b_k=f(\omega^k) bk=f(ωk) (其中 ω = e 2 π i n \omega=e^{\frac{2\pi i}{n}} ω=en2πi )。这一过程可以用矩阵表示为:
    ( 1 1 1 ⋯ 1 1 ω ω 2 ⋯ ω n − 1 1 ω 2 ω 4 ⋯ ω 2 ( n − 1 ) ⋮ ⋮ ⋮ ⋱ ⋮ 1 ω n − 1 ω 2 ( n − 1 ) ⋯ ω ( n − 1 ) 2 ) ( a 0 a 1 a 2 ⋮ a n − 1 ) = ( b 0 b 1 b 2 ⋮ b n − 1 ) \left( \begin{matrix} 1 & 1 & 1 & \cdots & 1\\ 1 & \omega & \omega^2 & \cdots & \omega^{n-1}\\ 1 & \omega^2 & \omega^4 & \cdots & \omega^{2(n-1)}\\ \vdots & \vdots & \vdots & \ddots & \vdots\\ 1 & \omega^{n-1} & \omega^{2(n-1)} & \cdots & \omega^{(n-1)^2}\\ \end{matrix} \right) \left( \begin{matrix} a_0\\ a_1\\ a_2\\ \vdots\\ a_{n-1} \end{matrix} \right)= \left( \begin{matrix} b_0\\ b_1\\ b_2\\ \vdots\\ b_{n-1} \end{matrix} \right) 11111ωω2ωn11ω2ω4ω2(n1)1ωn1ω2(n1)ω(n1)2a0a1a2an1=b0b1b2bn1
    为方便起见,我们设
    V = ( 1 1 1 ⋯ 1 1 ω ω 2 ⋯ ω n − 1 1 ω 2 ω 4 ⋯ ω 2 ( n − 1 ) ⋮ ⋮ ⋮ ⋱ ⋮ 1 ω n − 1 ω 2 ( n − 1 ) ⋯ ω ( n − 1 ) 2 ) ,   α = ( a 0 a 1 a 2 ⋮ a n − 1 ) ,   β = ( b 0 b 1 b 2 ⋮ b n − 1 ) V=\left( \begin{matrix} 1 & 1 & 1 & \cdots & 1\\ 1 & \omega & \omega^2 & \cdots & \omega^{n-1}\\ 1 & \omega^2 & \omega^4 & \cdots & \omega^{2(n-1)}\\ \vdots & \vdots & \vdots & \ddots & \vdots\\ 1 & \omega^{n-1} & \omega^{2(n-1)} & \cdots & \omega^{(n-1)^2}\\ \end{matrix} \right),\ \alpha= \left( \begin{matrix} a_0\\ a_1\\ a_2\\ \vdots\\ a_{n-1} \end{matrix} \right),\ \beta= \left( \begin{matrix} b_0\\ b_1\\ b_2\\ \vdots\\ b_{n-1} \end{matrix} \right) V=11111ωω2ωn11ω2ω4ω2(n1)1ωn1ω2(n1)ω(n1)2, α=a0a1a2an1, β=b0b1b2bn1
    其中 V V V n n n 阶复矩阵, α , β \alpha,\beta α,β是两个 n n n 维复向量,那么原式可以写作 V α = β V\alpha=\beta Vα=β
    DFT的任务是给定向量 α \alpha α 求向量 β \beta β ,IDFT的任务刚好相反,是给定向量 β \beta β 求向量 α \alpha α
    等式两边同时左乘 V − 1 V^{-1} V1 ,我们有 α = V − 1 β \alpha=V^{-1}\beta α=V1β,所以看起来我们只需要求出矩阵 V V V 的逆矩阵 V − 1 V^{-1} V1 就可以了。这个时候,大部分文章都会直接告诉你:
    V − 1 = 1 n ( 1 1 1 ⋯ 1 1 ω − 1 ω − 2 ⋯ ω − ( n − 1 ) 1 ω − 2 ω − 4 ⋯ ω − 2 ( n − 1 ) ⋮ ⋮ ⋮ ⋱ ⋮ 1 ω − ( n − 1 ) ω − 2 ( n − 1 ) ⋯ ω − ( n − 1 ) 2 ) V^{-1}=\frac{1}{n}\left( \begin{matrix} 1 & 1 & 1 & \cdots & 1\\ 1 & \omega^{-1} & \omega^{-2} & \cdots & \omega^{-(n-1)}\\ 1 & \omega^{-2} & \omega^{-4} & \cdots & \omega^{-2(n-1)}\\ \vdots & \vdots & \vdots & \ddots & \vdots\\ 1 & \omega^{-(n-1)} & \omega^{-2(n-1)} & \cdots & \omega^{-(n-1)^2}\\ \end{matrix} \right) V1=n111111ω1ω2ω(n1)1ω2ω4ω2(n1)1ω(n1)ω2(n1)ω(n1)2
    并且告诉你这一事实的正确性“不难验证”(也确实不难)。然后我们就可以愉快地用与DFT几乎完全相同的方法做IDFT了。
    不过这个时候你可能并不满意——这个 V − 1 V^{-1} V1 仿佛是直接从天上掉下来的,我虽然知道它是对的,但我还想知道:它是怎么推导出来的?
    笑死,oi要什么推导过程,背板子就行了
    不过这个看起来就挺让人发怵的玩意显然不在我当年学oi的时候的能力范围之内,于是直到前几天的数学分析习题课,我才知道了这东西的推导方法——几个爆算的推法和一个降维打击的推法,接下来一一展开介绍。
    注:如果不想看繁琐的推导,可以直接跳到文章的最后一部分。

    方法1:克莱姆法则

    warning:流畅阅读这一部分内容需要一些线性代数前置知识。
    warning2:这一部分推导过于繁琐。
    这是习题课助教讲的第一个方法(大概讲了半个小时,可见有多么繁琐……)。
    我们知道,线性方程组 A x = b Ax=b Ax=b (其中 A A A n n n 阶矩阵, x , b x,b x,b是两个 n n n 维向量)有一个通用解法: x i = ∣ A i ∣ ∣ A ∣ x_i=\frac{|A_i|}{|A|} xi=AAi ,其中 A i A_i Ai 是用向量 b b b 替换 A A A 中第 i i i 列得到的矩阵。这一方法称为克莱姆法则,证明在此略去。
    我们直接利用这一方法求解,得 a i = ∣ V i ∣ ∣ V ∣ a_i=\frac{|V_i|}{|V|} ai=VVi。首先我们要求出 V V V 的行列式,容易看出 V V V 是范德蒙矩阵,因此有: ∣ V ∣ = ∏ 0 ≤ i < j < n ( ω j − ω i ) |V| = \prod_{0\leq i \lt j \lt n} (\omega^j - \omega^i) V=0i<j<n(ωjωi)。这个式子不是那么容易化简,就先这么放着。
    然后要求出 ∣ V i ∣ |V_i| Vi ,也就是:
    d e t ( 1 1 ⋯ 1 b 0 1 ⋯ 1 1 ω ⋯ ω i − 1 b 1 ω i + 1 ⋯ ω n − 1 1 ω 2 ⋯ ω 2 ( i − 1 ) b 2 ω 2 ( i + 1 ) ⋯ ω 2 ( n − 1 ) ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ 1 ω n − 1 ⋯ ω ( n − 1 ) ( i − 1 ) b n − 1 ω ( n − 1 ) ( i + 1 ) ⋯ ω ( n − 1 ) 2 ) det\left( \begin{matrix} 1 & 1 & \cdots & 1 & b_0 & 1 & \cdots & 1\\ 1 & \omega & \cdots & \omega^{i-1} & b_1 & \omega^{i+1} & \cdots & \omega^{n-1}\\ 1 & \omega^2 & \cdots & \omega^{2(i-1)} & b_2 & \omega^{2(i+1)} & \cdots & \omega^{2(n-1)}\\ \vdots & \vdots & & \vdots & \vdots & \vdots & & \vdots\\ 1 & \omega^{n-1} & \cdots & \omega^{(n-1)(i-1)} & b_{n-1} & \omega^{(n-1)(i+1)} & \cdots & \omega^{(n-1)^2}\\ \end{matrix} \right) det11111ωω2ωn11ωi1ω2(i1)ω(n1)(i1)b0b1b2bn11ωi+1ω2(i+1)ω(n1)(i+1)1ωn1ω2(n1)ω(n1)2
    我们对被替换的列进行展开,得 ∣ V i ∣ = ∑ j = 0 n − 1 ( − 1 ) i + j b j ∣ V j i ∣ |V_i|=\sum_{j=0}^{n-1} (-1)^{i+j} b_j|V_{ji}| Vi=j=0n1(1)i+jbjVji 。其中 V j i V_{ji} Vji 表示把矩阵 V V V 去掉第 j j j 行第 i i i 列得到的矩阵。
    为了求出 ∣ V j i ∣ |V_{ji}| Vji,我们还需要求这样一类矩阵的行列式:
    d e t ( 1 1 1 ⋯ 1 x 1 x 2 x 3 ⋯ x n x 1 x x 2 2 x 3 2 ⋯ x n 2 ⋮ ⋮ ⋮ ⋮ x 1 k − 1 x 2 k − 1 x 3 k − 1 ⋯ x n k − 1 x 1 k + 1 x 2 k + 1 x 3 k + 1 ⋯ x n k + 1 ⋮ ⋮ ⋮ ⋮ x 1 n x 2 n x 3 n ⋯ x n n ) det\left( \begin{matrix} 1 & 1 & 1 & \cdots & 1\\ x_1 & x_2 & x_3 & \cdots & x_n\\ x_1^x & x_2^2 & x_3^2 & \cdots & x_n^2\\ \vdots & \vdots & \vdots & & \vdots\\ x_1^{k-1} & x_2^{k-1} & x_3^{k-1} & \cdots & x_n^{k-1}\\ x_1^{k+1} & x_2^{k+1} & x_3^{k+1} & \cdots & x_n^{k+1}\\ \vdots & \vdots & \vdots & & \vdots\\ x_1^n & x_2^n & x_3^n & \cdots & x_n^n\\ \end{matrix} \right) det1x1x1xx1k1x1k+1x1n1x2x22x2k1x2k+1x2n1x3x32x3k1x3k+1x3n1xnxn2xnk1xnk+1xnn
    这类矩阵长得很像范德蒙矩阵,我们在此不加证明(因为推导实在繁琐)地给出其行列式为 e n − k ( x 1 , . . . , x n ) ∏ ( 1 ≤ i < j ≤ n ) ( x j − x i ) e_{n-k}(x_1,...,x_n) \prod_{(1\leq i \lt j \leq n)} (x_j - x_i) enk(x1,...,xn)(1i<jn)(xjxi) 。其中 e k ( x 1 , . . . . , x n ) e_k(x_1,....,x_n) ek(x1,....,xn) 表示 x 1 , . . . , x n x_1,...,x_n x1,...,xn的第 k k k 个对称多项式,即: e k ( x 1 , . . . . , x n ) = ∑ 1 ≤ i 1 < i 2 < ⋯ < i k ≤ n x i 1 x i 2 ⋯ x i k e_k(x_1,....,x_n)=\sum_{1\leq i_1\lt i_2 \lt \cdots \lt i_k \leq n} x_{i_1}x_{i_2}\cdots x_{i_k} ek(x1,....,xn)=1i1<i2<<iknxi1xi2xik
    然后带入化简,得:
    a i = ∑ j = 0 n − 1 ( − 1 ) i + j b j e n − 1 − j ( 1 , ω , ⋯   , ω i − 1 , ω i + 1 , ⋯   , ω n − 1 ) ∏ 0 ≤ k < l < n ,   k , l ≠ i ( ω l − ω k ) ∏ 0 ≤ k < l < n ( ω l − ω k ) a_i=\sum_{j=0}^{n-1} \frac{(-1)^{i+j}b_je_{n-1-j}(1,\omega,\cdots,\omega^{i-1},\omega^{i+1},\cdots,\omega^{n-1})\prod_{0\leq k \lt l\lt n,\ k,l\neq i}(\omega^l - \omega^k)}{\prod_{0\leq k \lt l\lt n}(\omega^l - \omega^k)} ai=j=0n10k<l<n(ωlωk)(1)i+jbjen1j(1,ω,,ωi1,ωi+1,,ωn1)0k<l<n, k,l=i(ωlωk)
    方便起见,设 a i = ∑ j = 0 n − 1 c i j b j a_i=\sum_{j=0}^{n-1} c_{ij}b_j ai=j=0n1cijbj,再记 e i , j = e i ( 1 , ω , ⋯   , ω j − 1 , ω j + 1 , ⋯   , ω n − 1 ) e_{i,j}=e_i(1,\omega,\cdots,\omega^{j-1},\omega^{j+1},\cdots,\omega^{n-1}) ei,j=ei(1,ω,,ωj1,ωj+1,,ωn1) ,则有:
    c i j = ( − 1 ) i + j e n − 1 − j , i ∏ i < k < n ( ω k − ω i ) ∏ 0 ≤ k < i ( ω i − ω k ) c_{ij}=\frac{(-1)^{i+j}e_{n-1-j,i}}{\prod_{i\lt k \lt n} (\omega^k - \omega^i)\prod_{0 \leq k \lt i} (\omega^i - \omega^k)} cij=i<k<n(ωkωi)0k<i(ωiωk)(1)i+jen1j,i
    = ( − 1 ) n + j + 1 e n − 1 − j , i ∏ 0 ≤ k < n ,   k ≠ i ( ω i − ω k ) =\frac{(-1)^{n+j+1}e_{n-1-j,i}}{\prod_{0\leq k \lt n,\ k\neq i} (\omega^i - \omega^k)} =0k<n, k=i(ωiωk)(1)n+j+1en1j,i
    接下来我们需要计算 e i , j e_{i,j} ei,j。由 1 , ω , ⋯   , w n − 1 1,\omega,\cdots,w^{n-1} 1,ω,,wn1 是方程 x n − 1 = 0 x^n - 1 = 0 xn1=0 的根可得 x n − 1 = ( x − 1 ) ( x − ω ) ⋯ ( x − ω n − 1 ) x^n - 1 = (x - 1)(x - \omega)\cdots(x-\omega^{n-1}) xn1=(x1)(xω)(xωn1) ,对等式右侧直接展开并比较系数,有:
    e 0 ( 1 , ω , . . . , ω n − 1 ) = 1 e_0(1,\omega,...,\omega^{n-1})=1 e0(1,ω,...,ωn1)=1
    e n ( 1 , ω , . . . , ω n − 1 ) = ( − 1 ) n + 1 e_n(1,\omega,...,\omega^{n-1})=(-1)^{n+1} en(1,ω,...,ωn1)=(1)n+1
    e i ( 1 , ω , . . . , ω n − 1 ) = 0   ( 1 ≤ i < n ) e_i(1,\omega,...,\omega^{n-1})=0\ (1 \leq i \lt n) ei(1,ω,...,ωn1)=0 (1i<n)
    再将 e i ( 1 , ω , . . . , ω n − 1 ) e_i(1,\omega,...,\omega^{n-1}) ei(1,ω,...,ωn1) 中的项分为含有 ω j \omega^j ωj 和不含有 ω j \omega^j ωj 分开考虑,可得: e i ( 1 , ω , . . . , ω n − 1 ) = e i , j + ω j e i − 1 , j e_i(1,\omega,...,\omega^{n-1})=e_{i,j}+\omega^j e_{i-1,j} ei(1,ω,...,ωn1)=ei,j+ωjei1,j
    再结合 e 0 , j = 1 e_{0,j}=1 e0,j=1,可以求出 e i , j = ( − 1 ) i ω i j e_{i,j}=(-1)^i\omega^{ij} ei,j=(1)iωij
    代回 c i j c_{ij} cij ,有: c i j = ( − 1 ) n + j + 1 ( − 1 ) n − j − 1 ω i ( n − j − 1 ) ∏ 0 ≤ k < n ,   k ≠ i ( ω i − ω k ) = ω − i ( j + 1 ) ∏ 0 ≤ k < n ,   k ≠ i ( ω i − ω k ) c_{ij}=\frac{(-1)^{n+j+1}(-1)^{n-j-1}\omega^{i(n-j-1)}}{\prod_{0\leq k \lt n,\ k\neq i} (\omega^i - \omega^k)}=\frac{\omega^{-i(j+1)}}{\prod_{0\leq k \lt n,\ k\neq i} (\omega^i - \omega^k)} cij=0k<n, k=i(ωiωk)(1)n+j+1(1)nj1ωi(nj1)=0k<n, k=i(ωiωk)ωi(j+1)
    最后只需要求出 ∏ 0 ≤ k < n ,   k ≠ i ( ω i − ω k ) {\prod_{0\leq k \lt n,\ k\neq i} (\omega^i - \omega^k)} 0k<n, k=i(ωiωk) 即可。我们注意到该式其实就是多项式 ∏ 0 ≤ k < n ,   k ≠ i ( x − ω k ) {\prod_{0\leq k \lt n,\ k\neq i} (x - \omega^k)} 0k<n, k=i(xωk) x = ω i x=\omega^i x=ωi 处的取值,而由 x n − 1 = ∏ i = 0 n − 1 ( x − ω i ) x^n - 1 = \prod_{i=0}^{n-1}(x - \omega^i) xn1=i=0n1(xωi) 我们可以立即得到 ∏ 0 ≤ k < n ,   k ≠ i ( x − ω k ) = x n − 1 x − ω i {\prod_{0\leq k \lt n,\ k\neq i} (x - \omega^k)} = \frac{x^n-1}{x-\omega^i} 0k<n, k=i(xωk)=xωixn1,直接做多项式除法就可以得到 x n − 1 x − ω i = x n − 1 + ω i x n − 2 + ⋯ + ω i ( n − 1 ) \frac{x^n-1}{x-\omega^i} = x^{n-1} + \omega^ix^{n-2}+\cdots+\omega^{i(n-1)} xωixn1=xn1+ωixn2++ωi(n1),代入 x = ω i x=\omega^i x=ωi,每一项的值都是 ω i ( n − 1 ) \omega^{i(n-1)} ωi(n1) ,故结果为 n ω i ( n − 1 ) n\omega^{i(n-1)} nωi(n1)
    最后代回 c i j c_{ij} cij ,得 c i j = ω − i ( j + 1 ) n ω i ( n − 1 ) = ω − i j n c_{ij}=\frac{\omega^{-i(j+1)}}{n\omega^{i(n-1)}}=\frac{\omega^{-ij}}{n} cij=nωi(n1)ωi(j+1)=nωij
    最后,设 n n n 阶矩阵 C = ( c 11 ⋯ c 1 n ⋮ ⋱ ⋮ c n 1 ⋯ c n n ) C=\left( \begin{matrix} c_{11} & \cdots & c_{1n}\\ \vdots & \ddots & \vdots\\ c_{n1} & \cdots & c_{nn} \end{matrix} \right) C=c11cn1c1ncnn ,由 a i = ∑ j = 0 n − 1 c i j b j a_i=\sum_{j=0}^{n-1} c_{ij}b_j ai=j=0n1cijbj ,可以立刻得到 α = C β \alpha=C\beta α=Cβ,因此矩阵 C C C 就是我们要求的 V − 1 V^{-1} V1
    如果你存活到了现在,恭喜你数理基础很强。
    这推导当然太繁琐了(而且里面很多定理的证明其实都跳过了),于是我们有接下来几种相对简单的方法:

    方法2:范德蒙矩阵求逆

    我记得习题课上助教提了一嘴这个算法,不过没有细算下去,因为你很快就会发现这和上面的爆算本质上没有区别。
    对于一般的范德蒙矩阵 A = ( 1 1 ⋯ 1 x 1 x 2 ⋯ x n x 1 2 x 2 2 ⋯ x n 2 ⋮ ⋮ ⋱ ⋮ x 1 n − 1 x 2 n − 1 ⋯ x n n − 1 ) A=\left( \begin{matrix} 1 & 1& \cdots & 1\\ x_1 & x_2 & \cdots & x_n\\ x_1^2 & x_2^2 & \cdots & x_n^2\\ \vdots & \vdots & \ddots & \vdots\\ x_1^{n-1} & x_2^{n-1} & \cdots & x_n^{n-1} \end{matrix} \right) A=1x1x12x1n11x2x22x2n11xnxn2xnn1,我们其实有通用的求逆公式:设 C = A − 1 = ( c 11 ⋯ c 1 n ⋮ ⋱ ⋮ c n 1 ⋯ c n n ) C=A^{-1}=\left( \begin{matrix} c_{11} & \cdots & c_{1n}\\ \vdots & \ddots & \vdots\\ c_{n1} & \cdots & c_{nn} \end{matrix} \right) C=A1=c11cn1c1ncnn,则 c i j = ( − 1 ) j − 1 e n − j ( x 1 , x 2 , ⋯   , x i − 1 , x i + 1 , ⋯   , x n ) ∏ 1 ≤ k ≤ n , k ≠ i ( x k − x i ) c_{ij}=\frac{(-1)^{j-1}e_{n-j}(x_1,x_2,\cdots,x_{i-1},x_{i+1},\cdots,x_n)}{\prod_{1\leq k\leq n,k\neq i} (x_k-x_i)} cij=1kn,k=i(xkxi)(1)j1enj(x1,x2,,xi1,xi+1,,xn)
    然后你会发现接下来干的事跟方法1是一样的,无非是省下了一开始通过克莱姆法则得到 c i j c_{ij} cij 的过程(当然你也可以看作方法1是用克莱姆法则强行推了一遍范德蒙矩阵求逆公式)。

    方法3:拉格朗日插值

    这是我在习题课上yy出来的推法。
    思路很简单,我们既然已经有了 f ( 1 ) , f ( ω ) , f ( ω 2 ) , ⋯   , f ( ω n − 1 ) f(1),f(\omega),f(\omega^2),\cdots,f(\omega^{n-1}) f(1),f(ω),f(ω2),,f(ωn1),本质上就是有了 f f f 这个 n − 1 n-1 n1 次多项式在 n n n 个点处的点值。我们直接套用拉格朗日插值公式,就可以得到: f ( x ) = ∑ i = 0 n − 1 b i ∏ j ≠ i ( x − ω j ) ∏ j ≠ i ( ω i − ω j ) f(x)=\sum_{i=0}^{n-1}b_i\frac{\prod_{j\neq i}(x-\omega^j)}{\prod_{j\neq i}(\omega^i - \omega^j)} f(x)=i=0n1bij=i(ωiωj)j=i(xωj)
    其中这个分子和分母我们都已经算出来了: ∏ j ≠ i ( x − ω j ) = x n − 1 + ω i x n − 2 + ⋯ + ω i ( n − 1 ) = ∑ j = 0 n − 1 ω i ( n − j − 1 ) x j ,   ∏ j ≠ i ( ω i − ω j ) = n ω i ( n − 1 ) \prod_{j\neq i}(x-\omega^j)=x^{n-1}+\omega^ix^{n-2}+\cdots+\omega^{i(n-1)}=\sum_{j=0}^{n-1}\omega^{i(n-j-1)}x^j,\ \prod_{j\neq i}(\omega^i - \omega^j)=n\omega^{i(n-1)} j=i(xωj)=xn1+ωixn2++ωi(n1)=j=0n1ωi(nj1)xj, j=i(ωiωj)=nωi(n1)
    于是可以立刻得到 f ( x ) = ∑ i = 0 n − 1 b i ∑ j = 0 n − 1 ω − i j n x j = ∑ i = 0 n − 1 ( 1 n ∑ j = 0 n − 1 ω − i j b j ) x i f(x)=\sum_{i=0}^{n-1}b_i\sum_{j=0}^{n-1}\frac{\omega^{-ij}}{n}x^j=\sum_{i=0}^{n-1}(\frac{1}{n}\sum_{j=0}^{n-1}\omega^{-ij}b_j)x^i f(x)=i=0n1bij=0n1nωijxj=i=0n1(n1j=0n1ωijbj)xi ,换句话说 a i = 1 n ∑ j = 0 n − 1 ω − i j b j a_i=\frac{1}{n}\sum_{j=0}^{n-1}\omega^{-ij}b_j ai=n1j=0n1ωijbj
    这种方法就简单多了,因为不需要繁琐的矩阵运算,也不需要计算对称多项式的值,只需要处理一下 x n − 1 x − ω i \frac{x^n-1}{x-\omega^i} xωixn1 就可以了。

    方法4:复内积

    这是习题课上助教最后讲的“降维打击”,我们可以看到原本极其繁琐的计算是怎样通过引入内积之后瞬间解决的。
    X = ( x 1 , x 2 , ⋯   , x n ) ,   Y = ( y 1 , y 2 , ⋯   , y n ) X=(x_1,x_2,\cdots,x_n),\ Y=(y_1,y_2,\cdots,y_n) X=(x1,x2,,xn), Y=(y1,y2,,yn) 是两个 n n n 维复向量,定义它们的复内积为 < X ,   Y >   = ∑ i = 1 n x i y i ‾ <X,\ Y>\ =\sum_{i=1}^n x_i\overline{y_i} <X, Y> =i=1nxiyi
    将最初的矩阵 V V V看成 n n n 个列向量并排的形式: V = ( γ 0   γ 1   ⋯   γ n − 1 ) V=(\gamma_0\ \gamma_1\ \cdots \ \gamma_{n-1}) V=(γ0 γ1  γn1) ,其中 γ i = ( 1 ω i ω 2 i ⋮ ω i ( n − 1 ) ) \gamma_i=\left( \begin{matrix} 1\\ \omega^i\\ \omega^{2i}\\ \vdots\\ \omega^{i(n-1)} \end{matrix} \right) γi=1ωiω2iωi(n1)
    则有 β = ∑ i = 0 n − 1 a i γ i \beta = \sum_{i=0}^{n-1}a_i\gamma_i β=i=0n1aiγi
    接下来一步是神来之笔:对于每个 i = 0 , ⋯   , n − 1 i=0,\cdots,n-1 i=0,,n1,等号两边同时与 γ i \gamma_i γi做复内积: < β , γ i >   =   < ∑ j = 0 n − 1 a j γ j , γ i >   = ∑ j = 0 n − 1 a i < γ j , γ i > <\beta,\gamma_i>\ =\ <\sum_{j=0}^{n-1}a_j\gamma_j,\gamma_i>\ =\sum_{j=0}^{n-1}a_i<\gamma_j,\gamma_i> <β,γi> = <j=0n1ajγj,γi> =j=0n1ai<γj,γi>
    其中, < γ i , γ j >   = ∑ k = 0 n − 1 ω i k ω j k ‾ = ∑ k = 0 n − 1 ω ( i − j ) k <\gamma_i,\gamma_j>\ =\sum_{k=0}^{n-1}\omega^{ik}\overline{\omega^{jk}}=\sum_{k=0}^{n-1}\omega^{(i-j)k} <γi,γj> =k=0n1ωikωjk=k=0n1ω(ij)k
    i = j i=j i=j 时,显然有 < γ i , γ j >   = n <\gamma_i,\gamma_j>\ =n <γi,γj> =n,否则由对称性容易看出 < γ i , γ j >   = 0 <\gamma_i,\gamma_j>\ =0 <γi,γj> =0
    因此,上述 < β , γ i > <\beta,\gamma_i> <β,γi> 的等式右边就只剩 < γ i , γ i > <\gamma_i,\gamma_i> <γi,γi> 一项了,于是我们得到 < β , γ i >   = n a i <\beta,\gamma_i>\ = na_i <β,γi> =nai。整理得 a i = 1 n ∑ j = 0 n − 1 ω − i j b j a_i=\frac{1}{n}\sum_{j=0}^{n-1}\omega^{-ij}b_j ai=n1j=0n1ωijbj
    这当然是极好的!我们几乎没有用任何线性代数知识,没有任何文中没有证明的前置知识,没有任何繁琐的计算和推导,仅引入了一个数学工具就成功解决了问题!
    什么,你说你还是看不懂?那我建议你先把学FFT的事一放,先去巩固一下你的数理基础吧

    展开全文
  • DFT计算 ,IDFT计算 基于离散傅立叶变换的数值计算 重叠添加方法
  • 文章目录1. 定义2. 变换和处理3. 函数4. 实例演示例1:单频正弦信号(整数周期采样)例2:含有...这一篇来研究如何进行利用离散傅里叶逆变换(iDFT)从频谱中恢复时域信号。 离散傅里叶逆变换 (iDFT)的定义为: x(n)=i
  • 正交频分复用(0FDM)系统的后-逆离散傅立叶变换(post-IDFT)多波束形成技术。该技术通过对空频信道相关矩阵进行特征分解获得多个特征模式,再利用空时分组码(STBC)各发射分支信号的正交性使0FDM系统形成多个post...
  • OFDM--IDFT实现

    千次阅读 2019-04-29 16:23:43
    对该序列数据进行IDFT变换,得到x(n),即OFDM符号包络的N点采样,实部送入I支路去调制载波cos(2*Π*fc*t),虚部送入Q支路去调制载波sin(2*Π*fc*t),I/Q两路射频信号叠加在一起得到OFDM调制的射频信号,送入天线发射...
  • DFT与IDFT

    万次阅读 多人点赞 2019-02-28 20:38:01
    DFT与IDFT 一.方法简介 序列x(n)(n=0,1,…N-1)的DFT定义为 X(k)=∑n=0N−1x(n)e−j2πnkN X(k)=\sum_{n=0}^{N-1}x(n)e^{-j\frac{2\pi nk}{N}} X(k)=n=0∑N−1​x(n)e−jN2πnk​ 设x(n)=a(n)+jb(n),X(k)...
  • 一分钱一分货。我编写fft和ifft的时候,下载了好多,结果都不能用。花了几十币。
  • 程序实现对图像进行DFT和IDFT处理,以及对图像进行边缘增强。压缩包中还包含相关的参考资料。

空空如也

空空如也

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

iDFT