Porównaj commity

...

11 Commity

Autor SHA1 Wiadomość Data
Enrique Condes d070ab2c8e
Merge pull request #108 from kosme/develop
Fix to prevent double swap of imaginary part
2024-11-24 22:27:58 +08:00
Enrique Condes 0913ec2f87 Merge branch 'develop' of github.com:kosme/arduinoFFT into develop 2024-11-24 22:22:31 +08:00
Enrique Condes a1abeabe32 Avoid double imaginary swap on COMPLEX_INPUT and Reverse direction 2024-11-24 22:15:36 +08:00
Enrique Condes 6948a41472 Avoid double imaginary swap on COMPLEX_INPUT and Reverse direction 2024-11-24 21:56:44 +08:00
Enrique Condes d81e45b1e9
Merge pull request #107 from kosme/develop
Fix to issue #100
2024-11-21 21:24:37 +08:00
Enrique Condes 0979fb6844 Fix Hann windowing coefficient 2024-11-21 21:21:31 +08:00
Enrique Condes f67d6797b4 Fix to issue 100 2024-11-21 21:11:35 +08:00
Enrique Condes bb841b6d6f
Update README.md
Add DOI
2024-11-21 16:51:31 +08:00
Enrique Condes 96701da0d9
Merge pull request #106 from kosme/develop
Allow enabling bit reversal on the imaginary part of the input
2024-11-21 15:40:31 +08:00
Enrique Condes 7f7bf6efa0 Allow performing bit reversal on the complex part of the input 2024-11-21 15:32:42 +08:00
Enrique Condes 7f340769fa Misc changes to improve performance 2024-11-21 15:26:23 +08:00
4 zmienionych plików z 25 dodań i 20 usunięć

Wyświetl plik

@ -1,4 +1,4 @@
arduinoFFT
arduinoFFT [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.14195818.svg)](https://doi.org/10.5281/zenodo.14195818)
==========
# Fast Fourier Transform for Arduino

Wyświetl plik

@ -25,7 +25,7 @@
"email": "bim.overbohm@googlemail.com"
}
],
"version": "2.0.3",
"version": "2.0.4",
"frameworks": ["arduino","mbed","espidf"],
"platforms": "*",
"headers": "arduinoFFT.h"

Wyświetl plik

@ -1,9 +1,9 @@
name=arduinoFFT
version=2.0.3
version=2.0.4
author=Enrique Condes <enrique@shapeoko.com>
maintainer=Enrique Condes <enrique@shapeoko.com>
sentence=A library for implementing floating point Fast Fourier Transform calculations on the Arduino framework.
paragraph=With this library you can calculate the dominant frequency of a sampled signal.
paragraph=With this library you can calculate the frequencies present on a sampled signal.
category=Data Processing
url=https://github.com/kosme/arduinoFFT
architectures=*

Wyświetl plik

@ -52,7 +52,7 @@ template <typename T>
void ArduinoFFT<T>::complexToMagnitude(T *vReal, T *vImag,
uint_fast16_t samples) const {
// vM is half the size of vReal and vImag
for (uint_fast16_t i = 0; i < samples; i++) {
for (uint_fast16_t i = 0; i < (samples >> 1) + 1; i++) {
vReal[i] = sqrt_internal(sq(vReal[i]) + sq(vImag[i]));
}
}
@ -82,8 +82,12 @@ void ArduinoFFT<T>::compute(T *vReal, T *vImag, uint_fast16_t samples,
for (uint_fast16_t i = 0; i < (samples - 1); i++) {
if (i < j) {
swap(&vReal[i], &vReal[j]);
#ifdef COMPLEX_INPUT
swap(&vImag[i], &vImag[j]);
#else
if (dir == FFTDirection::Reverse)
swap(&vImag[i], &vImag[j]);
#endif
}
uint_fast16_t k = (samples >> 1);
@ -189,11 +193,12 @@ void ArduinoFFT<T>::majorPeak(T *vData, uint_fast16_t samples,
T delta = 0.5 * ((vData[IndexOfMaxY - 1] - vData[IndexOfMaxY + 1]) /
(vData[IndexOfMaxY - 1] - (2.0 * vData[IndexOfMaxY]) +
vData[IndexOfMaxY + 1]));
T interpolatedX = ((IndexOfMaxY + delta) * samplingFrequency) / (samples - 1);
if (IndexOfMaxY == (samples >> 1)) // To improve calculation on edge values
interpolatedX = ((IndexOfMaxY + delta) * samplingFrequency) / (samples);
if (IndexOfMaxY == (samples >> 1)) { // To improve calculation on edge values
*frequency = ((IndexOfMaxY + delta) * samplingFrequency) / (samples);
} else {
*frequency = ((IndexOfMaxY + delta) * samplingFrequency) / (samples - 1);
}
// returned value: interpolated frequency peak apex
*frequency = interpolatedX;
if (magnitude != nullptr) {
#if defined(ESP8266) || defined(ESP32)
*magnitude = fabs(vData[IndexOfMaxY - 1] - (2.0 * vData[IndexOfMaxY]) +
@ -340,7 +345,7 @@ void ArduinoFFT<T>::windowing(T *vData, uint_fast16_t samples,
weighingFactor = 0.54 - (0.46 * cos(twoPi * ratio));
break;
case FFTWindow::Hann: // hann
weighingFactor = 0.54 * (1.0 - cos(twoPi * ratio));
weighingFactor = 0.50 * (1.0 - cos(twoPi * ratio));
break;
case FFTWindow::Triangle: // triangle (Bartlett)
#if defined(ESP8266) || defined(ESP32)
@ -504,16 +509,16 @@ template <typename T> double ArduinoFFT<T>::sqrt_internal(double x) const {
template <typename T>
const T ArduinoFFT<T>::_WindowCompensationFactors[11] = {
1.0000000000 * 2.0, // rectangle (Box car)
1.8549343278 * 2.0, // hamming
1.8554726898 * 2.0, // hann
2.0039186079 * 2.0, // triangle (Bartlett)
2.8163172034 * 2.0, // nuttall
2.3673474360 * 2.0, // blackman
2.7557840395 * 2.0, // blackman nuttall
2.7929062517 * 2.0, // blackman harris
3.5659039231 * 2.0, // flat top
1.5029392863 * 2.0, // welch
2.0, // 1.0000000000 * 2.0, // rectangle (Box car)
3.7098686556, // 1.8549343278 * 2.0, // hamming
3.7109453796, // 1.8554726898 * 2.0, // hann
4.0078372158, // 2.0039186079 * 2.0, // triangle (Bartlett)
5.6326344068, // 2.8163172034 * 2.0, // nuttall
4.734694872, // 2.3673474360 * 2.0, // blackman
5.511568079, // 2.7557840395 * 2.0, // blackman nuttall
5.5858125034, // 2.7929062517 * 2.0, // blackman harris
7.1318078462, // 3.5659039231 * 2.0, // flat top
3.0058785726, // 1.5029392863 * 2.0, // welch
// This is added as a precaution, since this index should never be
// accessed under normal conditions
1.0 // Custom, precompiled value.