พวกเขาเกี่ยวข้องอย่างยิ่ง ตัวอย่างของคุณไม่สามารถทำซ้ำได้เพราะคุณไม่ได้รวมข้อมูลของคุณดังนั้นฉันจะสร้างใหม่ ก่อนอื่นเรามาสร้างฟังก์ชั่นเป็นคาบ:
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 และผิวเผินลำดับของจำนวนจริงหรือซับซ้อนมีความซับซ้อน ดังนั้นเราต้องการโมดูลัสของค่าสัมประสิทธิ์ 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−−−−−−√