From 2a3fd2c5a3402d5db99c9a6e5da919eb6a9356d8 Mon Sep 17 00:00:00 2001 From: Denny Date: Wed, 5 Sep 2018 07:24:42 -0400 Subject: [PATCH] Class renaming and cleanup. --- .../complex/ComplexHalfBandFilter.java | 150 +++++++++--------- .../complex/ComplexHalfBandFilter2.java | 108 ------------- .../filter/halfband/real/HalfBandFilter.java | 1 + .../module/decode/p25/P25DecoderLSM.java | 5 - 4 files changed, 77 insertions(+), 187 deletions(-) delete mode 100644 src/main/java/io/github/dsheirer/dsp/filter/halfband/complex/ComplexHalfBandFilter2.java diff --git a/src/main/java/io/github/dsheirer/dsp/filter/halfband/complex/ComplexHalfBandFilter.java b/src/main/java/io/github/dsheirer/dsp/filter/halfband/complex/ComplexHalfBandFilter.java index 7684676e..e79774f8 100644 --- a/src/main/java/io/github/dsheirer/dsp/filter/halfband/complex/ComplexHalfBandFilter.java +++ b/src/main/java/io/github/dsheirer/dsp/filter/halfband/complex/ComplexHalfBandFilter.java @@ -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 -// } } } diff --git a/src/main/java/io/github/dsheirer/dsp/filter/halfband/complex/ComplexHalfBandFilter2.java b/src/main/java/io/github/dsheirer/dsp/filter/halfband/complex/ComplexHalfBandFilter2.java deleted file mode 100644 index 6ab51f04..00000000 --- a/src/main/java/io/github/dsheirer/dsp/filter/halfband/complex/ComplexHalfBandFilter2.java +++ /dev/null @@ -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 - * - ******************************************************************************/ -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(); - - - - - - } -} diff --git a/src/main/java/io/github/dsheirer/dsp/filter/halfband/real/HalfBandFilter.java b/src/main/java/io/github/dsheirer/dsp/filter/halfband/real/HalfBandFilter.java index 0f52b780..9f944f1e 100644 --- a/src/main/java/io/github/dsheirer/dsp/filter/halfband/real/HalfBandFilter.java +++ b/src/main/java/io/github/dsheirer/dsp/filter/halfband/real/HalfBandFilter.java @@ -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; diff --git a/src/main/java/io/github/dsheirer/module/decode/p25/P25DecoderLSM.java b/src/main/java/io/github/dsheirer/module/decode/p25/P25DecoderLSM.java index 7a2d3116..be99d126 100644 --- a/src/main/java/io/github/dsheirer/module/decode/p25/P25DecoderLSM.java +++ b/src/main/java/io/github/dsheirer/module/decode/p25/P25DecoderLSM.java @@ -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 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; }