mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-12-23 10:05:46 -05:00
224 lines
5.7 KiB
C++
224 lines
5.7 KiB
C++
///////////////////////////////////////////////////////////////////////////////////
|
|
// Copyright (C) 2020 Edouard Griffiths, F4EXB <f4exb06@gmail.com> //
|
|
// //
|
|
// This program is free software; you can redistribute it and/or modify //
|
|
// it under the terms of the GNU General Public License as published by //
|
|
// the Free Software Foundation as 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 General Public License V3 for more details. //
|
|
// //
|
|
// You should have received a copy of the GNU General Public License //
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "decimatorc.h"
|
|
|
|
DecimatorC::DecimatorC() :
|
|
m_log2Decim(0),
|
|
m_decim(1)
|
|
{}
|
|
|
|
void DecimatorC::setLog2Decim(unsigned int log2Decim)
|
|
{
|
|
m_log2Decim = log2Decim;
|
|
m_decim = 1 << log2Decim;
|
|
}
|
|
|
|
bool DecimatorC::decimate(Complex c, Complex& cd)
|
|
{
|
|
if (m_log2Decim == 0) { // no decimation hence no translation possible
|
|
return true;
|
|
}
|
|
|
|
if (m_log2Decim == 1) {
|
|
return decimate2(c, cd);
|
|
} else if (m_log2Decim == 2) {
|
|
return decimate4(c, cd);
|
|
} else if (m_log2Decim == 3) {
|
|
return decimate8(c, cd);
|
|
} else if (m_log2Decim == 4) {
|
|
return decimate16(c, cd);
|
|
} else if (m_log2Decim == 5) {
|
|
return decimate32(c, cd);
|
|
} else if (m_log2Decim == 6) {
|
|
return decimate64(c, cd);
|
|
} else {
|
|
return true; // no decimation
|
|
}
|
|
}
|
|
|
|
bool DecimatorC::decimate2(Complex c, Complex& cd)
|
|
{
|
|
float x = c.real();
|
|
float y = c.imag();
|
|
bool done2 = m_decimator2.workDecimateCenter(&x, &y);
|
|
|
|
if (done2)
|
|
{
|
|
cd.real(x);
|
|
cd.imag(y);
|
|
}
|
|
|
|
return done2;
|
|
}
|
|
|
|
bool DecimatorC::decimate4(Complex c, Complex& cd)
|
|
{
|
|
float x = c.real();
|
|
float y = c.imag();
|
|
bool done2 = m_decimator2.workDecimateCenter(&x, &y);
|
|
|
|
if (done2)
|
|
{
|
|
bool done4 = m_decimator4.workDecimateCenter(&x, &y);
|
|
|
|
if (done4)
|
|
{
|
|
cd.real(x);
|
|
cd.imag(y);
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool DecimatorC::decimate8(Complex c, Complex& cd)
|
|
{
|
|
float x = c.real();
|
|
float y = c.imag();
|
|
bool done2 = m_decimator2.workDecimateCenter(&x, &y);
|
|
|
|
if (done2)
|
|
{
|
|
bool done4 = m_decimator4.workDecimateCenter(&x, &y);
|
|
|
|
if (done4)
|
|
{
|
|
bool done8 = m_decimator8.workDecimateCenter(&x, &y);
|
|
|
|
if (done8)
|
|
{
|
|
cd.real(x);
|
|
cd.imag(y);
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool DecimatorC::decimate16(Complex c, Complex& cd)
|
|
{
|
|
float x = c.real();
|
|
float y = c.imag();
|
|
bool done2 = m_decimator2.workDecimateCenter(&x, &y);
|
|
|
|
if (done2)
|
|
{
|
|
bool done4 = m_decimator4.workDecimateCenter(&x, &y);
|
|
|
|
if (done4)
|
|
{
|
|
bool done8 = m_decimator8.workDecimateCenter(&x, &y);
|
|
|
|
if (done8)
|
|
{
|
|
bool done16 = m_decimator16.workDecimateCenter(&x, &y);
|
|
|
|
if (done16)
|
|
{
|
|
cd.real(x);
|
|
cd.imag(y);
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
bool DecimatorC::decimate32(Complex c, Complex& cd)
|
|
{
|
|
float x = c.real();
|
|
float y = c.imag();
|
|
bool done2 = m_decimator2.workDecimateCenter(&x, &y);
|
|
|
|
if (done2)
|
|
{
|
|
bool done4 = m_decimator4.workDecimateCenter(&x, &y);
|
|
|
|
if (done4)
|
|
{
|
|
bool done8 = m_decimator8.workDecimateCenter(&x, &y);
|
|
|
|
if (done8)
|
|
{
|
|
bool done16 = m_decimator16.workDecimateCenter(&x, &y);
|
|
|
|
if (done16)
|
|
{
|
|
bool done32 = m_decimator32.workDecimateCenter(&x, &y);
|
|
|
|
if (done32)
|
|
{
|
|
cd.real(x);
|
|
cd.imag(y);
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool DecimatorC::decimate64(Complex c, Complex& cd)
|
|
{
|
|
float x = c.real();
|
|
float y = c.imag();
|
|
bool done2 = m_decimator2.workDecimateCenter(&x, &y);
|
|
|
|
if (done2)
|
|
{
|
|
bool done4 = m_decimator4.workDecimateCenter(&x, &y);
|
|
|
|
if (done4)
|
|
{
|
|
bool done8 = m_decimator8.workDecimateCenter(&x, &y);
|
|
|
|
if (done8)
|
|
{
|
|
bool done16 = m_decimator16.workDecimateCenter(&x, &y);
|
|
|
|
if (done16)
|
|
{
|
|
bool done32 = m_decimator32.workDecimateCenter(&x, &y);
|
|
|
|
if (done32)
|
|
{
|
|
bool done64 = m_decimator32.workDecimateCenter(&x, &y);
|
|
|
|
if (done64)
|
|
{
|
|
cd.real(x);
|
|
cd.imag(y);
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|