自然序列平方的离散傅里叶变换公式推导

自然序列平方的DFT

01 散傅里叶变换


一、前言

二、N的平方序列

  对于序列平方的离散傅里叶变换,   可以直接利用定义, 再施加一定的数学推导,   经过整理之后,   便可以得到最后的结果。  下面利用数值仿真的方法, 来验证一下这个公式是否正确。

GM1685248592_1280_800.MPG|_-9

1、推导n的DFT

from headm import *

N = 10

def D(k):
    if k == 0:
        return sum([i**1 for i in range(N)])

    W = exp(-1j*2*pi/N)**k
    return (-N)/(1-W)

ndim = [i**1 for i in range(N)]
printf(ndim)

dftn = fft.fft(ndim)
dft1 = array([D(i) for i in range(N)])
printf(abs(dftn), abs(dft1))
printf(dftn, dft1)

三、序列平方DFT

  对于自然数平方序列  下面推导一下它的离散傅里叶变换。 这是 DFT 公式,   其中 W 是  e 的 负j N 分之 2 Pi。 它有一个性质,  对于 N 的整数倍数次幂,   经过化简,   可以知道它等于 e 的 负 j, 2 Pi k, 这个数值等于 1。  这个属性待会儿在求解过程中会使用到。  

  对于序列平方的离散傅里叶变换,  其中 k 等于 0 时, 结果比较简单,  它等于 n 的平方的累加,  这里就给出了对应的结果。   下面我们推导一下,  k 不等于 0 时, 这个变化结果。

GM1685256793_1280_800.MPG|_-20

  下面为了书写方便,  先对 k=1 的情况进行推导, 后面再 利用 W 的 nk 次方替换 W n 次方。  由于在后面需要应用到 n 的离散傅里叶变换,  在这里先求 n 的 傅里叶变换。  对于上面这个系数为等差序列的等比序列的求和,  将其不同的想进行拆解,  每一行都是等比序列,  对于第一行,  根据等比序列, 可以计算出累加和等于 1 减 W 分之 W 减去 W 的 N 次方。  第二行也是一个等比序列。   它的累加和等于 首项 减去 尾项乘以等比, 再除以 1 减去 等比。  其余各项都可以推导出来。   将这些结果类加在一起,  对其进行化简。  其中 W 的 N 次方, 刚才已经说明过 它等于 1。  前面是一个等比序列的累加和,  写出它的结果,  将 W 的 N 次方更换为 1,  前面这一项等于 负一。 对于分子进行化简,  最终等于 负 N 。  至此, 我们先得到了 序列 n 的离散傅里叶变换。

GM1685257725_1280_800.MPG|_-24
  这个结果 留作后面使用。   下面推导 n 的平方的离散傅里叶变换公式。   根据公式, 继续将其展开,  利用相同的技巧, 把它展成许多等比序列之和,  我们可以写出每一组等比序列累加结果。   然后再合并这些累加和。  提出相同的分母,  里面包括有 2k 减去 1 乘以 W 的k 次方的累加,  还有一个等差序列的累加。 其中 W 的 N次方等于 1,  所以后面就是等差序列累加和,  结果等于N 减 1 的平方。   前面的累加和可以拆成两项, 后面一项是等比序列累加和, 写出它的结果。  前面一项是关于 序列 n 的 离散傅里叶变换,  这个结果前面刚刚求出, 将其代入。  对于中间的结果进行化简,  它等于 负1。   最终合并后面两项, 这是化简后的结果。  写出最终的结果。

GM1685258708_1280_800.MPG|_-26
  根据这个结果,   最终可以得到关于 k 不等于 0 时对应的离散傅里叶变换。   这是 n 的平方序列的离散傅里叶变换结果。  请注意, k 等于 0 时的表达式需要单独写出来。

GM1685258916_1280_800.MPG|_-7
▲ 图1.3.1  推导过程

▲ 图1.3.1 推导过程

四、数值验证

  下面使用 Python 程序, 验证一下这个结果是否正确。  在这里验证 N 等于 10 的时候,使用推导结果与FFT计算结果进行对比。 这是根据刚才推动的公式, 计算不同 k 时 对应的变换结果。 定义 n 平方的数组。 直接使用 FFT 计算出 结果。 利用公式计算出结果。 输出两个计算结果数值, 对比它们是否相同。 这是输出两种方法计算的结果, 可以看出使用给定的公式和 FFT 计算出的结果是一样的。  由此,验证了这个公式的正确性。

GM1685259409_1280_800.MPG|_-10

from headm import *

N = 10

def D(k):
    if k == 0: return N*(N+1)*(2*N+1)/6
    W = exp(-1j*2*pi/N)**k
    return (-N**2-(2*N-N**2)*W)/(1-W)**2

ndim = [i**2 for i in range(N)]
dftn = fft.fft(ndim)
dft1 = array([D(i) for i in range(N)])
printf(abs(dftn), abs(dft1))
printf(dftn, dft1)

  下面是计算结果:

[285.         153.90228295  77.44867398  55.80400795  47.346625
  45.          47.346625    55.80400795  77.44867398 153.90228295]
[385.         153.90228295  77.44867398  55.80400795  47.346625
  45.          47.346625    55.80400795  77.44867398 153.90228295]
[285.        +0.00000000e+00j   2.36067977+1.53884177e+02j
 -35.52786405+6.88190960e+01j -42.36067977+3.63271264e+01j
 -44.47213595+1.62459848e+01j -45.        +1.06581410e-14j
 -44.47213595-1.62459848e+01j -42.36067977-3.63271264e+01j
 -35.52786405-6.88190960e+01j   2.36067977-1.53884177e+02j]
[385.          +0.j           2.36067977+153.88417686j
 -35.52786405 +68.81909602j -42.36067977 +36.3271264j
 -44.47213595 +16.24598481j -45.          +0.j
 -44.47213595 -16.24598481j -42.36067977 -36.3271264j
 -35.52786405 -68.81909602j   2.36067977-153.88417686j]

  结 ※


  文推到了 自然序列平方的离散傅里叶变换公式, 对于和这个习题相关的参考答案进行更新。
GM1685259489_1280_800.MPG|_-2


■ 相关文献链接:

● 相关图表链接:

猜你喜欢

转载自blog.csdn.net/zhuoqingjoking97298/article/details/130911414
今日推荐