ooura_fft (Ruby gem)
This is a Ruby's front end that allows to use FFT software of Professor Ooura (Kyoto University).
Installation
The software is included in this library. Professor Ooura does not have an installer.
Install the gem and add to the application's Gemfile by executing:
bundle add ooura_fft
If bundler is not being used to manage dependencies, install the gem by executing:
gem install ooura_fft
Usage
Now, there are a total of 6 FFT routines, which are as follows:
cdft: Complex Discrete Fourier Transform
rdft: Real Discrete Fourier Transform
ddct: Discrete Cosine Transform
ddst: Discrete Sine Transform
dfct: Cosine Transform of RDFT (Real Symmetric DFT)
dfst: Sine Transform of RDFT (Real Anti-symmetric DFT)
These routines are owned by the OouraFFT module.
Since the software's using is a discrete type, the ABI makes use of arrays.
In Ruby, it is communicated with the Array class. The Array class is used as an argument, and the FFT computed Array class is the return value.
The design is unified as follows:
OouraFFT.xxxx(*nusec, inversion: bool)
This *nusec
is the Array class. Internally, it is treated as a numeric sequence.
It also supports inverse FFT, and works by applying true
to the keyword argument inversion
. The default value is false
.
def sinewave(amp, f0, fs, n)
amp * Math.sin(2 * Math::PI * f0 * n / fs)
end
OouraFFT.ddct(Array.new(8){|n| sinewave(0.25, 250.0, 8000, n)})
#=> [0.6284174365157309,
#=> -0.6284174365157309,
#=> 0.18707572033318604,
#=> -0.18707572033318612,
#=> 0.08352232973991239,
#=> -0.08352232973991236,
#=> 0.02486404592245728,
#=> -0.024864045922457167]
OouraFFT.ddst(Array.new(8){|n| sinewave(0.25, 250.0, 8000, n)})
#=> [0.875,
#=> 0.12500000000000003,
#=> -0.12499999999999997,
#=> 0.125,
#=> -0.125,
#=> 0.12500000000000006,
#=> -0.12499999999999994,
#=> 0.12499999999999994]
For more information on how to the fourier transform, please refer to the technical book.
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/tribusonz-2/ooura_fft. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the code of conduct.
License
The gem is available as open source under the terms of the MIT License.
Code of Conduct
Everyone interacting in the OouraFft project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.
Provided as a C API
In the future, we plan to provide APIs for gems that are written in C.
In the case of OouraFFT, it is as follows:
RUBY_EXT_EXTERN VALUE rb_mOouraFFT;
VALUE rb_oourafft_cdft(VALUE, int);
VALUE rb_oourafft_rdft(VALUE, int);
VALUE rb_oourafft_ddct(VALUE, int);
VALUE rb_oourafft_ddst(VALUE, int);
VALUE rb_oourafft_dfct(VALUE, int);
VALUE rb_oourafft_dfst(VALUE, int);
When install a gem, a directory is created in the installation location along with the .so file. Here is the header file in C.
In general, there is globals.h
which declares the object variables that are entities, and api.h
which declares the API functions that can be used in C. There is also a header called ext_extern.h
. This is to let the C side know that object variables are treated as global variables at the C level.
To invoke them, include:
#include <ooura_fft/globals.h>
#include <ooura_fft/api.h>