Cog/Frameworks/OpenMPT/OpenMPT/soundlib/TinyFFT.h
Christopher Snowhill da1973bcd9 Build libOpenMPT from source once again
Bundle libOpenMPT as a dynamic framework, which should be safe once
again, now that there is only one version to bundle. Also, now it is
using the versions of libvorbisfile and libmpg123 that are bundled with
the player, instead of compiling minimp3 and stbvorbis.

Signed-off-by: Christopher Snowhill <kode54@gmail.com>
2022-06-30 22:56:52 -07:00

42 lines
1.2 KiB
C++

/*
* TinyFFT.h
* ---------
* Purpose: A simple FFT implementation for power-of-two FFTs
* Notes : This is a C++ adaption of Ryuhei Mori's BSD 2-clause licensed TinyFFT
* available from https://github.com/ryuhei-mori/tinyfft
* Authors: Ryuhei Mori
* OpenMPT Devs
* The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
*/
#pragma once
#include "openmpt/all/BuildSettings.hpp"
#include <complex>
OPENMPT_NAMESPACE_BEGIN
class TinyFFT
{
static constexpr std::complex<double> I{0.0, 1.0};
std::vector<std::complex<double>> w; // Pre-computed twiddle factors
const uint32 k; // log2 of FFT size
void GenerateTwiddleFactors(uint32 i, uint32 b, std::complex<double> z);
public:
TinyFFT(const uint32 fftSize);
uint32 Size() const noexcept;
// Computes in-place FFT of size 2^k of A, result is in bit-reversed order.
void FFT(std::vector<std::complex<double>> &A) const;
// Computes in-place IFFT of size 2^k of A, input is expected to be in bit-reversed order.
void IFFT(std::vector<std::complex<double>> &A) const;
static void Normalize(std::vector<std::complex<double>> &data);
};
OPENMPT_NAMESPACE_END