DFT之后条目的顺序发生了变化

时间:2018-10-03 09:09:49

标签: r matrix dft

我试图了解离散傅里叶变换(DFT)的工作原理。我生成一些数据

 n<-5
 set.seed(100)
 x<-rnorm(n)

和我用来计算DFT的正交矩阵

 omega<-exp(-2*pi*1i/n)
 E<-n^(-1/2)*omega^(0:(n-1)*matrix(0:(n-1),n,n,byrow=TRUE))
 round(Re(crossprod(E,Conj(E))),15)

DFT由

给出
 x%*%t(E)

实际上,我们可以检查它是否与fft

给出的结果一致
 round(n^(-1/2)*fft(x),10)==round(x%*%t(E),10)

现在我应该可以使用{p> 1

x

但这给了

[1] -0.50219235 0.11697127 0.88678481 -0.07891709 0.13153117

Re(colSums(c(x%*%t(E))*E)) 等于

[1] -0.50219235 0.13153117 -0.07891709 0.88678481 0.11697127

所以我恢复了x,但是条目的顺序改变了。第一个条目仍然是第一个条目,但其他条目混合在一起。谁能解释为什么会这样或我在做什么错?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

DFT矩阵不正交,因此矩阵的转置不等于逆。因此,您不会通过乘以矩阵的转置来撤销运算。

由于矩阵是对称的,转置是相同的,因此您要做的就是将向量乘以矩阵平方。该矩阵的平方确实是正交的,并因此充当坐标平移(即,条目的顺序已更改)。

round( Re( E %*% E ), 10)
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    0    0    0    0
## [2,]    0    0    0    0    1
## [3,]    0    0    0    1    0
## [4,]    0    0    1    0    0
## [5,]    0    1    0    0    0

此矩阵是对称和正交的,因此等于其自身的转置和逆。

您的代码和设置正确;并且可以确认是否可以使用内置的快速傅立叶变换功能fft

Re(fft(fft(1:10)))/10
##  [1]  1 10  9  8  7  6  5  4  3  2

在一组数字上使用两次时,也会以相同的方式更改顺序。