mirror of
https://github.com/DSheirer/sdrtrunk.git
synced 2026-11-14 09:37:36 -05:00
Class renaming and cleanup.
This commit is contained in:
@@ -15,92 +15,94 @@
|
|||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
package io.github.dsheirer.dsp.filter.halfband.complex;
|
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.ReusableComplexBuffer;
|
||||||
|
import io.github.dsheirer.sample.buffer.ReusableComplexBufferQueue;
|
||||||
|
|
||||||
public class ComplexHalfBandFilter
|
public class ComplexHalfBandFilter
|
||||||
{
|
{
|
||||||
private HalfBandFilter mIFilter;
|
private ReusableComplexBufferQueue mBufferQueue = new ReusableComplexBufferQueue("ComplexHalfBandFilter");
|
||||||
private HalfBandFilter mQFilter;
|
|
||||||
private boolean mDecimate;
|
|
||||||
private boolean mDecimateFlag;
|
|
||||||
|
|
||||||
/**
|
private HalfBandFilter2 mIFilter;
|
||||||
* @param coefficients
|
private HalfBandFilter2 mQFilter;
|
||||||
* @param gain
|
private float mResidualISample;
|
||||||
* @param decimate
|
private float mResidualQSample;
|
||||||
*/
|
private boolean mHasResidual;
|
||||||
public ComplexHalfBandFilter(float[] coefficients, float gain, boolean decimate)
|
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);
|
mIFilter = new HalfBandFilter2(coefficients, gain);
|
||||||
mQFilter = new HalfBandFilter(coefficients, gain);
|
mQFilter = new HalfBandFilter2(coefficients, gain);
|
||||||
mDecimate = decimate;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void dispose()
|
public ReusableComplexBuffer filter(ReusableComplexBuffer originalBuffer)
|
||||||
{
|
{
|
||||||
mIFilter.dispose();
|
mSamples = originalBuffer.getSamples();
|
||||||
mQFilter.dispose();
|
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 io.github.dsheirer.sample.buffer.ReusableFloatBuffer;
|
||||||
import org.apache.commons.lang3.Validate;
|
import org.apache.commons.lang3.Validate;
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
public class HalfBandFilter
|
public class HalfBandFilter
|
||||||
{
|
{
|
||||||
private float[] mBuffer;
|
private float[] mBuffer;
|
||||||
|
|||||||
Reference in New Issue
Block a user