They are strongly related. Your example is not reproducible because you didn't include your data, thus I'll make a new one. First of all, let's create a periodic function:
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)
Now, let's create a Fourier basis for regression. Note that, with N=2k+1, it doesn't really make sense to create more than N−2 basis functions, i.e., N−3=2(k−1) non-constant sines and cosines, because higher frequency components are aliased on such a grid. For example, a sine of frequency kω is indistinguishable from a costant (sine): consider the case of N=3, i.e., k=1. Anyway, if you want to double check, just change N-2
to N
in the snippet below and look at the last two columns: you'll see that they're actually useless (and they create issues for the fit, because the design matrix is now singular).
# 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)
Note that the frequencies are exactly the right ones, but the amplitudes of nonzero components are not (1,2,3,4). The reason is that the fda
Fourier basis functions are scaled in a weird way: their maximum value is not 1, as it would be for the usual Fourier basis 1,sinωx,cosωx,…. It's not 1π√ either, as it would have been for the orthonormal Fourier basis, 12π√,sinωxπ√,cosωxπ√,….
# FDA basis has a weird scaling
max(abs(basisMat))
plot(mybasis)
You clearly see that:
- the maximum value is less than 1π√
- the Fourier basis (truncated to the first N−2 terms) contains a constant function (the black line), sines of increasing frequency (the curves which are equal to 0 at the domain boundaries) and cosines of increasing frequency (the curves which are equal to 1 at the domain boundaries), as it should be
Simply scaling the Fourier basis given by fda
, so that the usual Fourier basis is obtained, leads to regression coefficients having the expected values:
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")
Essayons fft
maintenant: notez que puisqu'il Yper
s'agit d'une séquence périodique, le dernier point n'ajoute pas vraiment d'informations (la DFT d'une séquence est toujours périodique). Ainsi, nous pouvons ignorer le dernier point lors du calcul de la FFT. De plus, la FFT n'est qu'un algorithme numérique rapide pour calculer la DFT, et la DFT d'une séquence de nombres réels ou complexes est complexe . Ainsi, nous voulons vraiment les modules des coefficients FFT:
# FFT
fft_coef <- Mod(fft(Yper[1:(N-1)]))*2/(N-1)
On multiplie par 2N- 1 afin d'avoir la même mise à l'échelle qu'avec la base de Fourier 1 , péchéω x ,cosω x ,…. Si nous n'étions pas à l'échelle, nous récupérerions toujours les fréquences correctes, mais les amplitudes seraient toutes mises à l'échelle par le même facteur par rapport à ce que nous avons trouvé auparavant. Voyons maintenant les coefficients fft:
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")
Ok: les fréquences sont correctes, mais notez que maintenant les fonctions de base ne sont plus des sinus et des cosinus (ce sont des exponentielles complexes expn i ω x, où avec jeJe dénote l'unité imaginaire). Notez également qu'au lieu d'un ensemble de fréquences non nulles (1,2,3,4) comme auparavant, nous avons obtenu un ensemble (1,2,5). La raison en est qu'un termeXnexpn i ω x dans cette expansion de coefficient complexe (donc Xn est complexe) correspond à deux termes réels unens i n ( n ω x ) + bnc o s ( n ω x ) dans l'expansion de la base trigonométrique, en raison de la formule d'Euler expi x =cosx +isinX. Le module du coefficient complexe est égal à la somme en quadrature des deux coefficients réels, c'est-à-dire| Xn| = a2n+ b2n------√. À vrai dire,5 = 33+ 42------√.