它们密切相关。您的示例不可复制,因为您没有包含数据,因此我将重新制作一个。首先,让我们创建一个周期函数:
T <- 10
omega <- 2*pi/T
N <- 21
x <- seq(0, T, len = N)
sum_sines_cosines <- function(x, omega){
sin(omega*x)+2*cos(2*omega*x)+3*sin(4*omega*x)+4*cos(4*omega*x)
}
Yper <- sum_sines_cosines(x, omega)
Yper[N]-Yper[1] # numerically 0
x2 <- seq(0, T, len = 1000)
Yper2 <- sum_sines_cosines(x2, omega)
plot(x2, Yper2, col = "red", type = "l", xlab = "x", ylab = "Y")
points(x, Yper)
N=2k+1N−2N−3=2(k−1)kωN=3k=1。无论如何,如果要仔细检查,只需更改N-2
为N
下面的代码片段,然后查看最后两列:您会发现它们实际上是无用的(并且它们会产生拟合问题,因为设计矩阵现在是单个的)。
# Fourier Regression with fda
library(fda)
mybasis <- create.fourier.basis(c(0,T),N-2)
basisMat <- eval.basis(x, mybasis)
FDA_regression <- lm(Yper ~ basisMat-1)
FDA_coef <-coef(FDA_regression)
barplot(FDA_coef)
fda
1,sinωx,cosωx,…1π√12π√,sinωxπ√,cosωxπ√,…
# FDA basis has a weird scaling
max(abs(basisMat))
plot(mybasis)
您清楚地看到:
- 1π√
- N−2
只需按比例缩放由给出的傅立叶基础fda
,以便获得通常的傅立叶基础,则会得出具有期望值的回归系数:
basisMat <- basisMat/max(abs(basisMat))
FDA_regression <- lm(Yper ~ basisMat-1)
FDA_coef <-coef(FDA_regression)
barplot(FDA_coef, names.arg = colnames(basisMat), main = "rescaled FDA coefficients")
fft
现在让我们尝试:请注意,由于这Yper
是一个周期性序列,最后一点实际上并没有添加任何信息(序列的DFT始终是周期性的)。因此,我们可以在计算FFT时丢弃最后一点。而且,FFT只是计算DFT的快速数值算法,实数或复数序列的DFT是复杂的。因此,我们确实想要FFT系数的模数:
# FFT
fft_coef <- Mod(fft(Yper[1:(N-1)]))*2/(N-1)
2N−11,sinωx,cosωx,…
fft_coef <- fft_coef[1:((N-1)/2)]
terms <- paste0("exp",seq(0,(N-1)/2-1))
barplot(fft_coef, names.arg = terms, main = "FFT coefficients")
expniωxixnexpniωxxnansin(nωx)+bncos(nωx)expix=cosx+isinx|xn|=a2n+b2n−−−−−−√5=33+42−−−−−−√