From 1e7712c64ed96f3f1660c397a20700328b64f5b9 Mon Sep 17 00:00:00 2001
From: mcrucifix <michel.crucifix@uclouvain.be>
Date: Wed, 16 Oct 2024 15:29:09 +0200
Subject: [PATCH] introduce develop method + changed data

---
 NAMESPACE                       |  11 +++---
 R/data_description.R            |   6 +--
 R/mfft_complex.R                |   6 +--
 R/mfft_real.R                   |   8 ++--
 R/mfft_support.R                |  67 ++++++++++++++++++++++----------
 data-raw/harmonic_sample.R      |  15 +++----
 data-raw/pseudo_log.R           |   6 +--
 data/harmonic_sample.rda        | Bin 8648 -> 8669 bytes
 data/harmonic_sample_noisy.rda  | Bin 8669 -> 8688 bytes
 data/pseudo_log.rda             | Bin 655 -> 442 bytes
 man/harmonic_sample.Rd          |   2 +-
 man/harmonic_sample_noisy.Rd    |   2 +-
 man/mfft.Rd                     |   2 +-
 man/mfft_complex.Rd             |   2 +-
 man/mfft_deco.Rd                |  44 ---------------------
 man/mfft_real.Rd                |   6 +--
 man/pseudo_log.Rd               |   2 +-
 notebook/mfft_random_test.ipynb |   8 ++--
 18 files changed, 84 insertions(+), 103 deletions(-)
 delete mode 100644 man/mfft_deco.Rd

diff --git a/NAMESPACE b/NAMESPACE
index 072919d..54a74e7 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -1,17 +1,19 @@
 # Generated by roxygen2: do not edit by hand
 
-S3method(as.data.frame,mfft_deco)
-S3method(lines,mfft_deco)
+S3method(as.data.frame,discreteSpectrum)
+S3method(develop,discreteSpectrum)
+S3method(lines,discreteSpectrum)
 S3method(plot,SSAObject)
+S3method(plot,discreteSpectrum)
 S3method(plot,memObject)
-S3method(plot,mfft_deco)
 S3method(plot,periodogram)
 S3method(plot,wavelet)
-S3method(print,mfft_deco)
+S3method(print,discreteSpectrum)
 export(approx_ts)
 export(arspec)
 export(attributeTones)
 export(cwt_morlet)
+export(develop)
 export(hilbert_extension)
 export(mem)
 export(mfft)
@@ -21,7 +23,6 @@ export(mfft_real)
 export(mmfft)
 export(periodogram)
 export(powerspectrum.wavelet)
-export(reconstruct_mfft)
 export(reconstruct_morlet)
 export(ssa)
 export(toneCombinations)
diff --git a/R/data_description.R b/R/data_description.R
index 787a357..1255adf 100644
--- a/R/data_description.R
+++ b/R/data_description.R
@@ -2,7 +2,7 @@
 #'
 #' A simple time series for testing purposes
 #' 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) 
-#' for t from 0 to 1023. It is coded as a `mfft_deco` objcet and self-describes its spectral decomposition. 
+#' for t from 0 to 1023. It is coded as a `discreteSpectrum` objcet and self-describes its spectral decomposition. 
 #'
 #' @docType data
 #' @keywords datasets
@@ -14,7 +14,7 @@ NULL
 #'
 #' Same has harmonic sample but with an added random time series
 #' 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
-#' for t from 0 to 1023. It is coded as a `mfft_deco` objcet and self-describes its spectral decomposition. 
+#' for t from 0 to 1023. It is coded as a `discreteSpectrum` objcet and self-describes its spectral decomposition. 
 #'
 #' @docType data
 #' @keywords datasets
@@ -26,7 +26,7 @@ NULL
 #'
 #' A truncated version (squared-shape) version of a harmonic signal for mimicking a sedimentary log
 #' sign( 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) + 0.8))
-#' for t from 0 to 8191. It is coded as a `mfft_deco` objcet and self-describes its spectral decomposition. 
+#' for t from 0 to 8191. It is coded as a `discreteSpectrum` objcet and self-describes its spectral decomposition. 
 #' @docType data
 #' @keywords datasets
 #' @name pseudo_log
