MMDVM/FMDownsampler.cpp

65 lines
1.9 KiB
C++

/*
* Copyright (C) 2020 by Jonathan Naylor G4KLX
* Copyright (C) 2020 by Geoffrey Merck F4FXL - KC3FRA
*
* 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; either version 2 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 for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "Config.h"
#include "FMDownsampler.h"
CFMDownsampler::CFMDownsampler(uint16_t length) :
m_ringBuffer(length),//length might need tweaking
m_samplePack(0U),
m_samplePackPointer(0U),
m_packIndex(0U),
m_downSampleIndex(0U)
{
m_samplePackPointer = &m_samplePack;
}
void CFMDownsampler::addSample(q15_t sample)
{
//only take one of three samples
if(m_downSampleIndex == 0U) {
switch(m_packIndex){
case 0:
m_samplePack = uint32_t(sample) << 12;
break;
case 1:{
m_samplePack |= uint32_t(sample);
//we did not use MSB; skip it
m_ringBuffer.put(m_samplePackPointer[1U]);
m_ringBuffer.put(m_samplePackPointer[2U]);
m_ringBuffer.put(m_samplePackPointer[3U]);
m_samplePack = 0;//reset the sample pack
}
break;
default:
//should never happen
break;
}
m_packIndex++;
if(m_packIndex >= 2U)//did we pack to samples ?
m_packIndex = 0U;
}
m_downSampleIndex++;
if(m_downSampleIndex >= 3U)
m_downSampleIndex = 0U;
}