Add setArrays() function because of issue #32. Add API migration info to README and improve README.

pull/42/head
Bim Overbohm 2020-02-22 13:35:09 +01:00
rodzic 3e73c9884b
commit 4a36bd2453
6 zmienionych plików z 81 dodań i 32 usunięć

Wyświetl plik

@ -4,7 +4,7 @@ arduinoFFT
# Fast Fourier Transform for Arduino # Fast Fourier Transform for Arduino
This is a fork from https://code.google.com/p/makefurt/ which has been abandoned since 2011. This is a fork from https://code.google.com/p/makefurt/ which has been abandoned since 2011.
~~This is a C++ library for Arduino for computing FFT.~~ Now it works both on Arduino and C projects. ~~This is a C++ library for Arduino for computing FFT.~~ Now it works both on Arduino and C projects. This is version 2.0 of the library, which has a different [API](#api). See here [how to migrate from 1.x to 2.x](#migrating-from-1.x-to-2.x).
Tested on Arduino 1.6.11 and 1.8.10. Tested on Arduino 1.6.11 and 1.8.10.
## Installation on Arduino ## Installation on Arduino
@ -16,49 +16,57 @@ Use the Arduino Library Manager to install and keep it updated. Just look for ar
To install this library, just place this entire folder as a subfolder in your Arduino installation. When installed, this library should look like: To install this library, just place this entire folder as a subfolder in your Arduino installation. When installed, this library should look like:
`Arduino\libraries\arduinoFTT` (this library's folder) `Arduino\libraries\arduinoFTT` (this library's folder)
`Arduino\libraries\arduinoFTT\arduinoFTT.h` (the library header file, uses 32 bit floats or 64bit doubles) `Arduino\libraries\arduinoFTT\src\arduinoFTT.h` (the library header file. include this in your project)
`Arduino\libraries\arduinoFTT\keywords.txt` (the syntax coloring file) `Arduino\libraries\arduinoFTT\keywords.txt` (the syntax coloring file)
`Arduino\libraries\arduinoFTT\examples` (the examples in the "open" menu) `Arduino\libraries\arduinoFTT\Examples` (the examples in the "open" menu)
`Arduino\libraries\arduinoFTT\LICENSE` (GPL license file) `Arduino\libraries\arduinoFTT\LICENSE` (GPL license file)
`Arduino\libraries\arduinoFTT\README.md` (this file) `Arduino\libraries\arduinoFTT\README.md` (this file)
## Building on Arduino ## Building on Arduino
After this library is installed, you just have to start the Arduino application. After this library is installed, you just have to start the Arduino application.
You may see a few warning messages as it's built. You may see a few warning messages as it's built.
To use this library in a sketch, go to the Sketch | Import Library menu and To use this library in a sketch, go to the Sketch | Import Library menu and
select arduinoFTT. This will add a corresponding line to the top of your sketch: select arduinoFTT. This will add a corresponding line to the top of your sketch:
`#include <arduinoFTT.h>` `#include <arduinoFTT.h>`
## TODO
* Ratio table for windowing function.
* Document windowing functions advantages and disadvantages.
* Optimize usage and arguments.
* Add new windowing functions.
* ~~Spectrum table?~~
## API ## API
* **ArduinoFFT**(T *vReal, T *vImag, uint_fast16_t samples, T samplingFrequency, T * weighingFactors = nullptr); * ```ArduinoFFT(T *vReal, T *vImag, uint_fast16_t samples, T samplingFrequency, T * weighingFactors = nullptr);```
Constructor. Constructor.
The type `T` can be `float` or `double`. `vReal` and `vImag` are pointers to arrays of real and imaginary data and have to be allocated outside of ArduinoFFT. `samples` is the number of samples in `vReal` and `vImag` and `weighingFactors` (if specified). `samplingFrequency` is the sample frequency of the data. `weighingFactors` can optionally be specified to cache weighing factors for the windowing function. This speeds up repeated calls to **windowing()** significantly. The type `T` can be `float` or `double`. `vReal` and `vImag` are pointers to arrays of real and imaginary data and have to be allocated outside of ArduinoFFT. `samples` is the number of samples in `vReal` and `vImag` and `weighingFactors` (if specified). `samplingFrequency` is the sample frequency of the data. `weighingFactors` can optionally be specified to cache weighing factors for the windowing function. This speeds up repeated calls to **windowing()** significantly. You can deallocate `vReal` and `vImag` after you are done using the library, or only use specific library functions that only need one of those arrays.
* **~ArduinoFFT**(void); ```C++
const uint32_t nrOfSamples = 1024;
auto real = new float[nrOfSamples];
auto imag = new float[nrOfSamples];
auto fft = ArduinoFFT<float>(real, imag, nrOfSamples, 10000);
// ... fill real + imag and use it ...
fft.compute();
fft.complexToMagnitude();
delete [] imag;
// ... continue using real and only functions that use real ...
auto peak = fft.majorPeak();
```
* ```~ArduinoFFT()```
Destructor. Destructor.
* **complexToMagnitude**(); * ```void complexToMagnitude() const;```
Convert complex values to their magnitude and store in vReal. Convert complex values to their magnitude and store in vReal. Uses vReal and vImag.
* **compute**(FFTDirection dir); * ```void compute(FFTDirection dir) const;```
Calcuates the Fast Fourier Transform. Calcuates the Fast Fourier Transform. Uses vReal and vImag.
* **dcRemoval**(); * ```void dcRemoval() const;```
Removes the DC component from the sample data. Removes the DC component from the sample data. Uses vReal.
* **majorPeak**(); * ```T majorPeak() const;```
Looks for and returns the frequency of the biggest spike in the analyzed signal. Returns the frequency of the biggest spike in the analyzed signal. Uses vReal.
* **revision**(); * ```void majorPeak(T &frequency, T &value) const;```
Returns the frequency and the value of the biggest spike in the analyzed signal. Uses vReal.
* ```uint8_t revision() const;```
Returns the library revision. Returns the library revision.
* **windowing**(FFTWindow windowType, FFTDirection dir, bool withCompensation = false); * ```void setArrays(T *vReal, T *vImag);```
Performs a windowing function on the values array. The possible windowing options are: Replace the data array pointers.
* ```void windowing(FFTWindow windowType, FFTDirection dir, bool withCompensation = false);```
Performs a windowing function on the values array. Uses vReal. The possible windowing options are:
* Rectangle * Rectangle
* Hamming * Hamming
* Hann * Hann
@ -91,3 +99,31 @@ Define this to use reciprocal multiplication for division and some more speedups
* #define FFT_SQRT_APPROXIMATION * #define FFT_SQRT_APPROXIMATION
Define this to use a low-precision square root approximation instead of the regular sqrt() call. This might only work for specific use cases, but is significantly faster. Only works if `T == float`. Define this to use a low-precision square root approximation instead of the regular sqrt() call. This might only work for specific use cases, but is significantly faster. Only works if `T == float`.
See the `FFT_speedup.ino` example in `Examples/FFT_speedup/FFT_speedup.ino`.
# Migrating from 1.x to 2.x
* The function signatures where you could pass in pointers were deprecated and have been removed. Pass in pointers to your real / imaginary array in the ArduinoFFT() constructor. If you have the need to replace those pointers during usage of the library (e.g. to free memory) you can do the following:
```C++
const uint32_t nrOfSamples = 1024;
auto real = new float[nrOfSamples];
auto imag = new float[nrOfSamples];
auto fft = ArduinoFFT<float>(real, imag, nrOfSamples, 10000);
// ... fill real + imag and use it ...
fft.compute();
fft.complexToMagnitude();
delete [] real;
// ... replace vReal in library with imag ...
fft.setArrays(imag, nullptr);
// ... keep doin whatever ...
```
* All function names are camelCase case now (start with lower-case character), e.g. "windowing()" instead of "Windowing()".
## TODO
* Ratio table for windowing function.
* Document windowing functions advantages and disadvantages.
* Optimize usage and arguments.
* Add new windowing functions.
* ~~Spectrum table?~~

Wyświetl plik

@ -1,8 +1,13 @@
02/22/20 v1.9.1
Add setArrays() function because of issue #32.
Add API migration info to README and improve README.
Use better sqrtf() approximation.
02/19/20 v1.9.0 02/19/20 v1.9.0
Remove deprecated API. Consistent renaming of functions to lowercase. Remove deprecated API. Consistent renaming of functions to lowercase.
Make template to be able to use float or double type (float brings a ~70% speed increase on ESP32). Make template to be able to use float or double type (float brings a ~70% speed increase on ESP32).
Add option to provide cache for window function weighing factors (~50% speed increase on ESP32). Add option to provide cache for window function weighing factors (~50% speed increase on ESP32).
Add some #defines to enable math approximisations to further speed up code (~50% speed increase on ESP32). Add some #defines to enable math approximisations to further speed up code (~40% speed increase on ESP32).
01/27/20 v1.5.5 01/27/20 v1.5.5
Lookup table for constants c1 and c2 used during FFT comupting. This increases the FFT computing speed in around 5%. Lookup table for constants c1 and c2 used during FFT comupting. This increases the FFT computing speed in around 5%.

Wyświetl plik

@ -21,6 +21,7 @@ windowing KEYWORD2
exponent KEYWORD2 exponent KEYWORD2
revision KEYWORD2 revision KEYWORD2
majorPeak KEYWORD2 majorPeak KEYWORD2
setArrays KEYWORD2
####################################### #######################################
# Constants (LITERAL1) # Constants (LITERAL1)

Wyświetl plik

@ -25,7 +25,7 @@
"email": "bim.overbohm@googlemail.com" "email": "bim.overbohm@googlemail.com"
} }
], ],
"version": "1.9.0", "version": "1.9.1",
"frameworks": ["arduino","mbed","espidf"], "frameworks": ["arduino","mbed","espidf"],
"platforms": "*" "platforms": "*"
} }

