mirror of
https://github.com/DSheirer/sdrtrunk.git
synced 2026-11-12 08:37:25 -05:00
Class renaming and cleanup.
This commit is contained in:
@@ -15,92 +15,94 @@
|
||||
******************************************************************************/
|
||||
package io.github.dsheirer.dsp.filter.halfband.complex;
|
||||
|
||||
import io.github.dsheirer.dsp.filter.halfband.real.HalfBandFilter;
|
||||
import io.github.dsheirer.dsp.filter.Filters;
|
||||
import io.github.dsheirer.dsp.filter.halfband.real.HalfBandFilter2;
|
||||
import io.github.dsheirer.dsp.mixer.Oscillator;
|
||||
import io.github.dsheirer.sample.buffer.ReusableComplexBuffer;
|
||||
import io.github.dsheirer.sample.buffer.ReusableComplexBufferQueue;
|
||||
|
||||
public class ComplexHalfBandFilter
|
||||
{
|
||||
private HalfBandFilter mIFilter;
|
||||
private HalfBandFilter mQFilter;
|
||||
private boolean mDecimate;
|
||||
private boolean mDecimateFlag;
|
||||
private ReusableComplexBufferQueue mBufferQueue = new ReusableComplexBufferQueue("ComplexHalfBandFilter");
|
||||
|
||||
/**
|
||||
* @param coefficients
|
||||
* @param gain
|
||||
* @param decimate
|
||||
*/
|
||||
public ComplexHalfBandFilter(float[] coefficients, float gain, boolean decimate)
|
||||
private HalfBandFilter2 mIFilter;
|
||||
private HalfBandFilter2 mQFilter;
|
||||
private float mResidualISample;
|
||||
private float mResidualQSample;
|
||||
private boolean mHasResidual;
|
||||
private int mOutputBufferLength;
|
||||
private float[] mSamples;
|
||||
private int mSamplesPointer;
|
||||
private float[] mFilteredSamples;
|
||||
private int mFilteredSamplesPointer;
|
||||
|
||||
public ComplexHalfBandFilter(float[] coefficients, float gain)
|
||||
{
|
||||
mIFilter = new HalfBandFilter(coefficients, gain);
|
||||
mQFilter = new HalfBandFilter(coefficients, gain);
|
||||
mDecimate = decimate;
|
||||
mIFilter = new HalfBandFilter2(coefficients, gain);
|
||||
mQFilter = new HalfBandFilter2(coefficients, gain);
|
||||
}
|
||||
|
||||
public void dispose()
|
||||
public ReusableComplexBuffer filter(ReusableComplexBuffer originalBuffer)
|
||||
{
|
||||
mIFilter.dispose();
|
||||
mQFilter.dispose();
|
||||
mSamples = originalBuffer.getSamples();
|
||||
mSamplesPointer = 0;
|
||||
|
||||
mOutputBufferLength = (mHasResidual ? (mSamples.length + 2) : mSamples.length) / 4 * 2;
|
||||
|
||||
ReusableComplexBuffer filteredBuffer = mBufferQueue.getBuffer(mOutputBufferLength);
|
||||
mFilteredSamples = filteredBuffer.getSamples();
|
||||
mFilteredSamplesPointer = 0;
|
||||
|
||||
if(mHasResidual)
|
||||
{
|
||||
mFilteredSamples[mFilteredSamplesPointer++] = mIFilter.filter(mResidualISample, mSamples[mSamplesPointer++]);
|
||||
mFilteredSamples[mFilteredSamplesPointer++] = mQFilter.filter(mResidualQSample, mSamples[mSamplesPointer++]);
|
||||
mHasResidual = false;
|
||||
}
|
||||
|
||||
while(mSamplesPointer + 3 < mSamples.length)
|
||||
{
|
||||
mFilteredSamples[mFilteredSamplesPointer++] = mIFilter.filter(mSamples[mSamplesPointer], mSamples[mSamplesPointer + 2]);
|
||||
mFilteredSamples[mFilteredSamplesPointer++] = mIFilter.filter(mSamples[mSamplesPointer + 1], mSamples[mSamplesPointer + 3]);
|
||||
mSamplesPointer += 4;
|
||||
}
|
||||
|
||||
if(mSamplesPointer < mSamples.length)
|
||||
{
|
||||
mHasResidual = true;
|
||||
mResidualISample = mSamples[mSamplesPointer++];
|
||||
mResidualQSample = mSamples[mSamplesPointer];
|
||||
}
|
||||
|
||||
originalBuffer.decrementUserCount();
|
||||
return filteredBuffer;
|
||||
}
|
||||
|
||||
public ReusableComplexBuffer filter(ReusableComplexBuffer buffer)
|
||||
public static void main(String[] args)
|
||||
{
|
||||
throw new IllegalStateException("This filter has to be updated to work with reusable buffers");
|
||||
Oscillator oscillator = new Oscillator(1, 16);
|
||||
ComplexHalfBandFilter filter = new ComplexHalfBandFilter(Filters.HALF_BAND_FILTER_27T.getCoefficients(), 1.0f);
|
||||
|
||||
ReusableComplexBufferQueue bufferQueue = new ReusableComplexBufferQueue("Test");
|
||||
|
||||
ReusableComplexBuffer complexBuffer = bufferQueue.getBuffer(8);
|
||||
oscillator.generateComplex(complexBuffer);
|
||||
ReusableComplexBuffer filteredBuffer = filter.filter(complexBuffer);
|
||||
filteredBuffer.decrementUserCount();
|
||||
|
||||
ReusableComplexBuffer complexBuffer2 = bufferQueue.getBuffer(10);
|
||||
oscillator.generateComplex(complexBuffer2);
|
||||
ReusableComplexBuffer filteredBuffer2 = filter.filter(complexBuffer2);
|
||||
filteredBuffer2.decrementUserCount();
|
||||
|
||||
ReusableComplexBuffer complexBuffer3 = bufferQueue.getBuffer(8);
|
||||
oscillator.generateComplex(complexBuffer3);
|
||||
ReusableComplexBuffer filteredBuffer3 = filter.filter(complexBuffer3);
|
||||
filteredBuffer3.decrementUserCount();
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// if(mDecimate)
|
||||
// {
|
||||
// float[] samples = buffer.getSamples();
|
||||
//
|
||||
// int half = samples.length / 2;
|
||||
//
|
||||
// float[] decimated;
|
||||
//
|
||||
// if(half % 2 == 0 || mDecimateFlag)
|
||||
// {
|
||||
// decimated = new float[half];
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// /* If inbound buffer size is odd-length, then we have to
|
||||
// * adjust when the first operation is non-decimation, since
|
||||
// * that will produce an outbound buffer 1 sample larger */
|
||||
// decimated = new float[half + 1];
|
||||
// }
|
||||
//
|
||||
// int decimatedPointer = 0;
|
||||
//
|
||||
// for(int x = 0; x < samples.length; x += 2)
|
||||
// {
|
||||
// /* Insert the sample but don't filter */
|
||||
// if(mDecimateFlag)
|
||||
// {
|
||||
// mIFilter.insert(samples[x]);
|
||||
// mQFilter.insert(samples[x + 1]);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// decimated[decimatedPointer++] = mIFilter.filter(samples[x]);
|
||||
// decimated[decimatedPointer++] = mQFilter.filter(samples[x + 1]);
|
||||
// }
|
||||
//
|
||||
// /* Toggle the decimation flag for every sample */
|
||||
// mDecimateFlag = !mDecimateFlag;
|
||||
// }
|
||||
//
|
||||
// //return buffer
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// /* Non Decimate - filter each of the values and return the buffer */
|
||||
// float[] samples = buffer.getSamples();
|
||||
//
|
||||
// for(int x = 0; x < samples.length; x += 2)
|
||||
// {
|
||||
// samples[x] = mIFilter.filter(samples[x]);
|
||||
// samples[x + 1] = mQFilter.filter(samples[x + 1]);
|
||||
// }
|
||||
//
|
||||
// //return buffer
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,108 +0,0 @@
|
||||
/*******************************************************************************
|
||||
* sdr-trunk
|
||||
* Copyright (C) 2014-2018 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 <http://www.gnu.org/licenses/>
|
||||
*
|
||||
******************************************************************************/
|
||||
package io.github.dsheirer.dsp.filter.halfband.complex;
|
||||
|
||||
import io.github.dsheirer.dsp.filter.Filters;
|
||||
import io.github.dsheirer.dsp.filter.halfband.real.HalfBandFilter2;
|
||||
import io.github.dsheirer.dsp.mixer.Oscillator;
|
||||
import io.github.dsheirer.sample.buffer.ReusableComplexBuffer;
|
||||
import io.github.dsheirer.sample.buffer.ReusableComplexBufferQueue;
|
||||
|
||||
public class ComplexHalfBandFilter2
|
||||
{
|
||||
private ReusableComplexBufferQueue mBufferQueue = new ReusableComplexBufferQueue("ComplexHalfBandFilter2");
|
||||
|
||||
private HalfBandFilter2 mIFilter;
|
||||
private HalfBandFilter2 mQFilter;
|
||||
private float mResidualISample;
|
||||
private float mResidualQSample;
|
||||
private boolean mHasResidual;
|
||||
private int mOutputBufferLength;
|
||||
private float[] mSamples;
|
||||
private int mSamplesPointer;
|
||||
private float[] mFilteredSamples;
|
||||
private int mFilteredSamplesPointer;
|
||||
|
||||
public ComplexHalfBandFilter2(float[] coefficients, float gain)
|
||||
{
|
||||
mIFilter = new HalfBandFilter2(coefficients, gain);
|
||||
mQFilter = new HalfBandFilter2(coefficients, gain);
|
||||
}
|
||||
|
||||
public ReusableComplexBuffer filter(ReusableComplexBuffer originalBuffer)
|
||||
{
|
||||
mSamples = originalBuffer.getSamples();
|
||||
mSamplesPointer = 0;
|
||||
|
||||
mOutputBufferLength = (mHasResidual ? (mSamples.length + 2) : mSamples.length) / 4 * 2;
|
||||
|
||||
ReusableComplexBuffer filteredBuffer = mBufferQueue.getBuffer(mOutputBufferLength);
|
||||
mFilteredSamples = filteredBuffer.getSamples();
|
||||
mFilteredSamplesPointer = 0;
|
||||
|
||||
if(mHasResidual)
|
||||
{
|
||||
mFilteredSamples[mFilteredSamplesPointer++] = mIFilter.filter(mResidualISample, mSamples[mSamplesPointer++]);
|
||||
mFilteredSamples[mFilteredSamplesPointer++] = mQFilter.filter(mResidualQSample, mSamples[mSamplesPointer++]);
|
||||
mHasResidual = false;
|
||||
}
|
||||
|
||||
while(mSamplesPointer + 3 < mSamples.length)
|
||||
{
|
||||
mFilteredSamples[mFilteredSamplesPointer++] = mIFilter.filter(mSamples[mSamplesPointer], mSamples[mSamplesPointer + 2]);
|
||||
mFilteredSamples[mFilteredSamplesPointer++] = mIFilter.filter(mSamples[mSamplesPointer + 1], mSamples[mSamplesPointer + 3]);
|
||||
mSamplesPointer += 4;
|
||||
}
|
||||
|
||||
if(mSamplesPointer < mSamples.length)
|
||||
{
|
||||
mHasResidual = true;
|
||||
mResidualISample = mSamples[mSamplesPointer++];
|
||||
mResidualQSample = mSamples[mSamplesPointer];
|
||||
}
|
||||
|
||||
originalBuffer.decrementUserCount();
|
||||
return filteredBuffer;
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
Oscillator oscillator = new Oscillator(1, 16);
|
||||
ComplexHalfBandFilter2 filter = new ComplexHalfBandFilter2(Filters.HALF_BAND_FILTER_27T.getCoefficients(), 1.0f);
|
||||
|
||||
ReusableComplexBufferQueue bufferQueue = new ReusableComplexBufferQueue("Test");
|
||||
|
||||
ReusableComplexBuffer complexBuffer = bufferQueue.getBuffer(8);
|
||||
oscillator.generateComplex(complexBuffer);
|
||||
ReusableComplexBuffer filteredBuffer = filter.filter(complexBuffer);
|
||||
filteredBuffer.decrementUserCount();
|
||||
|
||||
ReusableComplexBuffer complexBuffer2 = bufferQueue.getBuffer(10);
|
||||
oscillator.generateComplex(complexBuffer2);
|
||||
ReusableComplexBuffer filteredBuffer2 = filter.filter(complexBuffer2);
|
||||
filteredBuffer2.decrementUserCount();
|
||||
|
||||
ReusableComplexBuffer complexBuffer3 = bufferQueue.getBuffer(8);
|
||||
oscillator.generateComplex(complexBuffer3);
|
||||
ReusableComplexBuffer filteredBuffer3 = filter.filter(complexBuffer3);
|
||||
filteredBuffer3.decrementUserCount();
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -21,6 +21,7 @@ import io.github.dsheirer.sample.buffer.ReusableBufferQueue;
|
||||
import io.github.dsheirer.sample.buffer.ReusableFloatBuffer;
|
||||
import org.apache.commons.lang3.Validate;
|
||||
|
||||
@Deprecated
|
||||
public class HalfBandFilter
|
||||
{
|
||||
private float[] mBuffer;
|
||||
|
||||
@@ -26,8 +26,6 @@ import io.github.dsheirer.dsp.psk.pll.AdaptivePLLGainMonitor;
|
||||
import io.github.dsheirer.dsp.psk.pll.CostasLoop;
|
||||
import io.github.dsheirer.sample.buffer.ReusableComplexBuffer;
|
||||
import io.github.dsheirer.source.SourceEvent;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
@@ -36,8 +34,6 @@ public class P25DecoderLSM extends P25Decoder
|
||||
{
|
||||
protected static final float SAMPLE_COUNTER_GAIN = 0.3f;
|
||||
|
||||
private final static Logger mLog = LoggerFactory.getLogger(P25DecoderLSM.class);
|
||||
|
||||
private Map<Double,float[]> mBasebandFilters = new HashMap<>();
|
||||
private ComplexFIRFilter2 mBasebandFilter;
|
||||
private ComplexFeedForwardGainControl mAGC = new ComplexFeedForwardGainControl(32);
|
||||
@@ -139,7 +135,6 @@ public class P25DecoderLSM extends P25Decoder
|
||||
break;
|
||||
case NOTIFICATION_FREQUENCY_CORRECTION_CHANGE:
|
||||
//Reset the PLL if/when the tuner PPM changes so that we can re-lock
|
||||
mLog.debug("******** Resetting costas loop for frequency correction change");
|
||||
mCostasLoop.reset();
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user