diff --git a/R/mfft_complex.R b/R/mfft_complex.R
index d8fedd7..78a3305 100644
--- a/R/mfft_complex.R
+++ b/R/mfft_complex.R
@@ -22,7 +22,7 @@
 #' not documented for real time series
 #' @param nfreq is the number of frequencies returned, must be smaller that the length of  xdata.
 #' @param force_complex : use the complex number implementation even if the time series is real. 
-#' @return a `mfft_deco` object, based on a data.frame with columns "Freq", "Ampl" and "Phases". 
+#' @return a `discreteSpectrum` object, based on a data.frame with columns "Freq", "Ampl" and "Phases". 
 #'         note that because of a language glitch (to be fixed), "Freq" actually means "Rate"
 #' @author Michel Crucifix for the R code, and David Nesvorny for most of the supporting C code doing the
 #'         Frequency Modified Fourier transform  for Complex Numbers
@@ -56,7 +56,7 @@ mfft <- function(xdata, nfreq=15, minfreq=NULL, maxfreq=NULL, correction=1, forc
 #' the third algorithm should be in general much more precise).  
 #' The computed frequencies are in the range given by minfreq and maxfreq.
 #' @param nfreq is the number of frequencies returned, must be smaller that the length of  xdata.
-#' @return a `mfft_deco` object, based on a data.frame with columns "Freq", "Ampl" and "Phases". 
+#' @return a `discreteSpectrum` object, based on a data.frame with columns "Freq", "Ampl" and "Phases". 
 #'         note that because of a language glitch (to be fixed), "Freq" actually means "Rate"
 #' @author Michel Crucifix for the R code, and David Nesvorny for most of the supporting C code doing the
 #' actual computations
@@ -104,7 +104,7 @@ mfft_complex <- function(xdata, nfreq=30,  minfreq=NULL, maxfreq=NULL, correctio
      # corresponding to the same amplitude
      OUT <- data.frame(Freq=Freq, Amp=Ampl, Phases=Phase)
 
-     class(OUT) <- c("mfft_deco", "data.frame")
+     class(OUT) <- c("discreteSpectrum", "data.frame")
      attr(OUT,"nfreq") <- nfreq
      attr(OUT,"data") <- xdata
 
diff --git a/R/mfft_real.R b/R/mfft_real.R
index b8f60c3..2f9fc87 100644
--- a/R/mfft_real.R
+++ b/R/mfft_real.R
@@ -342,15 +342,15 @@ mfft_analyse <- function(xdata, nfreq, fast = TRUE, nu = NULL, minfreq=NULL, max
 #' @param nfreq is the number of frequencies returned, must be smaller that the length of  xdata.
 #' @param fast (default = TRUE) uses analytical formulations for the crossproducts involving sines and cosines. 
 #'        note: this is not really faster because the bottleneck is actually the goden section search. But more elegant. 
-#' @return a `mfft_deco` object, based on a data.frame with columns "Freq", "Ampl" and "Phases". 
+#' @return a `discreteSpectrum` object, based on a data.frame with columns "Freq", "Ampl" and "Phases". 
 #' @author Michel Crucifix
 #' @references
 #' \insertRef{sidlichovsky97aa}{gtseries}
 #' @examples
 #' 
 #' data(harmonic_sample)
-#' spectrum <- mfft_real(harmonic_sample$data)
-#' print(spectrum)
+#' spec <- mfft_real(harmonic_sample$data)
+#' print(spec)
 #'
 #' @export mfft_real
 mfft_real <- function(xdata, nfreq=5,  minfreq=NULL, maxfreq=NULL, correction = 1 , fast=TRUE){
@@ -430,7 +430,7 @@ mfft_real <- function(xdata, nfreq=5,  minfreq=NULL, maxfreq=NULL, correction =
 
     # rename for class compatibility
     names(OUT) <- c("Freq","Amp","Phases")
-    class(OUT) <- c("mfft_deco", "data.frame")
+    class(OUT) <- c("discreteSpectrum", "data.frame")
     attr(OUT, "data")  <- xdata
     attr(OUT, "nfreq")  <- nfreq
     return(OUT)
diff --git a/R/mfft_support.R b/R/mfft_support.R
index cb8dfc7..b468684 100644
--- a/R/mfft_support.R
+++ b/R/mfft_support.R
@@ -1,27 +1,54 @@
 #' MFFT reconstruction
 #' @importFrom stats deltat start
-#' @rdname mfft_deco
-#' @param  M : mfft_deco object 
-#' @param  sum : TRUE if user wants to sum components in the reconstruction
-#' @export reconstruct_mfft
+#' @param  M : discreteSpectrum object 
+#' @param  times: if supplied, times of the decomposition
+#' @param  start: if supplied, overrides time and will generate a time series with start and deltat, which must then
+#'         be supplied as well
+#' @param  deltat : see start. 
+#' @param  sum : TRUE if user wants to sum components %in% the reconstruction
+#' @note   if none if times, start and deltat are supplied, will reconstruct based on the attribute `xdata`
+#'         which must then be present. If no `xdata` is availble, return an error. 
 #' @return list of reconstructed components if sum=FALSE,  full
 #'         reconstructed time series otherwise
-reconstruct_mfft  <- function(M, sum=TRUE){
- if (!(attr(M,"class")=="mfft_deco")) stop ("object is not a MFFT decomposition")
+#' @method develop discreteSpectrum
+#' @export
+develop.discreteSpectrum  <- function(M, times=NULL, start=NULL, end=NULL, deltat=NULL, sum=TRUE){
+ if (!("discreteSpectrum" %in% class(M))) stop ("object is not a discreteSpectrum decomposition")
+
+ timesIsATseries = FALSE
+ if (!is.null(start)){
+   if (is.null(deltat) || is.null(end)) stop ("if you supply start, you must also supply deltat and end");
+   times <- start + seq((end - start) %/% deltat) * deltat
+   timesIsATseries = TRUE
+ }
+
+ if (is.null(times)){
+   if (is.null(attr(M,"data"))) stop ("if you do not supply any time argument (times, or (start, end, deltat)), then object must have a valid data attribute")
  xdata <- attr(M,"data")
+ start <- stats::start(xdata)
+ deltat <- stats::deltat(deltat)
+ times <- (seq(length(xdata))-1) * stats::deltat(xdata) + stats::start(xdata)[1]
+ timesIsATseries = TRUE
+ }
+
  nfreq <- attr(M,"nfreq")
- times <- seq(length(xdata))*stats::deltat(xdata) + stats::start(xdata)[1]
- reconstructed <- lapply(seq(nfreq), function(i) ts( M$Amp[i]*cos(M$Freq[i]*times + M$Phase[i]), start=stats::start(xdata), deltat=stats::deltat(xdata)) )
+ if (is.null(nfreq)) nfreq <- length(M$Amp)
+ if (timesIsATseries){
+   reconstructed <- lapply(seq(nfreq), function(i) ts( M$Amp[i] * cos(M$Freq[i] * times + M$Phase[i]), start=start, deltat=deltat) )} 
+ else {
+   reconstructed <- lapply(seq(nfreq), function(i) M$Amp[i] * cos(M$Freq[i] * times + M$Phase[i]))
+ }
 
  if ( sum ) reconstructed <- ts(apply(simplify2array(reconstructed), 1 , sum), start=stats::start(xdata), deltat=stats::deltat(xdata))
+ return(reconstructed)
 }
 
 #' MFFT ANOVA
 #' not ready. do not use. 
-#' @rdname mfft_deco
+#' @rdname discreteSpectrum
 #' @export mfft_anova
 mfft_anova  <- function(M){
- if (!(attr(M,"class")=="mfft_deco")) stop ("object is not a MFFT decomposition")
+ if (!("discreteSpectrum" %in% class(M))) stop ("object is not a discreteSpectrum decomposition")
  xdata <- attr(M,"xdata")
  nfreq <- attr(M,"nfreq")
  N <- length(xdata)
@@ -37,17 +64,17 @@ mfft_anova  <- function(M){
 }
 
 
-#' @rdname mfft_deco
+#' @rdname discreteSpectrum
 #' @export
-as.data.frame.mfft_deco <- function(x) {data.frame(Freq=x$Freq, Amp=x$Amp, Phases=x$Phases)}
+as.data.frame.discreteSpectrum <- function(x) {data.frame(Freq=x$Freq, Amp=x$Amp, Phases=x$Phases)}
 
 
-#' @rdname mfft_deco
-#' @param a `mfft_deco` object, typically the output of a `mfft` call. 
+#' @rdname discreteSpectrum
+#' @param a `discreteSpectrum` object, typically the output of a `mfft` call. 
 #' @param labels to be set above the frequency peaks. Can be the output of `attributeTone`
 #' @param periods if TRUE will add a lower axis with period labels
 #' @export
-plot.mfft_deco <- function (M,periods=FALSE,labels=NULL,...){
+plot.discreteSpectrum <- function (M,periods=FALSE,labels=NULL,...){
 #   O <- order(M$Freq)
   plot(abs(M$Freq), abs(M$Amp),'h',ylab="Amplitudes", xlab="",  ...)
   if (periods) {
@@ -60,25 +87,25 @@ plot.mfft_deco <- function (M,periods=FALSE,labels=NULL,...){
   } else {
     mtext("Rate", 1, 3)
   }
-  points(abs(M$Freq), abs(M$Amp),'p',...)
+  # points(abs(M$Freq), abs(M$Amp),'p',...)
   if (!is.null(labels)) {
     yshift <- 0.05*diff(range(M$Amp))
     text(M$Freq, M$Amp, labels, srt=90, , adj=-0.4)
   }
 }
 
-#' @rdname mfft_deco
+#' @rdname discreteSpectrum
 #' @export
-lines.mfft_deco <- function (M,...){
+lines.discreteSpectrum <- function (M,...){
 #   O <- order(M$Freq)
   lines(abs(M$Freq), abs(M$Amp),'h',...)
   points(abs(M$Freq), abs(M$Amp),'p',...)
 }
 
 
-#' @rdname mfft_deco
+#' @rdname discreteSpectrum
 #' @export
-print.mfft_deco <- function (M,...){
+print.discreteSpectrum <- function (M,...){
   print.data.frame(cbind(as.data.frame(M), Period=2*pi/M$Freq))
 }
 
diff --git a/data-raw/harmonic_sample.R b/data-raw/harmonic_sample.R
index bebfb49..4c2eaff 100644
--- a/data-raw/harmonic_sample.R
+++ b/data-raw/harmonic_sample.R
@@ -10,12 +10,10 @@ harmonic_sample_spectrum <- list(
   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
-
+class(harmonic_sample_spectrum) <- 'discreteSpectrum'
 
+harmonic_sample_noisy <- harmonic_sample_spectrum
+attr(harmonic_sample_noisy,"data") <- harmonic_sample_data
 
 usethis::use_data(harmonic_sample_noisy, overwrite = TRUE)
 
@@ -29,10 +27,9 @@ harmonic_sample_spectrum <- list(
   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$data <- harmonic_sample_data
-harmonic_sample$spectrum <- harmonic_sample_spectrum
+class(harmonic_sample_spectrum) <- 'discreteSpectrum'
 
+harmonic_sample <- harmonic_sample_spectrum
+attr(harmonic_sample,"data") <- harmonic_sample_data
 
 usethis::use_data(harmonic_sample, overwrite = TRUE)
diff --git a/data-raw/pseudo_log.R b/data-raw/pseudo_log.R
index 87bfda7..b9af3bb 100644
--- a/data-raw/pseudo_log.R
+++ b/data-raw/pseudo_log.R
@@ -13,10 +13,10 @@ pseudo_log_spectrum <- list(
   Phases = c(0, 2.314, 0, 0.653167, 0))
 
 
-attr(pseudo_log_spectrum,"class") <- 'mfft_deco'
+class(pseudo_log_spectrum) <- 'discreteSpectrum'
 
-pseudo_log$data <- pseudo_log_data
-pseudo_log$spectrum <- pseudo_log_spectrum
+pseudo_log_spectrum <- pseudo_log_spectrum
+attr(pseudo_log,"data")  <- pseudo_log_data
 
 
 usethis::use_data(pseudo_log, overwrite = TRUE)
diff --git a/data/harmonic_sample.rda b/data/harmonic_sample.rda
index aef1bb47e236ae0c4327aa3f946e5de953cbf3a7..9ed91e93363079b3f9c90940999733c0fe462705 100644
GIT binary patch
literal 8669
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

literal 8648
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
aW)o?6dN^5?!gd|&{ugpZI8czGN+u$)=)0K!

diff --git a/data/harmonic_sample_noisy.rda b/data/harmonic_sample_noisy.rda
index 7c8b13fda68bcc9b72f28963720e56a215cc48a7..5e41cdae53d231f3a67cd6bfede311246d95af15 100644
GIT binary patch
literal 8688
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
O@pmLsg$W0{AWpDS<nCVp

literal 8669
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

diff --git a/data/pseudo_log.rda b/data/pseudo_log.rda
index 8c9055c8e5cc584113d980757aca23b3183f6f7a..e3c8be88bda306321c36b06b10da5bb57b7027ec 100644
GIT binary patch
delta 433
zcmV;i0Z#sp1-b)&LRx4!F+o`-Q(1uJ5c>dJfPaYoF-QPF01yDg01!Z~gw6l}0Kfsz
z1719y5-N%eX^6r!zyJY_F&IXe000tts;IyK000RTqtx_G88Anv(Xv3Ps-~p$N2JIM
zgV36L^#5Q0=il0M>1=I-bhBZ$@8!>p%XRd7y9ZkU2kvKobk6HA0ppiTKA9hD9E&gk
z$HR^`xVZwJkRsywz(5Hh5MT)imr3^VJ?TyUTU}*JO32*$&H6FYutGp2tH8Km+ii^k
z2DT_GX4#a+Wiu!!tSBVOY@=3I*+Ug8V!@({GzP3~h$2l4MAnMMgpGojn5|}}rHCMn
zhEXk}RgI~CViBY^En6cPtSfD)w$c`>U{KkyO|xy1&4q1Rg&A8_jbkNHYb9F7#)8ro
z$*pW{sI3?^s~clj4N<l<XthSF#<dtL0@&1Tl*W~9t1E42(SV{h(TSRfHB(Vq)){D#
zq-hB@nlVvU#;DmNWQ@{~v14f3sVRkmqOrB84M=SgZ5B2)8*M?D)XkL5gtbbU5EYYN
b0u~iUlD0Dm7`5lW-@@)lrwS4f9HJj!f)2pF

delta 647
zcmV;20(kwp1CIrNLRx4!F+o`-Q(1k>SL^^>+5hkVad<#cVGs!AfKX+x$Nv~e3W)Fk
z1+WGHBn2Qw5zqtP1h^6?1VlnK88QrpngO5y8Vvv&O%T%{9B9drgkk}N&|nimpk&FT
zCPN4eB=uEPWEf2vU=V20p_2dvXwjh2ki;>@jF}ilAQ(-51_3l0227eVWH5lj6-d+(
zqX^K@4FRBN$j|`Mqd)^{Z07z5000|0oNXO_4PHA~a<XdVP*efckw8~l9CDf%js`4Y
z2JRae?`jt1<ISEX<Ol!&Y2?7d$0h(|gfyXaVGsZVnT4f}2KL?tbCy8ZQd6h#!A=jp
zA(9{!Kpm)mR0VVGD=YyWOb`ve-U*Bw`}!GpJ=xyFp~JoQ<a)lFyI+mXbGxh{3W=vE
zs^>_GbZmdOFVbR8ti~p;y#ts=;T$51gtp2^xvetD45`)JR1nh9CUiYH$s{$@`~_Me
z#tu@Z_BBzXa@=Yyz7INi&%qW3IP(-a-}nQC5degL04tx6&GK_-W#Wv*$r=i(BoK*0
zijA$cqSdVyv{e*pilnrgMPo+VD%2IRV9`Yy16DS~5hjKrYeizhM!`%>R<l!5#1KZq
zD3;Nx#?-M0(i;}7lGUg{rCJqY0%}kKfKft)MN%YCDQTc65|jp!GF1k$Rjh1iEg@{0
z*2damiqV5wv9>jU)f;0*i&Sc?Yf-9;07?x4r3f)nw3MinlL16+qZ2g{YAjKis?#Ye
zC1j~BjToq_V^nOBvPNl0Sh2KiRFuNOQCQm42BbE&iyIn^wxHImTG}mbQeg{9RZ)|V
h0Tvrnkpj~-5ltz@nA;4z{mviwyOJrwgoEx{zhDGk5w`#U

diff --git a/man/harmonic_sample.Rd b/man/harmonic_sample.Rd
index beaa588..21e0e93 100644
--- a/man/harmonic_sample.Rd
+++ b/man/harmonic_sample.Rd
@@ -10,6 +10,6 @@ data(harmonic_sample)
 \description{
 A simple time series for testing purposes
 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) 
-for t from 0 to 1023. It is coded as a `mfft_deco` objcet and self-describes its spectral decomposition.
+for t from 0 to 1023. It is coded as a `discreteSpectrum` objcet and self-describes its spectral decomposition.
 }
 \keyword{datasets}
diff --git a/man/harmonic_sample_noisy.Rd b/man/harmonic_sample_noisy.Rd
index cc57b10..adda2d5 100644
--- a/man/harmonic_sample_noisy.Rd
+++ b/man/harmonic_sample_noisy.Rd
@@ -10,6 +10,6 @@ data(harmonic_sample_noisy)
 \description{
 Same has harmonic sample but with an added random time series
 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
-for t from 0 to 1023. It is coded as a `mfft_deco` objcet and self-describes its spectral decomposition.
+for t from 0 to 1023. It is coded as a `discreteSpectrum` objcet and self-describes its spectral decomposition.
 }
 \keyword{datasets}
diff --git a/man/mfft.Rd b/man/mfft.Rd
index 5d229ac..6ab12cd 100644
--- a/man/mfft.Rd
+++ b/man/mfft.Rd
@@ -31,7 +31,7 @@ The computed frequencies are in the range given by minfreq and maxfreq.}
 not documented for real time series}
 }
 \value{
-a `mfft_deco` object, based on a data.frame with columns "Freq", "Ampl" and "Phases". 
+a `discreteSpectrum` object, based on a data.frame with columns "Freq", "Ampl" and "Phases". 
         note that because of a language glitch (to be fixed), "Freq" actually means "Rate"
 }
 \description{
diff --git a/man/mfft_complex.Rd b/man/mfft_complex.Rd
index 0afdc3b..92d9201 100644
--- a/man/mfft_complex.Rd
+++ b/man/mfft_complex.Rd
@@ -25,7 +25,7 @@ the third algorithm should be in general much more precise).
 The computed frequencies are in the range given by minfreq and maxfreq.}
 }
 \value{
-a `mfft_deco` object, based on a data.frame with columns "Freq", "Ampl" and "Phases". 
+a `discreteSpectrum` object, based on a data.frame with columns "Freq", "Ampl" and "Phases". 
         note that because of a language glitch (to be fixed), "Freq" actually means "Rate"
 }
 \description{
diff --git a/man/mfft_deco.Rd b/man/mfft_deco.Rd
deleted file mode 100644
index b85616c..0000000
--- a/man/mfft_deco.Rd
+++ /dev/null
@@ -1,44 +0,0 @@
-% Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/mfft_support.R
-\name{reconstruct_mfft}
-\alias{reconstruct_mfft}
-\alias{mfft_anova}
-\alias{as.data.frame.mfft_deco}
-\alias{plot.mfft_deco}
-\alias{lines.mfft_deco}
-\alias{print.mfft_deco}
-\title{MFFT reconstruction}
-\usage{
-reconstruct_mfft(M, sum = TRUE)
-
-mfft_anova(M)
-
-\method{as.data.frame}{mfft_deco}(x)
-
-\method{plot}{mfft_deco}(M, periods = FALSE, labels = NULL, ...)
-
-\method{lines}{mfft_deco}(M, ...)
-
-\method{print}{mfft_deco}(M, ...)
-}
-\arguments{
-\item{M}{: mfft_deco object}
-
-\item{sum}{: TRUE if user wants to sum components in the reconstruction}
-
-\item{periods}{if TRUE will add a lower axis with period labels}
-
-\item{labels}{to be set above the frequency peaks. Can be the output of `attributeTone`}
-
-\item{a}{`mfft_deco` object, typically the output of a `mfft` call.}
-}
-\value{
-list of reconstructed components if sum=FALSE,  full
-        reconstructed time series otherwise
-}
-\description{
-MFFT reconstruction
-
-MFFT ANOVA
-not ready. do not use.
-}
diff --git a/man/mfft_real.Rd b/man/mfft_real.Rd
index 791d76b..4a61373 100644
--- a/man/mfft_real.Rd
+++ b/man/mfft_real.Rd
@@ -29,7 +29,7 @@ note: this is not really faster because the bottleneck is actually the goden sec
 3: second order-correction using synthetic data (all documented in the Sidlichovsky and Nesvorny reference)}
 }
 \value{
-a `mfft_deco` object, based on a data.frame with columns "Freq", "Ampl" and "Phases".
+a `discreteSpectrum` object, based on a data.frame with columns "Freq", "Ampl" and "Phases".
 }
 \description{
 R-coded version of the Modified Fourier Transform
@@ -43,8 +43,8 @@ A C-version should be supplied one day.
 \examples{
 
 data(harmonic_sample)
-spectrum <- mfft_real(harmonic_sample$data)
-print(spectrum)
+spec <- mfft_real(harmonic_sample$data)
+print(spec)
 
 }
 \references{
diff --git a/man/pseudo_log.Rd b/man/pseudo_log.Rd
index 590aef4..83842a9 100644
--- a/man/pseudo_log.Rd
+++ b/man/pseudo_log.Rd
@@ -10,6 +10,6 @@ data(pseudo_log)
 \description{
 A truncated version (squared-shape) version of a harmonic signal for mimicking a sedimentary log
 sign( 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) + 0.8))
-for t from 0 to 8191. It is coded as a `mfft_deco` objcet and self-describes its spectral decomposition.
+for t from 0 to 8191. It is coded as a `discreteSpectrum` objcet and self-describes its spectral decomposition.
 }
 \keyword{datasets}
diff --git a/notebook/mfft_random_test.ipynb b/notebook/mfft_random_test.ipynb
index c11aad1..9b54a3b 100644
--- a/notebook/mfft_random_test.ipynb
+++ b/notebook/mfft_random_test.ipynb
@@ -259,7 +259,7 @@
        "[1] 0.000000 2.314000 0.000000 0.653167 0.000000\n",
        "\n",
        "attr(,\"class\")\n",
-       "[1] \"mfft_deco\"\n"
+       "[1] \"spectrum\"\n"
       ]
      },
      "metadata": {},
@@ -3832,7 +3832,7 @@
        "[1] -5.4832704  0.4030191 -1.6431082  2.3957822 -1.1782940  0.0000000\n",
        "\n",
        "attr(,\"class\")\n",
-       "[1] \"mfft_deco\"\n",
+       "[1] \"spectrum\"\n",
        "attr(,\"row.names\")\n",
        "[1] 1 2 3 4 5 6\n",
        "attr(,\"nfreq\")\n",
@@ -4269,7 +4269,7 @@
        "[1] -0.6804843 -1.4340620 -2.6011862  0.2136524  0.0000000 -5.6976628  0.5740075\n",
        "\n",
        "attr(,\"class\")\n",
-       "[1] \"mfft_deco\"\n",
+       "[1] \"spectrum\"\n",
        "attr(,\"row.names\")\n",
        "[1] 1 2 3 4 5 6 7\n",
        "attr(,\"nfreq\")\n",
@@ -4481,7 +4481,7 @@
        "[1]  0.0000000 -1.6515515 -1.5786453 -1.4144484  2.8983504 -0.8902084\n",
        "\n",
        "attr(,\"class\")\n",
-       "[1] \"mfft_deco\"\n",
+       "[1] \"spectrum\"\n",
        "attr(,\"row.names\")\n",
        "[1] 1 2 3 4 5 6\n",
        "attr(,\"nfreq\")\n",
-- 
GitLab