Mereka sangat terkait. Contoh Anda tidak dapat direproduksi karena Anda tidak memasukkan data Anda, jadi saya akan membuat yang baru. Pertama-tama, mari kita buat fungsi periodik:
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)
Sekarang, mari kita buat basis Fourier untuk regresi. Perhatikan bahwa, denganN= 2 k + 1, tidak masuk akal untuk membuat lebih dari N- 2 fungsi dasar, yaitu, N- 3 = 2 ( k - 1 )sinus dan cosinus non-konstan, karena komponen frekuensi yang lebih tinggi alias pada kisi-kisi seperti itu. Misalnya, frekuensi sinusk ω tidak dapat dibedakan dari costant (sinus): pertimbangkan kasus N= 3yaitu k = 1. Lagi pula, jika Anda ingin memeriksa ulang, cukup ganti N-2
ke N
dalam cuplikan di bawah ini dan lihat dua kolom terakhir: Anda akan melihat bahwa mereka sebenarnya tidak berguna (dan mereka membuat masalah untuk kecocokan, karena matriks desain sekarang tunggal ).
# 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)
Perhatikan bahwa frekuensinya tepat, tetapi amplitudo komponen bukan nol tidak (1,2,3,4). Alasannya adalah bahwa fda
fungsi-fungsi basis Fourier diskalakan dengan cara yang aneh: nilai maksimumnya bukan 1, seperti untuk basis Fourier biasa1 , dosaω x ,cosω x ,.... Ini bukan1π√ baik, karena akan menjadi dasar Fourier ortonormal, 12 π√, dosaω xπ√, cosω xπ√, ....
# FDA basis has a weird scaling
max(abs(basisMat))
plot(mybasis)
Anda jelas melihat bahwa:
- nilai maksimum kurang dari 1π√
- dasar Fourier (terpotong ke yang pertama N- 2 istilah) berisi fungsi konstan (garis hitam), sinus frekuensi yang meningkat (kurva yang sama dengan 0 pada batas domain) dan cosinus dari peningkatan frekuensi (kurva yang sama dengan 1 pada batas domain), karena seharusnya
Penskalaan basis Fourier yang diberikan oleh fda
, sehingga basis Fourier yang biasa diperoleh, mengarah ke koefisien regresi yang memiliki nilai yang diharapkan:
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")
Mari kita coba fft
sekarang: perhatikan bahwa karena Yper
adalah urutan periodik, titik terakhir tidak benar-benar menambahkan informasi (DFT urutan selalu periodik). Dengan demikian kita dapat membuang poin terakhir saat menghitung FFT. Juga, FFT hanyalah algoritma numerik cepat untuk menghitung DFT, dan DFT dari urutan bilangan real atau kompleks adalah kompleks . Jadi, kami benar-benar ingin modulus koefisien FFT:
# FFT
fft_coef <- Mod(fft(Yper[1:(N-1)]))*2/(N-1)
Kami berkembang biak dengan 2N- 1 untuk memiliki skala yang sama dengan basis Fourier 1 , dosaω x ,cosω x ,.... Jika kami tidak skala, kami masih akan memulihkan frekuensi yang benar, tetapi amplitudo semua akan diskalakan oleh faktor yang sama sehubungan dengan apa yang kami temukan sebelumnya. Sekarang mari kita plot koefisien 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: frekuensinya benar, tetapi perhatikan bahwa sekarang fungsi dasar bukan sinus dan cosinus lagi (mereka eksponensial kompleks expn i ω x, dimana dengan sayaSaya menunjukkan unit imajiner). Perhatikan juga bahwa alih-alih satu set frekuensi bukan nol (1,2,3,4) seperti sebelumnya, kami mendapat satu set (1,2,5). Alasannya adalah istilah ituxnexpn i ω x dalam ekspansi koefisien kompleks ini (dengan demikian xn kompleks) sesuai dengan dua istilah nyata Sebuahns i n ( n ω x ) + bnc o s ( n ω x ) dalam ekspansi dasar trigonometri, karena rumus Euler expi x =cosx +akuberdosax. Modulus koefisien kompleks sama dengan jumlah dalam kuadrature dari dua koefisien nyata, yaitu,| xn| = a2n+ b2n------√. Faktanya,5 = 33+ 42------√.