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