/*******************************************************************************
* SDR Trunk
* Copyright (C) 2014 Dennis Sheirer
*
* 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 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 for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see
******************************************************************************/
package dsp;
import sample.Listener;
import buffer.FloatCircularAveragingBuffer;
public class FloatToBinarySlicer implements Listener
{
private FloatCircularAveragingBuffer mAveragingBuffer;
private Listener mListener;
/**
* Provides binary slicing of the stream of floats, using a circular buffer
* to calculate a running average, then basing the slice decision based
* on the oldest sample leaving the circular buffer, compared to the running
* average.
*
* Designed to operate with a DC bias inherent in the sample stream.
*
* Tracks a long average and a short average to compensate for drifting
* transmitters.
*
* The long buffer compensates for long strings of ones or
* zeros. Set the long buffer size to a few baud periods longer than the
* longest anticipated string of like symbols.
*
*/
public FloatToBinarySlicer( int bufferSize, int sampleCountForAveraging )
{
mAveragingBuffer = new FloatCircularAveragingBuffer( bufferSize,
sampleCountForAveraging );
}
@Override
public void receive( Float newestSample )
{
float oldestSample = mAveragingBuffer.get( newestSample );
//Dispatch the decision
mListener.receive( oldestSample > mAveragingBuffer.getAverage() );
}
public void setListener( Listener listener )
{
mListener = listener;
}
public void clearListener()
{
mListener = null;
}
}