//-------------------------------------------------------------------
//  データが実数の場合の FFT class（ヘッダ），ver.1.1
//
//  2023/02/17, Copyright (c) 2023 MIKAMI, Naoki
//-------------------------------------------------------------------

#ifndef FFT_REAL_HPP
#define FFT_REAL_HPP

#include "mbed.h"
#include <complex>      // complex で使用
#include "Array.hpp"

namespace Mikami
{
    typedef complex<float> Complex; // "Complex" の定義

    class FftReal
    {
    public:
        // コンストラクタ
        explicit FftReal(int n);
        // FFT の実行
        void Execute(const float x[], Complex y[]);
        // IFFT の実行
        void ExecuteIfft(const Complex y[], float x[]);

    private:
        const int      N_FFT_;      // FFT のデータ数
        const int      N_FFT_2_;    // FFT のデータ数の半分
        const float    N_INV_;      // FFT のデータ数の逆数
        const uint32_t MASK_;       // Index() で使用
        const int      N_SHIFT_;    // ビット逆順で使用
        Array<Complex> wTable_;     // 回転子
        Array<Complex> u_;          // 作業領域

        // 最初と最後のステージを除いた処理
        void InnerStages();

        // コピー･コンストラクタおよび代入演算子の禁止のため
        FftReal(const FftReal& );
        FftReal& operator=(const FftReal& );
    };
}
#endif  // FFT_REAL_HPP
