From 21d525fb6a74dea4931a97deafc904a55e8c1686 Mon Sep 17 00:00:00 2001 From: Lukas Schneiderbauer Date: Mon, 6 Jan 2025 18:02:44 +0100 Subject: [PATCH] README: add reference to R package (closes #77) --- README.md | 66 ++++++++++++++++++++++++++++++++++++++++++++++++-- img/rtest.png | Bin 0 -> 30325 bytes 2 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 img/rtest.png diff --git a/README.md b/README.md index 131dece..2a5dfed 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ The fast Continuous Wavelet Transform (fCWT) ==================================== ![Stable version](https://img.shields.io/badge/version-2.0.0-blue) ![PyPI version](https://badge.fury.io/py/fcwt.svg) -The fast Continuous Wavelet Transform (fCWT) is a highly optimized C++ library for very fast calculation of the CWT in C++, Matlab, and Python. +The fast Continuous Wavelet Transform (fCWT) is a highly optimized C++ library for very fast calculation of the CWT in C++, Matlab, Python and R. **fCWT has been featured on the January 2022 cover of NATURE Computational Science**. In this article, fCWT is compared against eight competitor algorithms, tested on noise resistance and validated on synthetic electroencephalography and in vivo extracellular local field potential data. @@ -40,7 +40,7 @@ Features Quickstart ============ -fCWT's implementation can be used to accelerate your C++, Python, and Matlab projects! Build the C++ library to achieve the highest efficiency or use the Matlab and Python packages to maximize integration possibilities. +fCWT's implementation can be used to accelerate your C++, Python, R, and Matlab projects! Build the C++ library to achieve the highest efficiency or use the Matlab, Python and R packages to maximize integration possibilities. Python --- @@ -70,6 +70,25 @@ $ make ``` Two .mex files should now have been created in the `MATLAB` folder. Run the `example.mlx` live script to see how to use fCWT in Matlab. fCWT has been tested in R2022b on an Intel Apple Macbook Pro. +R +--- +The repository [fCWTr](https://github.com/lschneiderbauer/fCWTr) also features an R package exposing fcwt features. See its [documentation](https://lschneiderbauer.github.io/fCWTr/) for details. Also included is an [article](https://lschneiderbauer.github.io/fCWTr/articles/sigma.html) which discusses the parameter $\Sigma$ in more details and explains how to set it correctly for your use case. + +You can install the latest CRAN release of fCWTr with: + +``` r +install.packages("fCWTr") +``` + +Alternatively, you can install the development version of fCWTr like so +(requiring installed [devtools](https://devtools.r-lib.org/) package): + +``` r +devtools::install_github("lschneiderbauer/fCWTr") +``` + +Note that the installation process might fail if the package needs to be compiled from source and system requirements are not satisfied. The error message should give you hints, however, on what’s missing on your system. + C++ --- Build fCWT from source: @@ -136,6 +155,49 @@ fcwt.plot(signal, fs, f0=f0, f1=f1, fn=fn) Output: ![](https://github.com/fastlib/fCWT/blob/main/img/pythontest.png) +R Example +============== +This is the R-equivalent to the Python example: + +```R +library(fCWTr) + +n <- 1000 * 100 # 100 seconds +ts <- 0:n + +# Generate linear chirp +signal <- sin(2 * pi * ((1 + (20 * ts) / n) * (ts / 500))) + +out <- + fcwt( + signal, + x_sample_freq = u(1000, "Hz"), + freq_begin = u(1, "Hz"), + freq_end = u(101, "Hz"), + n_freqs = 200, + freq_scale = "linear" + ) + +print(out) +#> _Scalogram_ +#> * (Time/Frequency) dimension: ( 1220 , 200 ) +#> * Sampling rate: 12.05599 [Hz] +#> * Frequency scale: 1 [Hz] - 101 [Hz], linear +#> * Time offset: 0 [s] +#> * Sigma: 6.283185 +#> o Time resolution at 1 [Hz] : 25.13274 [1/Hz] +#> o Time resolution at 101 [Hz] : 0.248839 [1/Hz] +#> o Relative frequency resolution: 0.1013212 +#> * Time/frequency matrix summary +#> Min. 1st Qu. Median Mean 3rd Qu. Max. NA's +#> 0.0000 0.0000 0.0000 0.0003 0.0000 0.0115 2742 + +plot(out) +``` + +Output: +![](img/rtest.png) + C++ Example ======= diff --git a/img/rtest.png b/img/rtest.png new file mode 100644 index 0000000000000000000000000000000000000000..02cddc8755652810bfc35f57a5061fa0c96da493 GIT binary patch literal 30325 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�MT;bYI64eReu+=+xB2^y@r*tlaP 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�$pk*UQ#IsE90;BXt^` zoX)0*u)C&>yWxz+1qvLxqh2*e?XLUm4eQxhV88$@zC{CX+(Rq#YZBzku8WYhd$6nI z;v>d$(mQX#Uy~`m&5GwZTHngGQb$M6*dwzF-w{LIChBUYJtZIBqWzYAcD}`r>b;rD zcawP3>fMflA<;L-I*Y!_8{_^^lH86D{gyK(AQ%eg<`qVQEx>8?Bo8hF)aTj>x?Im; zXq}pJuvWz^fzF}^Ycl(F|Bgc7e4EQgmQ&}&05*s5#nCtWz5cvO3k&7rUGzeKX9--`E6eseOKpYSuAirsBWr48_=G;X z0HUVUezJ||wHgIV&Sm`wsXHo%ctTgq5tO?R9~TX~~-Mh2gCehx(LJeP6TYMyK=yKHJ06lB;Xu zufNm;oZvW?xb#iiKpMHu^J0B1>V27qq$gQE-RYs^UkEC~JNe-QRxt^7FPFIoAR=Dj;B-jaZ?bN$i}{63Ti08n0# za+PzA+Z6EMm-m-Wdq>8_s4OgwCX2bF4=6Db3Y`i5Qq