Wyświetl plik

@ -1,5 +1,5 @@
name=arduinoFFT name=arduinoFFT
version=1.9.0 version=1.9.1
author=Enrique Condes <enrique@shapeoko.com> author=Enrique Condes <enrique@shapeoko.com>
maintainer=Enrique Condes <enrique@shapeoko.com> maintainer=Enrique Condes <enrique@shapeoko.com>
sentence=A library for implementing floating point Fast Fourier Transform calculations on Arduino. sentence=A library for implementing floating point Fast Fourier Transform calculations on Arduino.

Wyświetl plik

@ -106,6 +106,13 @@ public:
return 0x19; return 0x19;
} }
// Replace the data array pointers
void setArrays(T *vReal, T *vImag)
{
_vReal = vReal;
_vImag = vImag;
}
// Computes in-place complex-to-complex FFT // Computes in-place complex-to-complex FFT
void compute(FFTDirection dir) const void compute(FFTDirection dir) const
{ {
@ -347,7 +354,7 @@ public:
return interpolatedX; return interpolatedX;
} }
void majorPeak(T &f, T &v) const void majorPeak(T &frequency, T &value) const
{ {
T maxY = 0; T maxY = 0;
uint_fast16_t IndexOfMaxY = 0; uint_fast16_t IndexOfMaxY = 0;
@ -372,8 +379,8 @@ public:
interpolatedX = ((IndexOfMaxY + delta) * this->_samplingFrequency) / (this->_samples); interpolatedX = ((IndexOfMaxY + delta) * this->_samplingFrequency) / (this->_samples);
} }
// returned value: interpolated frequency peak apex // returned value: interpolated frequency peak apex
f = interpolatedX; frequency = interpolatedX;
v = abs(this->_vReal[IndexOfMaxY - 1] - (2.0 * this->_vReal[IndexOfMaxY]) + this->_vReal[IndexOfMaxY + 1]); value = abs(this->_vReal[IndexOfMaxY - 1] - (2.0 * this->_vReal[IndexOfMaxY]) + this->_vReal[IndexOfMaxY + 1]);
} }
private: private: