// Copyright 2020 Mobilinkd LLC. #pragma once #include #include #include #include "export.h" namespace modemm17 { struct MODEMM17_API M17Randomizer { std::array dc_; M17Randomizer() { size_t i = 0; for (auto b : DC) { for (size_t j = 0; j != 8; ++j) { dc_[i++] = (b >> (7 - j)) & 1 ? -1 : 1; } } } // Randomize and derandomize are the same operation. void operator()(std::array& frame) { for (size_t i = 0; i != 368; ++i) { frame[i] *= dc_[i]; } } void randomize(std::array& frame) { for (size_t i = 0; i != 368; ++i) { frame[i] ^= (dc_[i] == -1); } } private: static const std::array DC; }; } // modemm17