diff options
-rw-r--r-- | common/cosinetables.cpp | 24 | ||||
-rw-r--r-- | common/cosinetables.h | 10 | ||||
-rw-r--r-- | common/sinetables.cpp | 25 | ||||
-rw-r--r-- | common/sinetables.h | 10 |
4 files changed, 52 insertions, 17 deletions
diff --git a/common/cosinetables.cpp b/common/cosinetables.cpp index 589c7c78b4..92b1723c89 100644 --- a/common/cosinetables.cpp +++ b/common/cosinetables.cpp @@ -34,35 +34,45 @@ CosineTable::CosineTable(int nPoints) { _nPoints = nPoints; _radResolution = 2.0 * M_PI / _nPoints; _refSize = _nPoints / 4; - _table = new float[_nPoints / 2]; + _tableEOS = new float[_nPoints / 2]; + _table = new float[_nPoints]; + + for (int i = 0; i < _nPoints; i++) + _table[i] = cos(i * _radResolution); // Table contains cos(2*pi*i/_nPoints) for 0<=i<=_nPoints/4, // followed by 3_nPoints/4<=i<_nPoints for (int i = 0; i <= _nPoints / 4; i++) - _table[i] = cos(i * _radResolution); + _tableEOS[i] = cos(i * _radResolution); for (int i = 1; i < _nPoints / 4; i++) - _table[_nPoints / 2 - i] = _table[i]; + _tableEOS[_nPoints / 2 - i] = _tableEOS[i]; } float CosineTable::at(int index) const { assert((index >= 0) && (index < _nPoints)); + return _table[index]; +} + +float CosineTable::atLegacy(int index) const { + assert((index >= 0) && (index < _nPoints)); if (index < _refSize) // [0,pi/2) - return _table[index]; + return _tableEOS[index]; if ((index > _refSize) && (index < 2 * _refSize)) // (pi/2,pi) - return -_table[2 * _refSize - index]; + return -_tableEOS[2 * _refSize - index]; if ((index >= 2 * _refSize) && (index < 3 * _refSize)) // [pi,3/2pi) - return -_table[index - 2 * _refSize]; + return -_tableEOS[index - 2 * _refSize]; if ((index > 3 * _refSize) && (index < _nPoints)) // (3/2pi,2pi) - return _table[_nPoints - index]; + return _tableEOS[_nPoints - index]; return 0.0f; // cos(pi/2) and cos(3pi/2) = 0 } CosineTable::~CosineTable() { + delete[] _tableEOS; delete[] _table; } diff --git a/common/cosinetables.h b/common/cosinetables.h index ac0aef8f60..65cfc2e6b9 100644 --- a/common/cosinetables.h +++ b/common/cosinetables.h @@ -46,15 +46,23 @@ public: * - Entries (excluding) nPoints/4 up to nPoints/2: * (excluding) cos(3/2*pi) till (excluding) cos(2*pi) */ - const float *getTable() { return _table; } + const float *getTable() { return _tableEOS; } /** * Returns cos(2*pi * index / nPoints ) * Index must be in range [0, nPoints - 1] + * Faster than atLegacy */ float at(int index) const; + /** + * Returns cos(2*pi * index / nPoints ) + * Index must be in range [0, nPoints - 1] + */ + float atLegacy(int index) const; + private: + float *_tableEOS; float *_table; double _radResolution; // Smallest radian increment int _refSize; // _nPoints / 4 diff --git a/common/sinetables.cpp b/common/sinetables.cpp index 1dce529d7d..4c0ee626e3 100644 --- a/common/sinetables.cpp +++ b/common/sinetables.cpp @@ -34,39 +34,48 @@ SineTable::SineTable(int nPoints) { _nPoints = nPoints; _radResolution = 2.0 * M_PI / _nPoints; _refSize = _nPoints / 4; - _table = new float[_nPoints / 2]; + _tableEOS = new float[_nPoints / 2]; + _table = new float[_nPoints]; + + for (int i = 0; i < _nPoints; i++) + _table[i] = sin(i * _radResolution); // Table contains sin(2*pi*i/_nPoints) for 0<=i<_nPoints/4, // followed by _nPoints/2<=i<3_nPoints/4 for (int i = 0; i < _nPoints / 4; i++) - _table[i] = sin(i * _radResolution); + _tableEOS[i] = sin(i * _radResolution); for (int i = 0; i < _nPoints / 4; i++) - _table[_nPoints / 4 + i] = -_table[i]; + _tableEOS[_nPoints / 4 + i] = -_tableEOS[i]; +} +float SineTable::at(int index) const { + assert((index >= 0) && (index < _nPoints)); + return _table[index]; } -float SineTable::at(int index) const { +float SineTable::atLegacy(int index) const { assert((index >= 0) && (index < _nPoints)); if (index < _refSize) // [0,pi/2) - return _table[index]; + return _tableEOS[index]; if (index == _refSize) // pi/2 return 1.0f; // sin(pi/2) = 1.0 if ((index > _refSize) && (index < 2 * _refSize)) // (pi/2,pi) - return _table[2 * _refSize - index]; + return _tableEOS[2 * _refSize - index]; if ((index >= 2 * _refSize) && (index < 3 * _refSize)) // [pi,3/2pi) - return -_table[index - 2 * _refSize]; + return -_tableEOS[index - 2 * _refSize]; if ((index > 3 * _refSize) && (index < _nPoints)) // (3/2pi,2pi) - return -_table[_nPoints - index]; + return -_tableEOS[_nPoints - index]; return -1.0f; // sin(3pi/2) = -1.0 } SineTable::~SineTable() { + delete[] _tableEOS; delete[] _table; } diff --git a/common/sinetables.h b/common/sinetables.h index 5a5f246467..bd030ca833 100644 --- a/common/sinetables.h +++ b/common/sinetables.h @@ -46,15 +46,23 @@ public: * - Entries 2_nPoints/4 up to nPoints/2: * sin(pi) till (excluding) sin(3/2*pi) */ - const float *getTable() { return _table; } + const float *getTable() { return _tableEOS; } /** * Returns sin(2*pi * index / nPoints ) * Index must be in range [0, nPoints - 1] + * Faster than atLegacy */ float at(int index) const; + /** + * Returns sin(2*pi * index / nPoints ) + * Index must be in range [0, nPoints - 1] + */ + float atLegacy(int index) const; + private: + float *_tableEOS; float *_table; double _radResolution; // Smallest radian increment int _refSize; // _nPoints / 4 |