From 60564bada44175035f29f0899770f9eb917ed344 Mon Sep 17 00:00:00 2001 From: mcrucifix <michel.crucifix@uclouvain.be> Date: Fri, 4 Oct 2024 10:09:24 +0200 Subject: [PATCH] add noisy version of data + fix corrections --- R/mfft_real_ter.R | 47 +++++++++++++------------------------ TODO | 7 ++++-- data-raw/harmonic_sample.R | 20 +++++++++++++++- data/harmonic_sample.rda | Bin 8661 -> 8648 bytes 4 files changed, 40 insertions(+), 34 deletions(-) diff --git a/R/mfft_real_ter.R b/R/mfft_real_ter.R index 5e9880b..bd5e709 100644 --- a/R/mfft_real_ter.R +++ b/R/mfft_real_ter.R @@ -106,13 +106,12 @@ analyse <- function(xdata, nfreq, fast = TRUE, nu = NULL){ # Be X the signal for which we look for amplitude and phase # We are looking at the projection of U in the space spanned by C and S. This is - fmax <- 0.0429 q <- quarto(fmax, fmax) if (fmax > freqs[2]/2){ xx <- rbind(cos(fmax*t), sin(fmax*t)) prod <- xx %*% hx/N - # to do : techincally given that q is only 2x2 we do not need the solve function + # to do : given that q is only 2x2 we do not need the solve function # it is pretty easy to o the diagonalisation by hand. a <- solve(q, prod) phase[m] <- -atan(a[2]/a[1]) @@ -231,22 +230,6 @@ analyse <- function(xdata, nfreq, fast = TRUE, nu = NULL){ } -# cette partie doit pouvoir etre acceleree en tirant partit du fait -# que l'expression analytitque de xx%*xx est connue -# voir non-working code fmft_real.C -# Il faut utiliser l'integrale connue int_0^2pi cos(x)hann(x) -# on utilise: cos(a)cos(b) = 0.5*(cos(a+b) - cos(a-b)) etc pour toutes les comb. cossin -# et int_0^2T cos(wx) = 1/W(sin[2T]-sin[0]) , ou si on applique le produit scalaire avec fenetre Hann -# et int_0^2T cos(wx)Hann[x] = (pi^2)(pi^2-w^2T^2)(sin(wT)/wT) * (coswT) -# et int_0^2T sin(wx)Hann[x] = (pi^2)(pi^2-w^2T^2)(sin(wT)/wT) * (sin(wT)) - # sin(wT)/(wT) = 1 - # et on se rappelle que la decomposition gramschmidt - # c'est simplement, avec x_i le ie vecteur - # xn_1 = x_1 / ||x_1|| - # xn_(i+1) = x_(i+1) - sum_(j=1,i) x_(i+1)%*%x(i)/||x_(i+1)|| -# en C, cela doit reduire le temps de calcul considerablement - - #' Modified Fourier transform for real series (variant) #' #' R-coded version of the Modified Fourier Transform @@ -290,21 +273,23 @@ mfft_real_ter <- function(xdata, nfreq=5, correction=1, fast=TRUE){ if (correction == 2){ xdata_synthetic <- rep(0,N) t <- seq(N)-1 - for (i in seq(nfreq)) xdata_synthetic = xdata_synthetic + OUT$amp[i]*cos(OUT$nu[i]*t + OUT$phase[i]) - OUT2 <- analyse(xdata_synthetic, nfreq, fast) - OUT$nu = OUT$nu + (OUT$nu - OUT2$nu) - OUT$amp = OUT$amp + (OUT$amp - OUT2$amp) - OUT$phase = OUT$phase + (OUT$phase - OUT2$phase) - } else if (correction == 1){ + for (i in seq(nfreq)) xdata_synthetic = xdata_synthetic + OUT$amp[i]*cos(OUT$nu[i]*t + OUT$phase[i]) + OUT2 <- analyse(xdata_synthetic, nfreq, fast) + OUT$nu = OUT$nu + (OUT$nu - OUT2$nu) + OUT$amp = OUT$amp + (OUT$amp - OUT2$amp) + OUT$phase = OUT$phase + (OUT$phase - OUT2$phase) + } else if (correction == 1){ - for (j in seq(nfreq-1)){ - epsilon = 0 * OUT$amp[j] * Qprime(-2 * OUT$nu[j] * N2)*cos(2 * OUT$nu[j] * N2 + 2 * OUT$phase[j]) - for (s in seq(j+1, nfreq)) { + for (j in seq(nfreq)){ + epsilon = OUT$amp[j] * Qprime(-2 * OUT$nu[j] * N2)*cos(2 * OUT$nu[j] * N2 + 2 * OUT$phase[j]) + print ('epsilon') + print (epsilon) + if ((j+1) <= nfreq) { for (s in seq(j+1, nfreq)) { epsilon = epsilon + OUT$amp[s] * ( Qprime( (OUT$nu[s] - OUT$nu[j])*N2)*cos((OUT$nu[j] - OUT$nu[s])*N2 + OUT$phase[j] - OUT$phase[s] ) - Qprime(( OUT$nu[s] + OUT$nu[j])*N2)*cos((OUT$nu[j] + OUT$nu[s])*N2 + OUT$phase[j] + OUT$phase[s] ) ) - } + }} epsilon = epsilon / Qsecond0 / N2 / OUT$amp[j] OUT$nu[j] = OUT$nu[j] - epsilon @@ -312,8 +297,9 @@ mfft_real_ter <- function(xdata, nfreq=5, correction=1, fast=TRUE){ OUT <- analyse(xdata, nfreq, fast, nu = OUT$nu) } - # account for tseries scaling - OUT$nu <- OUT$nu/dt + # account for tseries scaling (i.e. uses the vaue of deltat and start encoded + # in the time series object + OUT$nu <- OUT$nu / dt OUT$phase <- OUT$phase - startx*OUT$nu # rearrange terms to avoid negative amplitudes and have phases in the right quandrant @@ -342,7 +328,6 @@ mfft_real_ter <- function(xdata, nfreq=5, correction=1, fast=TRUE){ # rename for class compatibility names(OUT) <- c("Freq","Amp","Phases") - attr(OUT, "class") <- "mfft_deco" attr(OUT, "data") <- xdata attr(OUT, "nfreq") <- nfreq diff --git a/TODO b/TODO index 7f5cac1..d2b4176 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,8 @@ -- make nicer graphs for mfft -- finalise computations for mfft_real_ter (use notebook) +- make nicer graphs for mfft <- in prgoress +- finalise computations for mfft_real_ter (use notebook) <- seems to be ok forfrequenices +- there still seems to be a bias on amplitudes that is not well corrected with the analytical methods, when there are several frequencies. As if the first components where eating a bit too much power. Not sure why, and not sure how to correct this. + But the bias is much less important with the complex version. So there must be a good mathematical reason that is not + obvious to me (in mfft_complex not quite the same power goes in omega and -omega, so maybe the explanation is there ?) - use that one only; deprecate mfft_real - work on documentation - and make a paper ! diff --git a/data-raw/harmonic_sample.R b/data-raw/harmonic_sample.R index cb3d3b0..bebfb49 100644 --- a/data-raw/harmonic_sample.R +++ b/data-raw/harmonic_sample.R @@ -3,6 +3,25 @@ t <- seq(1024) harmonic_sample_data = ts( cos(t*0.13423167+0.00) + 1.3 * cos(t*0.119432+2.314) + 0.134994 + 0.4*cos(t*0.653167) + 0.11 * cos(t*0.78913498) + rnorm(1024)*0.12 , start=0, deltat=1) +harmonic_sample_noisy <- list() + +harmonic_sample_spectrum <- list( + Amp = c(1, 1.3, 0.134994, 0.4, 0.11), + Freq = c(0.13423167, 0.119432, 0, 0.653167, 0.78913498), + Phases = c(0, 2.314, 0, 0.653167, 0)) + +attr(harmonic_sample_spectrum,"class") <- 'mfft_deco' + +harmonic_sample_noisy$data <- harmonic_sample_data +harmonic_sample_noisy$spectrum <- harmonic_sample_spectrum + + + +usethis::use_data(harmonic_sample_noisy, overwrite = TRUE) + +t <- seq(1024) +harmonic_sample_data = ts( cos(t*0.13423167+0.00) + 1.3 * cos(t*0.119432+2.314) + 0.134994 + 0.4*cos(t*0.653167) + 0.11 * cos(t*0.78913498) , start=0, deltat=1) + harmonic_sample <- list() harmonic_sample_spectrum <- list( @@ -16,5 +35,4 @@ harmonic_sample$data <- harmonic_sample_data harmonic_sample$spectrum <- harmonic_sample_spectrum - usethis::use_data(harmonic_sample, overwrite = TRUE) diff --git a/data/harmonic_sample.rda b/data/harmonic_sample.rda index 31e97dcdf5f4b4672d2e61dba04010239a9becdc..aef1bb47e236ae0c4327aa3f946e5de953cbf3a7 100644 GIT binary patch literal 8648 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 aW)o?6dN^5?!gd|&{ugpZI8czGN+u$)=)0K! literal 8661 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 -- GitLab