我试图了解离散傅里叶变换(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
,但是条目的顺序改变了。第一个条目仍然是第一个条目,但其他条目混合在一起。谁能解释为什么会这样或我在做什么错?
非常感谢您的帮助!
答案 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
在一组数字上使用两次时,也会以相同的方式更改顺序。