CORDIC_Rotate_APFX/sources/CCordicRotateRom/CCordicRotateRomTemplate.hpp
Camille Monière f0035238bf
Correct the name and improve widely
- Fix the MC (Monte-Carlo) to the proper algoritm name, ML (maximum
  likelyhood) and remove HalfPi since the use of divider allow to
  theoretically support any pi / 2^k, k an integer. In reality, a too
  low rotation would require more stages than 7 but it is for futur
  improvements.
- Make use of `divider` template to provide rotation grain finer than pi
  / 2. Validated (unit-tested) with pi / 4 with the same margins than pi
  / 2 (2% of error with floating scaling, 3% with fixed scaling).
- Fix rom size which now use N_STAGES+1 bits instead of 8 regardless of
  N_STAGES. Simplify the cordic method implementation, which
  unexpectedly (and fortunately) improved its performance.
2022-03-14 14:07:10 +01:00

36 lines
1.3 KiB
C++

/*
*
* Copyright 2022 Camille "DrasLorus" Monière.
*
* This file is part of CORDIC_Rotate_APFX.
*
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU
* Lesser General Public License as published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with this program.
* If not, see <https://www.gnu.org/licenses/>.
*
*/
#ifndef C_CORDIC_ROTATE_ROM_TEMPLATE
#define C_CORDIC_ROTATE_ROM_TEMPLATE
enum rom_types {
ml,
cst
};
template <unsigned TIn_I, rom_types type, unsigned TIn_W, unsigned Tnb_stages, unsigned Tq, unsigned divider = 2>
class CCordicRotateRom {
static_assert(TIn_W > 0, "Inputs can't be on zero bits.");
static_assert(Tnb_stages < 8, "7 stages of CORDIC is the maximum supported.");
static_assert(Tnb_stages > 1, "2 stages of CORDIC is the minimum.");
static_assert(((divider - 1) & divider) == 0, "divider must be a power of 2.");
};
#endif // C_CORDIC_ROTATE_ROM_TEMPLATE