diff --git a/NAMESPACE b/NAMESPACE
index 07aa5b6bef5a8fe15688d9433e87fc4da982a87e..22d23d83201f0f000f252025213f8198d7242f09 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -1,28 +1,29 @@
 # 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,mmfft)
 S3method(plot,periodogram)
 S3method(plot,wavelet)
-S3method(print,mfft_deco)
+S3method(print,discreteSpectrum)
 export(approx_ts)
 export(arspec)
 export(attributeTones)
+export(cis)
 export(cwt_morlet)
+export(develop)
 export(hilbert_extension)
 export(mem)
 export(mfft)
-export(mfft_anova)
 export(mfft_complex)
 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 787a357c98109cf69173e34612d1f2df04886c9e..1255adf364ca887bf4a6d975d27c3810b77a444f 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/develop.R b/R/develop.R
new file mode 100644
index 0000000000000000000000000000000000000000..3525a4e3d39bdee00a86cc00ee4e95da3c31c016
--- /dev/null
+++ b/R/develop.R
@@ -0,0 +1,114 @@
+# Code currently taken from gtseries. Will be merged at some point
+
+#' Develop a spectrum into a time series (generic)
+#' @param  arg: input class
+#' @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. 
+#' @note   place holder for type-specific develop functions
+#' @export develop
+#' @return nothing
+develop <- function(M, start=NULL, end=NULL, deltat=NULL, times = NULL, ...){
+     UseMethod("develop") 
+}
+
+
+#' @export cis
+cis <- function(x) exp(1i*x)
+
+#' Discrete spectrum reconstruction
+#' @importFrom stats deltat start
+#' @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
+#' @param  dfunction is the trigonometrical function. Classically one of 'cos', 'sin', or 'cis'
+#' @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
+#' @method develop discreteSpectrum
+#' @export
+develop.discreteSpectrum  <- function(M, start=NULL, end=NULL, deltat=NULL, times,  dfunction = cos, 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");
+   n <- (end-start) %*% deltat
+   times <- start + seq(0, n) * 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)[1]
+ deltat <- stats::deltat(xdata)
+ times <- (seq(length(xdata))-1) * deltat + start
+ timesIsATseries = TRUE
+ }
+
+ nfreq <- attr(M,"nfreq")
+ if (is.null(nfreq)) nfreq <- length(M$Amp)
+ if (timesIsATseries){
+   reconstructed <- lapply(seq(nfreq), function(i) ts( M$Amp[i] * dfunction(M$Freq[i] * times + M$Phase[i]), start=start, deltat=deltat) )} 
+ else {
+   reconstructed <- lapply(seq(nfreq), function(i) M$Amp[i] * dfunction(M$Freq[i] * times + M$Phase[i]))
+ }
+
+ if ( sum ) reconstructed <- apply(simplify2array(reconstructed), 1 , sum)
+ if (timesIsATseries) reconstructed <- ts(reconstructed, start=start, deltat=deltat)
+ return(reconstructed)
+}
+
+#' @rdname discreteSpectrum
+#' @export
+as.data.frame.discreteSpectrum <- function(x) {data.frame(Freq=x$Freq, Amp=x$Amp, Phases=x$Phases)}
+
+
+#' @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.discreteSpectrum <- function (M,periods=FALSE,labels=NULL,...){
+#   O <- order(M$Freq)
+  plot(abs(M$Freq), abs(M$Amp),'h',ylab="Amplitudes", xlab="",  ...)
+  if (periods) {
+    frequencies <- pretty(range(M$Freq/(2*pi)))
+    plabels <- as.character(1/frequencies)
+    if (0 %in% frequencies) plabels[which(frequencies == 0)] = "∞"
+    axis(1, line=3, at=2*pi*frequencies, labels=plabels)
+    mtext("Rate", 1, 2)
+    mtext("Period", 1, 4)
+  } else {
+    mtext("Rate", 1, 3)
+  }
+  # 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 discreteSpectrum
+#' @export
+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 discreteSpectrum
+#' @export
+print.discreteSpectrum <- function (M,...){
+  print.data.frame(cbind(as.data.frame(M), Period=2*pi/M$Freq))
+}
+
+
+
diff --git a/R/mfft_complex.R b/R/mfft_complex.R
index d8fedd769d5dbee36e174ecf0a40613655c07a82..78a3305bf4f39d8631fe8de7a0945aaa0a9e64ca 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 b8f60c3f6e7f6536c55045f22366f011b647f08c..2f9fc873d5f7bce45e9b5049b263bf54133d408d 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
deleted file mode 100644
index cb8dfc7839cb3f555f7e9863593c11e5cfbf7615..0000000000000000000000000000000000000000
--- a/R/mfft_support.R
+++ /dev/null
@@ -1,86 +0,0 @@
-#' 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
-#' @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")
- xdata <- attr(M,"data")
- 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 ( sum ) reconstructed <- ts(apply(simplify2array(reconstructed), 1 , sum), start=stats::start(xdata), deltat=stats::deltat(xdata))
-}
-
-#' MFFT ANOVA
-#' not ready. do not use. 
-#' @rdname mfft_deco
-#' @export mfft_anova
-mfft_anova  <- function(M){
- if (!(attr(M,"class")=="mfft_deco")) stop ("object is not a MFFT decomposition")
- xdata <- attr(M,"xdata")
- nfreq <- attr(M,"nfreq")
- N <- length(xdata)
- times <- seq(length(xdata))*deltat(xdata) + start(xdata)
- reconstructed <- sapply(seq(nfreq), function(i) M$Amp[i]*cos(M$Freq[i]*times + M$Phase[i]) )
- cum_reconstruct <- apply(reconstructed, 1, cumsum)
- residual_vars <- apply(apply(cum_reconstruct, 1, function(i) xdata-i) , 2, function(j) sum(j^2))
- var0 <- sum(xdata^2)
- master_vars <- c(var0, residual_vars[-length(residual_vars)])
- p2s <- 2*seq(nfreq)
- p1s <- c(0, p2s[-length(p2s)])
- F <- (master_vars - residual_vars)/residual_vars * (N - p2s)/(p2s-p1s)
-}
-
-
-#' @rdname mfft_deco
-#' @export
-as.data.frame.mfft_deco <- 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. 
-#' @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,...){
-#   O <- order(M$Freq)
-  plot(abs(M$Freq), abs(M$Amp),'h',ylab="Amplitudes", xlab="",  ...)
-  if (periods) {
-    frequencies <- pretty(range(M$Freq/(2*pi)))
-    plabels <- as.character(1/frequencies)
-    if (0 %in% frequencies) plabels[which(frequencies == 0)] = "∞"
-    axis(1, line=3, at=2*pi*frequencies, labels=plabels)
-    mtext("Rate", 1, 2)
-    mtext("Period", 1, 4)
-  } else {
-    mtext("Rate", 1, 3)
-  }
-  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
-#' @export
-lines.mfft_deco <- 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
-#' @export
-print.mfft_deco <- 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 bebfb49c5b80d71e55b4716879ad4b31e6a0e9b7..4c2eaff0b84044dbe153fdfceca98435cdb9d51f 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 87bfda7b03504d6b5a84121c240f5de3cd259e7f..b9af3bb12499a32041c37d546a19b1e0472c0cdc 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
Binary files a/data/harmonic_sample.rda and b/data/harmonic_sample.rda differ
diff --git a/data/harmonic_sample_noisy.rda b/data/harmonic_sample_noisy.rda
index 7c8b13fda68bcc9b72f28963720e56a215cc48a7..5e41cdae53d231f3a67cd6bfede311246d95af15 100644
Binary files a/data/harmonic_sample_noisy.rda and b/data/harmonic_sample_noisy.rda differ
diff --git a/data/pseudo_log.rda b/data/pseudo_log.rda
index 8c9055c8e5cc584113d980757aca23b3183f6f7a..e3c8be88bda306321c36b06b10da5bb57b7027ec 100644
Binary files a/data/pseudo_log.rda and b/data/pseudo_log.rda differ
diff --git a/deprecated/mfft_support.R b/deprecated/mfft_support.R
new file mode 100644
index 0000000000000000000000000000000000000000..a25630b36716bf1243b5cafddb38ea8ffda94040
--- /dev/null
+++ b/deprecated/mfft_support.R
@@ -0,0 +1,113 @@
+#' Discrete spectrum reconstruction
+#' @importFrom stats deltat start
+#' @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
+#' @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")
+ 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 discreteSpectrum
+#' @export mfft_anova
+mfft_anova  <- function(M){
+ if (!("discreteSpectrum" %in% class(M))) stop ("object is not a discreteSpectrum decomposition")
+ xdata <- attr(M,"xdata")
+ nfreq <- attr(M,"nfreq")
+ N <- length(xdata)
+ times <- seq(length(xdata))*deltat(xdata) + start(xdata)
+ reconstructed <- sapply(seq(nfreq), function(i) M$Amp[i]*cos(M$Freq[i]*times + M$Phase[i]) )
+ cum_reconstruct <- apply(reconstructed, 1, cumsum)
+ residual_vars <- apply(apply(cum_reconstruct, 1, function(i) xdata-i) , 2, function(j) sum(j^2))
+ var0 <- sum(xdata^2)
+ master_vars <- c(var0, residual_vars[-length(residual_vars)])
+ p2s <- 2*seq(nfreq)
+ p1s <- c(0, p2s[-length(p2s)])
+ F <- (master_vars - residual_vars)/residual_vars * (N - p2s)/(p2s-p1s)
+}
+
+
+#' @rdname discreteSpectrum
+#' @export
+as.data.frame.discreteSpectrum <- function(x) {data.frame(Freq=x$Freq, Amp=x$Amp, Phases=x$Phases)}
+
+
+#' @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.discreteSpectrum <- function (M,periods=FALSE,labels=NULL,...){
+#   O <- order(M$Freq)
+  plot(abs(M$Freq), abs(M$Amp),'h',ylab="Amplitudes", xlab="",  ...)
+  if (periods) {
+    frequencies <- pretty(range(M$Freq/(2*pi)))
+    plabels <- as.character(1/frequencies)
+    if (0 %in% frequencies) plabels[which(frequencies == 0)] = "∞"
+    axis(1, line=3, at=2*pi*frequencies, labels=plabels)
+    mtext("Rate", 1, 2)
+    mtext("Period", 1, 4)
+  } else {
+    mtext("Rate", 1, 3)
+  }
+  # 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 discreteSpectrum
+#' @export
+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 discreteSpectrum
+#' @export
+print.discreteSpectrum <- function (M,...){
+  print.data.frame(cbind(as.data.frame(M), Period=2*pi/M$Freq))
+}
+
+
+
diff --git a/man/develop.Rd b/man/develop.Rd
new file mode 100644
index 0000000000000000000000000000000000000000..8d722d291d04c9a362db0c87cd44efcc48b0f914
--- /dev/null
+++ b/man/develop.Rd
@@ -0,0 +1,27 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/develop.R
+\name{develop}
+\alias{develop}
+\title{Develop a spectrum into a time series (generic)}
+\usage{
+develop(M, start = NULL, end = NULL, deltat = NULL, times = NULL, ...)
+}
+\arguments{
+\item{deltat}{: see start.}
+
+\item{arg:}{input class}
+
+\item{times:}{if supplied, times of the decomposition}
+
+\item{start:}{if supplied, overrides time and will generate a time series with start and deltat, which must then
+be supplied as well}
+}
+\value{
+nothing
+}
+\description{
+Develop a spectrum into a time series (generic)
+}
+\note{
+place holder for type-specific develop functions
+}
diff --git a/man/develop.discreteSpectrum.Rd b/man/develop.discreteSpectrum.Rd
new file mode 100644
index 0000000000000000000000000000000000000000..9a5f4a1fae1ffc5eb26936d7d73b58bed9ff5269
--- /dev/null
+++ b/man/develop.discreteSpectrum.Rd
@@ -0,0 +1,41 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/develop.R
+\name{develop.discreteSpectrum}
+\alias{develop.discreteSpectrum}
+\title{Discrete spectrum reconstruction}
+\usage{
+\method{develop}{discreteSpectrum}(
+  M,
+  start = NULL,
+  end = NULL,
+  deltat = NULL,
+  times,
+  dfunction = cos,
+  sum = TRUE
+)
+}
+\arguments{
+\item{M}{: discreteSpectrum object}
+
+\item{deltat}{: see start.}
+
+\item{dfunction}{is the trigonometrical function. Classically one of 'cos', 'sin', or 'cis'}
+
+\item{sum}{: TRUE if user wants to sum components %in% the reconstruction}
+
+\item{times:}{if supplied, times of the decomposition}
+
+\item{start:}{if supplied, overrides time and will generate a time series with start and deltat, which must then
+be supplied as well}
+}
+\value{
+list of reconstructed components if sum=FALSE,  full
+        reconstructed time series otherwise
+}
+\description{
+Discrete spectrum 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.
+}
diff --git a/man/harmonic_sample.Rd b/man/harmonic_sample.Rd
index beaa588f8f5c64ae7b3da76243c789664baaad94..21e0e93968f7a1b9e558c01218495775402e02c1 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 cc57b10eefc420891cd9ebac442bc7fa47b7115d..adda2d507109568dc616b2e458711be621510357 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 5d229ac6cb71dd630d397f61d14ce365ed94b7a9..6ab12cd6cd083da11096626fb77a6c4a973965a0 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 0afdc3b2a1ad597e9b41fc6e7bde0de3d8a2a463..92d92014ca326bc96ddd4d7f1d89f629e075dc8e 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 b85616c3c53aa4e8656de358b086addb15fef44e..0000000000000000000000000000000000000000
--- 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 791d76b3b0be396784f60e261d2a21a9f56d01d4..4a61373325f7a3ee819d7c881f75eb8b3b858e91 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 590aef4459912c92e569115cbc9bff79d6bdb36d..83842a9cbbd91b79c1ccb65409ed466bfd93c9b7 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 c11aad16ac9b5bd6f3061bb07489a5edfb36e4e0..9b54a3b251ab62a1a92c6509048a7c4a25783c44 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",