add doxygen via opencode
This commit is contained in:
@@ -1,10 +1,10 @@
|
||||
/*! \file picrc.h
|
||||
* \ingroup Math
|
||||
* \~\brief
|
||||
* \~english CRC checksum calculation
|
||||
* \~russian Вычисление CRC контрольной суммы
|
||||
*/
|
||||
/*
|
||||
//! \file picrc.h
|
||||
//! \ingroup Math
|
||||
//! \~\brief
|
||||
//! \~english CRC checksum calculation
|
||||
//! \~russian Вычисление CRC контрольной суммы
|
||||
|
||||
/*!
|
||||
PIP - Platform Independent Primitives
|
||||
CRC checksum calculator
|
||||
Ivan Pelipenko peri4ko@yandex.ru
|
||||
@@ -28,67 +28,113 @@
|
||||
|
||||
#include "pistring.h"
|
||||
|
||||
//! \addtogroup Math
|
||||
//! \{
|
||||
//! \class uint_cl
|
||||
//! \brief
|
||||
//! \~english Fixed-size unsigned integer class for CRC calculations
|
||||
//! \~russian Класс целого числа фиксированного размера для вычисления CRC
|
||||
//! \details
|
||||
//! \~english Provides arbitrary length unsigned integer support for CRC computation
|
||||
//! \~russian Обеспечивает поддержку целых чисел произвольной длины для вычисления CRC
|
||||
//! \}
|
||||
|
||||
template<int L>
|
||||
class PIP_EXPORT uint_cl {
|
||||
public:
|
||||
//! \~english Default constructor, initializes to zero
|
||||
//! \~russian Конструктор по умолчанию, инициализирует нулём
|
||||
uint_cl() {
|
||||
for (int i = 0; i < L / 8; ++i)
|
||||
data_[i] = 0;
|
||||
}
|
||||
|
||||
//! \~english Copy constructor
|
||||
//! \~russian Конструктор копирования
|
||||
uint_cl(const uint_cl<L> & v) {
|
||||
for (int i = 0; i < L / 8; ++i)
|
||||
data_[i] = v.data_[i];
|
||||
}
|
||||
|
||||
//! \~english Construct from unsigned char
|
||||
//! \~russian Конструктор из unsigned char
|
||||
uint_cl(uchar v) {
|
||||
for (int i = 0; i < L / 8; ++i)
|
||||
data_[i] = (i == 0 ? v : 0);
|
||||
}
|
||||
|
||||
//! \~english Construct from char
|
||||
//! \~russian Конструктор из char
|
||||
uint_cl(char v) {
|
||||
for (int i = 0; i < L / 8; ++i)
|
||||
data_[i] = (i == 0 ? v : 0);
|
||||
}
|
||||
|
||||
//! \~english Construct from unsigned short
|
||||
//! \~russian Конструктор из unsigned short
|
||||
uint_cl(ushort v) {
|
||||
int l = piMin<uint>(L / 8, sizeof(v));
|
||||
memcpy(data_, &v, l);
|
||||
for (int i = l; i < L / 8; ++i)
|
||||
data_[i] = 0;
|
||||
}
|
||||
|
||||
//! \~english Construct from short
|
||||
//! \~russian Конструктор из short
|
||||
uint_cl(short v) {
|
||||
int l = piMin<uint>(L / 8, sizeof(v));
|
||||
memcpy(data_, &v, l);
|
||||
for (int i = l; i < L / 8; ++i)
|
||||
data_[i] = 0;
|
||||
}
|
||||
|
||||
//! \~english Construct from unsigned int
|
||||
//! \~russian Конструктор из unsigned int
|
||||
uint_cl(uint v) {
|
||||
int l = piMin<uint>(L / 8, sizeof(v));
|
||||
memcpy(data_, &v, l);
|
||||
for (int i = l; i < L / 8; ++i)
|
||||
data_[i] = 0;
|
||||
}
|
||||
|
||||
//! \~english Construct from int
|
||||
//! \~russian Конструктор из int
|
||||
uint_cl(int v) {
|
||||
int l = piMin<uint>(L / 8, sizeof(v));
|
||||
memcpy(data_, &v, l);
|
||||
for (int i = l; i < L / 8; ++i)
|
||||
data_[i] = 0;
|
||||
}
|
||||
|
||||
//! \~english Construct from unsigned long
|
||||
//! \~russian Конструктор из unsigned long
|
||||
uint_cl(ulong v) {
|
||||
int l = piMin<uint>(L / 8, sizeof(v));
|
||||
memcpy(data_, &v, l);
|
||||
for (int i = l; i < L / 8; ++i)
|
||||
data_[i] = 0;
|
||||
}
|
||||
|
||||
//! \~english Construct from long
|
||||
//! \~russian Конструктор из long
|
||||
uint_cl(long v) {
|
||||
int l = piMin<uint>(L / 8, sizeof(v));
|
||||
memcpy(data_, &v, l);
|
||||
for (int i = l; i < L / 8; ++i)
|
||||
data_[i] = 0;
|
||||
}
|
||||
|
||||
//! \~english Construct from unsigned long long
|
||||
//! \~russian Конструктор из unsigned long long
|
||||
uint_cl(ullong v) {
|
||||
int l = piMin<uint>(L / 8, sizeof(v));
|
||||
memcpy(data_, &v, l);
|
||||
for (int i = l; i < L / 8; ++i)
|
||||
data_[i] = 0;
|
||||
}
|
||||
|
||||
//! \~english Construct from long long
|
||||
//! \~russian Конструктор из long long
|
||||
uint_cl(llong v) {
|
||||
int l = piMin<uint>(L / 8, sizeof(v));
|
||||
memcpy(data_, &v, l);
|
||||
@@ -96,55 +142,87 @@ public:
|
||||
data_[i] = 0;
|
||||
}
|
||||
|
||||
//! \~english Convert to bool
|
||||
//! \~russian Преобразование в bool
|
||||
operator bool() {
|
||||
for (int i = 0; i < L / 8; ++i)
|
||||
if (data_[i] > 0) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
//! \~english Convert to char
|
||||
//! \~russian Преобразование в char
|
||||
operator char() { return (char)data_[0]; }
|
||||
|
||||
//! \~english Convert to short
|
||||
//! \~russian Преобразование в short
|
||||
operator short() {
|
||||
short t(0);
|
||||
int l = piMin<uint>(L / 8, sizeof(t));
|
||||
memcpy(&t, data_, l);
|
||||
return t;
|
||||
}
|
||||
|
||||
//! \~english Convert to int
|
||||
//! \~russian Преобразование в int
|
||||
operator int() {
|
||||
int t(0);
|
||||
int l = piMin<uint>(L / 8, sizeof(t));
|
||||
memcpy(&t, data_, l);
|
||||
return t;
|
||||
}
|
||||
|
||||
//! \~english Convert to long
|
||||
//! \~russian Преобразование в long
|
||||
operator long() {
|
||||
long t(0);
|
||||
int l = piMin<uint>(L / 8, sizeof(t));
|
||||
memcpy(&t, data_, l);
|
||||
return t;
|
||||
}
|
||||
|
||||
//! \~english Convert to long long
|
||||
//! \~russian Преобразование в long long
|
||||
operator llong() {
|
||||
llong t(0);
|
||||
int l = piMin<uint>(L / 8, sizeof(t));
|
||||
memcpy(&t, data_, l);
|
||||
return t;
|
||||
}
|
||||
|
||||
//! \~english Convert to unsigned char
|
||||
//! \~russian Преобразование в unsigned char
|
||||
operator uchar() { return data_[0]; }
|
||||
|
||||
//! \~english Convert to unsigned short
|
||||
//! \~russian Преобразование в unsigned short
|
||||
operator ushort() {
|
||||
ushort t(0);
|
||||
int l = piMin<uint>(L / 8, sizeof(t));
|
||||
memcpy(&t, data_, l);
|
||||
return t;
|
||||
}
|
||||
|
||||
//! \~english Convert to unsigned int
|
||||
//! \~russian Преобразование в unsigned int
|
||||
operator uint() {
|
||||
uint t(0);
|
||||
int l = piMin<uint>(L / 8, sizeof(t));
|
||||
memcpy(&t, data_, l);
|
||||
return t;
|
||||
}
|
||||
|
||||
//! \~english Convert to unsigned long
|
||||
//! \~russian Преобразование в unsigned long
|
||||
operator ulong() {
|
||||
ulong t(0);
|
||||
int l = piMin<uint>(L / 8, sizeof(t));
|
||||
memcpy(&t, data_, l);
|
||||
return t;
|
||||
}
|
||||
|
||||
//! \~english Convert to unsigned long long
|
||||
//! \~russian Преобразование в unsigned long long
|
||||
operator ullong() {
|
||||
ullong t(0);
|
||||
int l = piMin<uint>(L / 8, sizeof(t));
|
||||
@@ -152,6 +230,8 @@ public:
|
||||
return t;
|
||||
}
|
||||
|
||||
//! \~english Addition operator
|
||||
//! \~russian Оператор сложения
|
||||
uint_cl<L> operator+(const uint_cl<L> & v) {
|
||||
uint_cl<L> t;
|
||||
uint cv;
|
||||
@@ -165,12 +245,15 @@ public:
|
||||
return t;
|
||||
}
|
||||
|
||||
//! \~english Bitwise AND operator
|
||||
//! \~russian Побитовый оператор И
|
||||
uint_cl<L> operator&(const uint_cl<L> & v) const {
|
||||
uint_cl<L> t;
|
||||
for (int i = 0; i < L / 8; ++i)
|
||||
t.data_[i] = v.data_[i] & data_[i];
|
||||
return t;
|
||||
}
|
||||
|
||||
uint_cl<L> operator&(const uchar & v) const { return *this & uint_cl<L>(v); }
|
||||
uint_cl<L> operator&(const ushort & v) const { return *this & uint_cl<L>(v); }
|
||||
uint_cl<L> operator&(const uint & v) const { return *this & uint_cl<L>(v); }
|
||||
@@ -182,12 +265,15 @@ public:
|
||||
uint_cl<L> operator&(const long & v) const { return *this & uint_cl<L>(v); }
|
||||
uint_cl<L> operator&(const llong & v) const { return *this & uint_cl<L>(v); }
|
||||
|
||||
//! \~english Bitwise OR operator
|
||||
//! \~russian Побитовый оператор ИЛИ
|
||||
uint_cl<L> operator|(const uint_cl<L> & v) const {
|
||||
uint_cl<L> t;
|
||||
for (int i = 0; i < L / 8; ++i)
|
||||
t.data_[i] = v.data_[i] | data_[i];
|
||||
return t;
|
||||
}
|
||||
|
||||
uint_cl<L> operator|(const uchar & v) const { return *this | uint_cl<L>(v); }
|
||||
uint_cl<L> operator|(const ushort & v) const { return *this | uint_cl<L>(v); }
|
||||
uint_cl<L> operator|(const uint & v) const { return *this | uint_cl<L>(v); }
|
||||
@@ -199,12 +285,15 @@ public:
|
||||
uint_cl<L> operator|(const long & v) const { return *this | uint_cl<L>(v); }
|
||||
uint_cl<L> operator|(const llong & v) const { return *this | uint_cl<L>(v); }
|
||||
|
||||
//! \~english Bitwise XOR operator
|
||||
//! \~russian Побитовый оператор исключающее ИЛИ
|
||||
uint_cl<L> operator^(const uint_cl<L> & v) const {
|
||||
uint_cl<L> t;
|
||||
for (int i = 0; i < L / 8; ++i)
|
||||
t.data_[i] = v.data_[i] ^ data_[i];
|
||||
return t;
|
||||
}
|
||||
|
||||
uint_cl<L> operator^(const uchar & v) const { return *this ^ uint_cl<L>(v); }
|
||||
uint_cl<L> operator^(const ushort & v) const { return *this ^ uint_cl<L>(v); }
|
||||
uint_cl<L> operator^(const uint & v) const { return *this ^ uint_cl<L>(v); }
|
||||
@@ -216,6 +305,8 @@ public:
|
||||
uint_cl<L> operator^(const long & v) const { return *this ^ uint_cl<L>(v); }
|
||||
uint_cl<L> operator^(const llong & v) const { return *this ^ uint_cl<L>(v); }
|
||||
|
||||
//! \~english Less than operator
|
||||
//! \~russian Оператор меньше
|
||||
bool operator<(const uint_cl<L> & v) const {
|
||||
for (int i = 0; i < L / 8; ++i) {
|
||||
if (v.data_[i] > data_[i]) return true;
|
||||
@@ -223,6 +314,9 @@ public:
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//! \~english Less than or equal operator
|
||||
//! \~russian Оператор меньше или равно
|
||||
bool operator<=(const uint_cl<L> & v) const {
|
||||
for (int i = 0; i < L / 8; ++i) {
|
||||
if (v.data_[i] > data_[i]) return true;
|
||||
@@ -230,6 +324,9 @@ public:
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
//! \~english Greater than operator
|
||||
//! \~russian Оператор больше
|
||||
bool operator>(const uint_cl<L> & v) const {
|
||||
for (int i = 0; i < L / 8; ++i) {
|
||||
if (v.data_[i] < data_[i]) return true;
|
||||
@@ -237,6 +334,9 @@ public:
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//! \~english Greater than or equal operator
|
||||
//! \~russian Оператор больше или равно
|
||||
bool operator>=(const uint_cl<L> & v) const {
|
||||
for (int i = 0; i < L / 8; ++i) {
|
||||
if (v.data_[i] < data_[i]) return true;
|
||||
@@ -244,18 +344,27 @@ public:
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
//! \~english Equality operator
|
||||
//! \~russian Оператор равенства
|
||||
bool operator==(const uint_cl<L> & v) const {
|
||||
for (int i = 0; i < L / 8; ++i)
|
||||
if (v.data_[i] != data_[i]) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
//! \~english Inequality operator
|
||||
//! \~russian Оператор неравенства
|
||||
bool operator!=(const uint_cl<L> & v) const {
|
||||
for (int i = 0; i < L / 8; ++i)
|
||||
if (v.data_[i] != data_[i]) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool operator<=(const uint_cl<8> & v1) { return (*(uchar *)data()) <= (*(uchar *)v1.data()); }
|
||||
|
||||
//! \~english Right shift operator
|
||||
//! \~russian Оператор побитового сдвига вправо
|
||||
uint_cl<L> operator>>(const int & c) const {
|
||||
uint_cl<L> t;
|
||||
int l = L - c;
|
||||
@@ -270,7 +379,11 @@ public:
|
||||
}
|
||||
return t;
|
||||
}
|
||||
|
||||
uint_cl<L> operator>>(const uint & c) const { return (*this << (int)c); }
|
||||
|
||||
//! \~english Left shift operator
|
||||
//! \~russian Оператор побитового сдвига влево
|
||||
uint_cl<L> operator<<(const int & c) const {
|
||||
uint_cl<L> t;
|
||||
int l = L - c;
|
||||
@@ -285,19 +398,28 @@ public:
|
||||
}
|
||||
return t;
|
||||
}
|
||||
|
||||
uint_cl<L> operator<<(const uint & c) const { return (*this >> (int)c); }
|
||||
|
||||
//! \~english In-place bitwise inversion
|
||||
//! \~russian Побитовая инверсия на месте
|
||||
uint_cl<L> & inverse() const {
|
||||
for (int i = 0; i < L / 8; ++i)
|
||||
data_[i] = ~data_[i];
|
||||
return *this;
|
||||
}
|
||||
|
||||
//! \~english Returns bitwise inverted copy
|
||||
//! \~russian Возвращает копию с побитовой инверсией
|
||||
uint_cl<L> inversed() const {
|
||||
uint_cl<L> t(*this);
|
||||
for (int i = 0; i < L / 8; ++i)
|
||||
t.data_[i] = ~t.data_[i];
|
||||
return t;
|
||||
}
|
||||
|
||||
//! \~english Returns bit-reversed copy
|
||||
//! \~russian Возвращает копию с переставленными битами
|
||||
uint_cl<L> reversed() const {
|
||||
uint_cl<L> t;
|
||||
bool bit;
|
||||
@@ -311,8 +433,16 @@ public:
|
||||
return t;
|
||||
}
|
||||
|
||||
//! \~english Get const pointer to data
|
||||
//! \~russian Получить константный указатель на данные
|
||||
const uchar * data() const { return data_; }
|
||||
|
||||
//! \~english Get pointer to data
|
||||
//! \~russian Получить указатель на данные
|
||||
uchar * data() { return data_; }
|
||||
|
||||
//! \~english Get data length in bytes
|
||||
//! \~russian Получить длину данных в байтах
|
||||
uint length() const { return L / 8; }
|
||||
|
||||
private:
|
||||
@@ -320,6 +450,11 @@ private:
|
||||
};
|
||||
|
||||
|
||||
//! \~english Reverse byte order
|
||||
//! \~russian Реверс порядка байтов
|
||||
//! \details
|
||||
//! \~english Reverses the bit order within a byte
|
||||
//! \~russian Инвертирует порядок битов в байте
|
||||
inline uchar reverseByte(uchar b) {
|
||||
uchar ret = 0;
|
||||
bool bit;
|
||||
@@ -330,9 +465,26 @@ inline uchar reverseByte(uchar b) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
//! \addtogroup Math
|
||||
//! \{
|
||||
//! \class PICRC
|
||||
//! \brief
|
||||
//! \~english CRC calculator class
|
||||
//! \~russian Класс калькулятора CRC
|
||||
//! \details
|
||||
//! \~english Calculates CRC checksum using configurable polynomial and parameters
|
||||
//! \~russian Вычисляет контрольную сумму CRC с использованием настраиваемого полинома и параметров
|
||||
//! \sa CRC_32, CRC_16, CRC_8
|
||||
//! \}
|
||||
|
||||
template<uint L, typename N = uint_cl<L>>
|
||||
class PIP_EXPORT PICRC {
|
||||
public:
|
||||
//! \~english Default constructor
|
||||
//! \~russian Конструктор по умолчанию
|
||||
//! \note
|
||||
//! \~english Polynomial value defaults to zero
|
||||
//! \~russian Значение полинома по умолчанию ноль
|
||||
PICRC(const N & poly = N()) {
|
||||
poly_ = poly;
|
||||
reverse_poly = true;
|
||||
@@ -341,6 +493,13 @@ public:
|
||||
reverse_before_xor = reverse_data = false;
|
||||
initTable();
|
||||
}
|
||||
|
||||
//! \~english Constructor with full parameters
|
||||
//! \~russian Конструктор с полными параметрами
|
||||
//! \param poly polynomial value
|
||||
//! \param reverse_poly_ whether to reverse polynomial bits
|
||||
//! \param initial initial CRC value
|
||||
//! \param out_xor XOR value for output
|
||||
PICRC(const N & poly, bool reverse_poly_, const N & initial, const N & out_xor) {
|
||||
poly_ = poly;
|
||||
reverse_poly = reverse_poly_;
|
||||
@@ -350,18 +509,33 @@ public:
|
||||
initTable();
|
||||
}
|
||||
|
||||
//! \~english Set initial CRC value
|
||||
//! \~russian Установить начальное значение CRC
|
||||
void setInitial(const N & v) { init_ = v; }
|
||||
|
||||
//! \~english Set output XOR value
|
||||
//! \~russian Установить значение XOR для вывода
|
||||
void setOutXor(const N & v) { out_ = v; }
|
||||
|
||||
//! \~english Set polynomial bit reversal
|
||||
//! \~russian Установить реверс битов полинома
|
||||
void setReversePolynome(bool yes) {
|
||||
reverse_poly = yes;
|
||||
initTable();
|
||||
}
|
||||
|
||||
//! \~english Set output bit reversal before XOR
|
||||
//! \~russian Установить реверс битов вывода перед XOR
|
||||
void setReverseOutBeforeXOR(bool yes) { reverse_before_xor = yes; }
|
||||
|
||||
//! \~english Set data byte reversal
|
||||
//! \~russian Установить реверс байтов данных
|
||||
void setReverseDataBytes(bool yes) { reverse_data = yes; }
|
||||
|
||||
//! \~english Initialize lookup table
|
||||
//! \~russian Инициализировать таблицу поиска
|
||||
void initTable() {
|
||||
N tmp, pol = reverse_poly ? reversed(poly_) : poly_;
|
||||
// cout << std::hex << "poly " << (uint)N(poly_) << " -> " << (uint)N(pol) << endl;
|
||||
for (int i = 0; i < 256; ++i) {
|
||||
tmp = uchar(i);
|
||||
for (int j = 0; j < 8; ++j)
|
||||
@@ -370,10 +544,11 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
//! \~english Calculate CRC from raw data
|
||||
//! \~russian Вычислить CRC из сырых данных
|
||||
N calculate(const void * data, int size) {
|
||||
N crc = init_;
|
||||
uchar *data_ = (uchar *)data, cb;
|
||||
// cout << "process " << size << endl;
|
||||
uchar nTemp;
|
||||
for (int i = 0; i < size; ++i) {
|
||||
cb = data_[i];
|
||||
@@ -385,7 +560,13 @@ public:
|
||||
if (reverse_before_xor) crc = reversed(crc);
|
||||
return crc ^ out_;
|
||||
}
|
||||
|
||||
//! \~english Calculate CRC from PIByteArray
|
||||
//! \~russian Вычислить CRC из PIByteArray
|
||||
N calculate(const PIByteArray & d) { return calculate(d.data(), d.size()); }
|
||||
|
||||
//! \~english Calculate CRC from null-terminated string
|
||||
//! \~russian Вычислить CRC из нуль-терминированной строки
|
||||
N calculate(const char * str) {
|
||||
PIByteArray s(PIString(str).toByteArray());
|
||||
return calculate(s.data(), s.size_s());
|
||||
@@ -425,22 +606,46 @@ inline uint PICRC<32, uint>::inversed(const uint & v) {
|
||||
return ~v;
|
||||
}
|
||||
|
||||
//! \~english Standard CRC-32 (Ethernet, ZIP, etc.)
|
||||
//! \~russian Стандартный CRC-32 (Ethernet, ZIP и т.д.)
|
||||
typedef PICRC<32, uint> CRC_32;
|
||||
|
||||
//! \~english Standard CRC-24
|
||||
//! \~russian Стандартный CRC-24
|
||||
typedef PICRC<24> CRC_24;
|
||||
|
||||
//! \~english Standard CRC-16
|
||||
//! \~russian Стандартный CRC-16
|
||||
typedef PICRC<16, ushort> CRC_16;
|
||||
|
||||
//! \~english Standard CRC-8
|
||||
//! \~russian Стандартный CRC-8
|
||||
typedef PICRC<8, uchar> CRC_8;
|
||||
|
||||
//! \~english Create standard CRC-32 calculator
|
||||
//! \~russian Создать стандартный калькулятор CRC-32
|
||||
inline CRC_32 standardCRC_32() {
|
||||
return CRC_32(0x04C11DB7, true, 0xFFFFFFFF, 0xFFFFFFFF);
|
||||
}
|
||||
|
||||
//! \~english Create standard CRC-16 calculator
|
||||
//! \~russian Создать стандартный калькулятор CRC-16
|
||||
inline CRC_16 standardCRC_16() {
|
||||
return CRC_16(0x8005, true, 0x0, 0x0);
|
||||
}
|
||||
|
||||
//! \~english Create standard CRC-16 Modbus calculator
|
||||
//! \~russian Создать стандартный калькулятор CRC-16 Modbus
|
||||
inline CRC_16 standardCRC_16_Modbus() {
|
||||
return CRC_16(0x8005, 0xFFFF, 0xFFFF, false);
|
||||
}
|
||||
|
||||
//! \~english Create standard CRC-8 calculator
|
||||
//! \~russian Создать стандартный калькулятор CRC-8
|
||||
inline CRC_8 standardCRC_8() {
|
||||
return CRC_8(0xD5, true, 0x0, 0x0);
|
||||
}
|
||||
|
||||
//! \}
|
||||
|
||||
#endif // CRC_H
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
/*! \file pifft.h
|
||||
* \ingroup Math
|
||||
* \ingroup FFTW
|
||||
* \~\brief
|
||||
* \~english FFT, IFFT and Hilbert transformations
|
||||
* \~russian БПФ, ОБПФ и преобразования Гильберта
|
||||
*/
|
||||
//! \addtogroup Math
|
||||
//! \{
|
||||
//! \file pifft.h
|
||||
//! \brief
|
||||
//! \~english Declares \a PIFFT classes
|
||||
//! \~russian Объявление классов \a PIFFT
|
||||
//! \~\authors
|
||||
//! \~english Ivan Pelipenko peri4ko@yandex.ru; Andrey Bychkov work.a.b@yandex.ru
|
||||
//! \~russian Иван Пелипенко peri4ko@yandex.ru; Андрей Бычков work.a.b@yandex.ru
|
||||
//! \~\}
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
Class for FFT, IFFT and Hilbert transformations
|
||||
@@ -64,16 +67,40 @@
|
||||
|
||||
# include "pip_fftw_export.h"
|
||||
|
||||
//! \addtogroup Math
|
||||
//! \{
|
||||
//! \class PIFFT_double
|
||||
//! \brief
|
||||
//! \~english Fast Fourier Transform implementation for double precision.
|
||||
//! \~russian Реализация быстрого преобразования Фурье для двойной точности.
|
||||
//! \~\}
|
||||
//! \sa \a PIFFT_float, \a PIFFTW
|
||||
class PIP_EXPORT PIFFT_double {
|
||||
public:
|
||||
//! \~english Default constructor.
|
||||
//! \~russian Конструктор по умолчанию.
|
||||
PIFFT_double();
|
||||
|
||||
//! \~english Calculate FFT from complex vector.
|
||||
//! \~russian Вычисление БПФ из комплексного вектора.
|
||||
PIVector<complexd> * calcFFT(const PIVector<complexd> & val);
|
||||
//! \~english Calculate FFT from real vector.
|
||||
//! \~russian Вычисление БПФ из вещественного вектора.
|
||||
PIVector<complexd> * calcFFT(const PIVector<double> & val);
|
||||
//! \~english Calculate inverse FFT.
|
||||
//! \~russian Вычисление обратного БПФ.
|
||||
PIVector<complexd> * calcFFTinverse(const PIVector<complexd> & val);
|
||||
//! \~english Calculate Hilbert transform.
|
||||
//! \~russian Вычисление преобразования Гильберта.
|
||||
PIVector<complexd> * calcHilbert(const PIVector<double> & val);
|
||||
//! \~english Get amplitude spectrum.
|
||||
//! \~russian Получить амплитудный спектр.
|
||||
PIVector<double> getAmplitude() const;
|
||||
//! \~english Get real part.
|
||||
//! \~russian Получить действительную часть.
|
||||
PIVector<double> getReal() const;
|
||||
//! \~english Get imaginary part.
|
||||
//! \~russian Получить мнимую часть.
|
||||
PIVector<double> getImag() const;
|
||||
|
||||
private:
|
||||
@@ -118,16 +145,40 @@ private:
|
||||
void ftbase_ffttwcalc(PIVector<double> * a, int aoffset, int n1, int n2);
|
||||
};
|
||||
|
||||
//! \addtogroup Math
|
||||
//! \{
|
||||
//! \class PIFFT_float
|
||||
//! \brief
|
||||
//! \~english Fast Fourier Transform implementation for single precision.
|
||||
//! \~russian Реализация быстрого преобразования Фурье для одинарной точности.
|
||||
//! \~\}
|
||||
//! \sa \a PIFFT_double, \a PIFFTW
|
||||
class PIP_EXPORT PIFFT_float {
|
||||
public:
|
||||
//! \~english Default constructor.
|
||||
//! \~russian Конструктор по умолчанию.
|
||||
PIFFT_float();
|
||||
|
||||
//! \~english Calculate FFT from complex vector.
|
||||
//! \~russian Вычисление БПФ из комплексного вектора.
|
||||
PIVector<complexf> * calcFFT(const PIVector<complexf> & val);
|
||||
//! \~english Calculate FFT from real vector.
|
||||
//! \~russian Вычисление БПФ из вещественного вектора.
|
||||
PIVector<complexf> * calcFFT(const PIVector<float> & val);
|
||||
//! \~english Calculate inverse FFT.
|
||||
//! \~russian Вычисление обратного БПФ.
|
||||
PIVector<complexf> * calcFFTinverse(const PIVector<complexf> & val);
|
||||
//! \~english Calculate Hilbert transform.
|
||||
//! \~russian Вычисление преобразования Гильберта.
|
||||
PIVector<complexf> * calcHilbert(const PIVector<float> & val);
|
||||
//! \~english Get amplitude spectrum.
|
||||
//! \~russian Получить амплитудный спектр.
|
||||
PIVector<float> getAmplitude() const;
|
||||
//! \~english Get real part.
|
||||
//! \~russian Получить действительную часть.
|
||||
PIVector<float> getReal() const;
|
||||
//! \~english Get imaginary part.
|
||||
//! \~russian Получить мнимую часть.
|
||||
PIVector<float> getImag() const;
|
||||
|
||||
private:
|
||||
@@ -171,6 +222,7 @@ private:
|
||||
void ftbase_fftirltrec(PIVector<float> * a, int astart, int astride, PIVector<float> * b, int bstart, int bstride, int m, int n);
|
||||
void ftbase_ffttwcalc(PIVector<float> * a, int aoffset, int n1, int n2);
|
||||
};
|
||||
//! \~\}
|
||||
|
||||
typedef PIFFT_double PIFFT;
|
||||
typedef PIFFT_double PIFFTd;
|
||||
@@ -178,40 +230,63 @@ typedef PIFFT_float PIFFTf;
|
||||
|
||||
# ifndef CC_VC
|
||||
|
||||
# define _PIFFTW_H(type) \
|
||||
class PIP_FFTW_EXPORT _PIFFTW_P_##type##_ { \
|
||||
public: \
|
||||
_PIFFTW_P_##type##_(); \
|
||||
~_PIFFTW_P_##type##_(); \
|
||||
const PIVector<complex<type>> & calcFFT(const PIVector<complex<type>> & in); \
|
||||
const PIVector<complex<type>> & calcFFTR(const PIVector<type> & in); \
|
||||
const PIVector<complex<type>> & calcFFTI(const PIVector<complex<type>> & in); \
|
||||
void preparePlan(int size, int op); \
|
||||
void * impl; \
|
||||
};
|
||||
# define _PIFFTW_H(type) \
|
||||
class PIP_FFTW_EXPORT _PIFFTW_P_##type##_ { \
|
||||
public: \
|
||||
_PIFFTW_P_##type##_(); \
|
||||
~_PIFFTW_P_##type##_(); \
|
||||
const PIVector<complex<type>> & calcFFT(const PIVector<complex<type>> & in); \
|
||||
const PIVector<complex<type>> & calcFFTR(const PIVector<type> & in); \
|
||||
const PIVector<complex<type>> & calcFFTI(const PIVector<complex<type>> & in); \
|
||||
void preparePlan(int size, int op); \
|
||||
void * impl; \
|
||||
};
|
||||
_PIFFTW_H(float)
|
||||
_PIFFTW_H(double)
|
||||
_PIFFTW_H(ldouble)
|
||||
|
||||
//! \addtogroup FFTW
|
||||
//! \{
|
||||
//! \class PIFFTW
|
||||
//! \brief
|
||||
//! \~english FFTW wrapper for arbitrary precision types.
|
||||
//! \~russian Обёртка FFTW для типов произвольной точности.
|
||||
//! \~\}
|
||||
//! \note Requires linking against libfftw3
|
||||
//! \sa \a PIFFT_double, \a PIFFT_float
|
||||
template<typename T>
|
||||
class PIFFTW {
|
||||
public:
|
||||
//! \~english Default constructor.
|
||||
//! \~russian Конструктор по умолчанию.
|
||||
explicit PIFFTW() {
|
||||
p = 0;
|
||||
newP(p);
|
||||
}
|
||||
//! \~english Destructor.
|
||||
//! \~russian Деструктор.
|
||||
~PIFFTW() { deleteP(p); }
|
||||
|
||||
//! \~english Calculate FFT from complex vector.
|
||||
//! \~russian Вычисление БПФ из комплексного вектора.
|
||||
inline const PIVector<complex<T>> & calcFFT(const PIVector<complex<T>> & in) { return PIVector<complex<T>>().resize(in.size()); }
|
||||
//! \~english Calculate FFT from real vector.
|
||||
//! \~russian Вычисление БПФ из вещественного вектора.
|
||||
inline const PIVector<complex<T>> & calcFFT(const PIVector<T> & in) { return PIVector<complex<T>>().resize(in.size()); }
|
||||
//! \~english Calculate inverse FFT.
|
||||
//! \~russian Вычисление обратного БПФ.
|
||||
inline const PIVector<complex<T>> & calcFFTinverse(const PIVector<complex<T>> & in) { return PIVector<complex<T>>().resize(in.size()); }
|
||||
|
||||
//! \~english FFT operation type.
|
||||
//! \~russian Тип операции БПФ.
|
||||
enum FFT_Operation {
|
||||
foReal,
|
||||
foComplex,
|
||||
foInverse
|
||||
};
|
||||
|
||||
//! \~english Prepare computation plan.
|
||||
//! \~russian Подготовить план вычислений.
|
||||
inline void preparePlan(int size, FFT_Operation op) {}
|
||||
|
||||
private:
|
||||
@@ -222,6 +297,7 @@ private:
|
||||
|
||||
void * p;
|
||||
};
|
||||
//! \~\}
|
||||
|
||||
|
||||
template<>
|
||||
|
||||
@@ -1,21 +1,13 @@
|
||||
/*! \file pigeometry.h
|
||||
* \ingroup Math
|
||||
* \brief
|
||||
* \~english Geometry base classes
|
||||
* \~russian Базовые геометрические классы
|
||||
* \~\details
|
||||
* \~english
|
||||
* Add \a PIPoint, \a PILine and \a PIRect classes.
|
||||
* \~russian
|
||||
* Содержит классы: \a PIPoint, \a PILine и \a PIRect.
|
||||
* * \~\authors
|
||||
* \~english
|
||||
* Ivan Pelipenko peri4ko@yandex.ru;
|
||||
* Andrey Bychkov work.a.b@yandex.ru;
|
||||
* \~russian
|
||||
* Иван Пелипенко peri4ko@yandex.ru;
|
||||
* Андрей Бычков work.a.b@yandex.ru;
|
||||
*/
|
||||
//! \addtogroup Math
|
||||
//! \{
|
||||
//! \file pigeometry.h
|
||||
//! \brief
|
||||
//! \~english Geometry utilities
|
||||
//! \~russian Геометрические утилиты
|
||||
//! \~\authors
|
||||
//! \~english Ivan Pelipenko peri4ko@yandex.ru; Andrey Bychkov work.a.b@yandex.ru
|
||||
//! \~russian Иван Пелипенко peri4ko@yandex.ru; Андрей Бычков work.a.b@yandex.ru
|
||||
//! \~\}
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
Geometry base classes
|
||||
|
||||
Reference in New Issue
Block a user