From d34abdd2fa0a6072a7bf85b0b891088fc2ec6432 Mon Sep 17 00:00:00 2001 From: "dennis.sheirer" Date: Fri, 31 Oct 2014 13:58:20 +0000 Subject: [PATCH] Refactoring to use COMPLEX and REAL sample terms throughout --- src/audio/AudioInverter.java | 10 +- src/audio/AudioOutput.java | 4 +- src/buffer/DoubleCircularBuffer.java | 80 +++++++ src/controller/channel/ProcessingChain.java | 66 +++--- src/decode/Decoder.java | 40 ++-- src/decode/fleetsync2/Fleetsync2Decoder.java | 16 +- src/decode/ltrnet/LTRNetDecoder.java | 8 +- .../ltrstandard/LTRStandardDecoder.java | 8 +- src/decode/mdc1200/MDCDecoder.java | 12 +- src/decode/mpt1327/MPT1327Decoder.java | 12 +- src/decode/nbfm/NBFMConventionalDecoder.java | 6 +- src/decode/p25/P25Decoder.java | 16 +- src/decode/passport/PassportDecoder.java | 8 +- src/dsp/afc/AutomaticFrequencyControl.java | 4 +- src/dsp/agc/ComplexAutomaticGainControl.java | 198 ++++++++++++++++++ src/dsp/filter/DCRemovalFilter.java | 8 +- src/dsp/filter/DCRemovalFilter2.java | 8 +- src/dsp/filter/DCRemovalFilter3.java | 8 +- src/dsp/filter/FloatFIRFilter.java | 8 +- src/dsp/filter/FloatHalfBandFilter.java | 8 +- .../filter/FloatHalfBandNoDecimateFilter.java | 8 +- src/dsp/filter/SquaringFilter.java | 4 +- src/dsp/fsk/C4FMDecoder.java | 4 +- src/dsp/fsk/FSK2Decoder.java | 4 +- src/dsp/fsk/LTRFSKDecoder.java | 4 +- src/dsp/nbfm/FMDiscriminator.java | 6 +- src/dsp/nbfm/FilteringNBFMDemodulator.java | 10 +- src/dsp/nbfm/NBFMDemodulator.java | 10 +- src/instrument/gui/DecoderViewFrame.java | 4 +- src/instrument/gui/WaveSourceFrame.java | 8 +- src/instrument/tap/stream/FloatTap.java | 10 +- src/record/wave/FloatWaveRecorder.java | 4 +- src/sample/complex/ComplexSample.java | 15 ++ ...mplexDecimator.java => RealDecimator.java} | 4 +- .../RealBuffer.java} | 10 +- .../RealSampleBroadcaster.java} | 14 +- src/sample/real/RealSampleListener.java | 6 + src/sample/real/RealSampleProvider.java | 8 + src/sample/simplex/SimplexSampleListener.java | 6 - src/sample/simplex/SimplexSampleProvider.java | 8 - src/source/FloatSource.java | 2 +- src/source/RealSource.java | 13 ++ src/source/SimplexSource.java | 13 -- src/source/Source.java | 2 +- src/source/mixer/MixerManager.java | 8 +- ...xMixerSource.java => RealMixerSource.java} | 30 +-- .../tuner/hackrf/HackRFTunerController.java | 2 - src/source/wave/FloatWaveSource.java | 10 +- src/spectrum/ChannelSpectrumPanel.java | 12 +- src/spectrum/DFTProcessor.java | 2 +- 50 files changed, 530 insertions(+), 239 deletions(-) create mode 100644 src/buffer/DoubleCircularBuffer.java create mode 100644 src/dsp/agc/ComplexAutomaticGainControl.java rename src/sample/decimator/{SimplexDecimator.java => RealDecimator.java} (90%) rename src/sample/{simplex/SimplexBuffer.java => real/RealBuffer.java} (74%) rename src/sample/{simplex/SimplexSampleBroadcaster.java => real/RealSampleBroadcaster.java} (80%) create mode 100644 src/sample/real/RealSampleListener.java create mode 100644 src/sample/real/RealSampleProvider.java delete mode 100644 src/sample/simplex/SimplexSampleListener.java delete mode 100644 src/sample/simplex/SimplexSampleProvider.java create mode 100644 src/source/RealSource.java delete mode 100644 src/source/SimplexSource.java rename src/source/mixer/{SimplexMixerSource.java => RealMixerSource.java} (89%) diff --git a/src/audio/AudioInverter.java b/src/audio/AudioInverter.java index a483df07..70898f73 100644 --- a/src/audio/AudioInverter.java +++ b/src/audio/AudioInverter.java @@ -17,7 +17,7 @@ ******************************************************************************/ package audio; -import sample.simplex.SimplexSampleListener; +import sample.real.RealSampleListener; import util.Oscillator; import dsp.filter.Filters; import dsp.filter.FloatFIRFilter; @@ -26,11 +26,11 @@ import dsp.filter.FloatFIRFilter; * Applies audio inversion (or un-inversion) to a stream of float audio samples * by multiplying each successive sample by either a 1 or a -1 value. */ -public class AudioInverter implements SimplexSampleListener +public class AudioInverter implements RealSampleListener { private Oscillator mSineWaveGenerator; private FloatFIRFilter mPostInversionLowPassFilter; - private SimplexSampleListener mListener; + private RealSampleListener mListener; public AudioInverter( int inversionFrequency, int sampleRate ) { @@ -47,7 +47,7 @@ public class AudioInverter implements SimplexSampleListener this( frequency.getFrequency(), sampleRate ); } - public void setListener( SimplexSampleListener listener ) + public void setListener( RealSampleListener listener ) { mListener = listener; } @@ -68,7 +68,7 @@ public class AudioInverter implements SimplexSampleListener * Simple class to receive the output of the FIR low pass filter and then * send it to the registered listener(s) */ - class FilteredSampleProcessor implements SimplexSampleListener + class FilteredSampleProcessor implements RealSampleListener { @Override public void receive( float sample ) diff --git a/src/audio/AudioOutput.java b/src/audio/AudioOutput.java index 8a50b3f1..da0dacfd 100644 --- a/src/audio/AudioOutput.java +++ b/src/audio/AudioOutput.java @@ -27,10 +27,10 @@ import javax.sound.sampled.SourceDataLine; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import sample.simplex.SimplexSampleListener; +import sample.real.RealSampleListener; import buffer.FloatSampleBufferAssembler; -public class AudioOutput implements SimplexSampleListener, +public class AudioOutput implements RealSampleListener, SquelchListener, AudioTypeListener { diff --git a/src/buffer/DoubleCircularBuffer.java b/src/buffer/DoubleCircularBuffer.java new file mode 100644 index 00000000..5759279c --- /dev/null +++ b/src/buffer/DoubleCircularBuffer.java @@ -0,0 +1,80 @@ +/******************************************************************************* + * 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 buffer; + +import java.util.Arrays; + +/** + * Circular sample buffer - allocates a buffer and stores samples in a circular + * fashion, overwriting older samples with newly arrived samples. Initially + * fills buffer with 0-valued samples + * + * Can be used as a delay-type buffer, to delay samples by the 'size' amount + */ +public class DoubleCircularBuffer +{ + double[] mBuffer; + int mBufferPointer = 0; + + public DoubleCircularBuffer( int size ) + { + mBuffer = new double[ size ]; + + Arrays.fill( mBuffer, 0.0 ); + } + + /** + * Puts the new value into the buffer and returns the oldest buffer value + * that it replaced + * @param newValue + * @return + */ + public double get( double newValue ) + { + double oldestSample = mBuffer[ mBufferPointer ]; + + mBuffer[ mBufferPointer ] = newValue; + + mBufferPointer++; + + if( mBufferPointer >= mBuffer.length ) + { + mBufferPointer = 0; + } + + return oldestSample; + } + + /** + * Returns the maximum from the values currently in the buffer + */ + public double max() + { + double max = 0.0d; + + for( int x = 0; x < mBuffer.length; x++ ) + { + if( mBuffer[ x ] > max ) + { + max = mBuffer[ x ]; + } + } + + return max; + } +} diff --git a/src/controller/channel/ProcessingChain.java b/src/controller/channel/ProcessingChain.java index c2241957..2a7c7b93 100644 --- a/src/controller/channel/ProcessingChain.java +++ b/src/controller/channel/ProcessingChain.java @@ -39,10 +39,10 @@ import record.wave.FloatWaveRecorder; import sample.Broadcaster; import sample.Listener; import sample.complex.ComplexSample; -import sample.simplex.SimplexBuffer; -import sample.simplex.SimplexSampleListener; +import sample.real.RealBuffer; +import sample.real.RealSampleListener; import source.ComplexSource; -import source.SimplexSource; +import source.RealSource; import source.Source; import source.SourceException; import source.config.SourceConfigMixer; @@ -89,9 +89,9 @@ public class ProcessingChain implements Listener private LinkedTransferQueue> mComplexQueue = new LinkedTransferQueue>(); - private SimplexSampleReceiver mSimplexReceiver = new SimplexSampleReceiver(); - private LinkedTransferQueue mSimplexQueue = - new LinkedTransferQueue(); + private RealSampleReceiver mRealReceiver = new RealSampleReceiver(); + private LinkedTransferQueue mRealQueue = + new LinkedTransferQueue(); protected Broadcaster mBroadcaster = new Broadcaster(); @@ -121,9 +121,9 @@ public class ProcessingChain implements Listener return mComplexReceiver; } - public Listener getSimplexReceiver() + public Listener getRealReceiver() { - return (Listener)mSimplexReceiver; + return (Listener)mRealReceiver; } public String toString() @@ -243,10 +243,10 @@ public class ProcessingChain implements Listener { ((ComplexSource)mSource).removeListener( this.getComplexReceiver() ); } - else if( mSource instanceof SimplexSource ) + else if( mSource instanceof RealSource ) { - ((SimplexSource)mSource) - .removeListener( this.getSimplexReceiver() ); + ((RealSource)mSource) + .removeListener( this.getRealReceiver() ); } if( mProcessorTask != null ) @@ -299,18 +299,18 @@ public class ProcessingChain implements Listener mSource.dispose(); } } - else if( mSource instanceof SimplexSource ) + else if( mSource instanceof RealSource ) { try { mProcessorTask = mResourceManager.getThreadPoolManager() .schedule( ThreadType.DECODER, - new SimplexProcessor(), + new RealProcessor(), 50, TimeUnit.MILLISECONDS ); - ((SimplexSource)mSource) - .setListener( this.getSimplexReceiver() ); + ((RealSource)mSource) + .setListener( this.getRealReceiver() ); } catch( RejectedExecutionException ree ) { @@ -361,7 +361,7 @@ public class ProcessingChain implements Listener "-" + mChannel.getName(); mAudioOutput = new AudioOutput( threadName ); - addSimplexListener( mAudioOutput ); + addRealListener( mAudioOutput ); /* Automatic frequency control */ if( mAFC != null ) @@ -386,7 +386,7 @@ public class ProcessingChain implements Listener tcs.addListener( mAFC ); /* Add AFC as listener to the decoder */ - mDecoder.addUnfilteredSimplexSampleListener( mAFC ); + mDecoder.addUnfilteredRealSampleListener( mAFC ); } } } @@ -496,7 +496,7 @@ public class ProcessingChain implements Listener mLog.info( getLogPrefix() + "- started audio recording [" + recorder.getFileName() + "]" ); - mDecoder.addSimplexSampleListener( (FloatWaveRecorder)recorder ); + mDecoder.addRealSampleListener( (FloatWaveRecorder)recorder ); } else if( recorder instanceof ComplexWaveRecorder ) { @@ -594,22 +594,22 @@ public class ProcessingChain implements Listener /** * Adds the listener to receive demodulated samples from the decoder */ - public void addSimplexListener( SimplexSampleListener listener ) + public void addRealListener( RealSampleListener listener ) { if( mDecoder != null ) { - mDecoder.addSimplexSampleListener( listener ); + mDecoder.addRealSampleListener( listener ); } } /** * Removes the listener from receiving demodulated samples from the decoder */ - public void removeSimplexListener( SimplexSampleListener listener ) + public void removeRealListener( RealSampleListener listener ) { if( mDecoder != null ) { - mDecoder.removeSimplexListener( listener ); + mDecoder.removeRealListener( listener ); } } @@ -675,18 +675,18 @@ public class ProcessingChain implements Listener } /** - * Manages the simplex sample queue and distributes samples to the decoder. + * Manages the real sample queue and distributes samples to the decoder. */ - private class SimplexProcessor implements Runnable + private class RealProcessor implements Runnable { @Override public void run() { - List sampleBuffers = new ArrayList(); + List sampleBuffers = new ArrayList(); - mSimplexQueue.drainTo( sampleBuffers, 4 ); + mRealQueue.drainTo( sampleBuffers, 4 ); - for( SimplexBuffer sampleBuffer: sampleBuffers ) + for( RealBuffer sampleBuffer: sampleBuffers ) { if( mDecoder != null ) { @@ -694,7 +694,7 @@ public class ProcessingChain implements Listener for( float sample: samples ) { - mDecoder.getSimplexReceiver().receive( sample ); + mDecoder.getRealReceiver().receive( sample ); } } @@ -749,15 +749,15 @@ public class ProcessingChain implements Listener } /** - * Internal listener to receive simplex (ie demodulated) samples. Places - * received samples into the queue managed by the SimplexProcessor + * Internal listener to receive real(ie demodulated) samples. Places + * received samples into the queue managed by the RealProcessor */ - public class SimplexSampleReceiver implements Listener + public class RealSampleReceiver implements Listener { @Override - public void receive( SimplexBuffer samples ) + public void receive( RealBuffer samples ) { - mSimplexQueue.add( samples ); + mRealQueue.add( samples ); } } } diff --git a/src/decode/Decoder.java b/src/decode/Decoder.java index 752c38e1..89737600 100644 --- a/src/decode/Decoder.java +++ b/src/decode/Decoder.java @@ -24,8 +24,8 @@ import message.Message; import sample.Broadcaster; import sample.Listener; import sample.complex.ComplexSample; -import sample.simplex.SimplexSampleBroadcaster; -import sample.simplex.SimplexSampleListener; +import sample.real.RealSampleBroadcaster; +import sample.real.RealSampleListener; import source.Source.SampleType; import eventlog.MessageEventLogger; @@ -33,7 +33,7 @@ public abstract class Decoder implements Listener { private MessageEventLogger mEventLogger; private Broadcaster mMessageBroadcaster = new Broadcaster(); - private SimplexSampleBroadcaster mSimplexBroadcaster = new SimplexSampleBroadcaster(); + private RealSampleBroadcaster mRealBroadcaster = new RealSampleBroadcaster(); private Broadcaster mComplexBroadcaster = new Broadcaster(); @@ -43,11 +43,11 @@ public abstract class Decoder implements Listener /** * Abstract decoder class. * - * @param sampleType - complex (I/Q) or simplex (demodulated) sample type. + * @param sampleType - complex (I/Q) or real (demodulated) sample type. * Each decoder instance will be configured to receive either complex or - * simplex samples. When configured to receive complex samples, the + * real samples. When configured to receive complex samples, the * decoder will implement a demodulator component and feed the output from - * that demodulator back onto itself via the simplex sample interface, so + * that demodulator back onto itself via the real sample interface, so * that any added auxiliary decoders will then receive the demodulated * output stream. */ @@ -57,12 +57,12 @@ public abstract class Decoder implements Listener } /** - * Returns a simplex (ie demodulated) sample listener interface for - * connecting this decoder to a simplex sample stream provider + * Returns a real (ie demodulated) sample listener interface for + * connecting this decoder to a real sample stream provider */ - public SimplexSampleListener getSimplexReceiver() + public RealSampleListener getRealReceiver() { - return mSimplexBroadcaster; + return mRealBroadcaster; } /** @@ -93,7 +93,7 @@ public abstract class Decoder implements Listener mMessageBroadcaster.clear(); mComplexBroadcaster.clear(); - mSimplexBroadcaster.clear(); + mRealBroadcaster.clear(); } /** @@ -111,7 +111,7 @@ public abstract class Decoder implements Listener public void addAuxiliaryDecoder( Decoder decoder ) { mAuxiliaryDecoders.add( decoder ); - mSimplexBroadcaster.addListener( decoder.getSimplexReceiver() ); + mRealBroadcaster.addListener( decoder.getRealReceiver() ); decoder.addMessageListener( this ); } @@ -179,24 +179,24 @@ public abstract class Decoder implements Listener } /** - * Adds a simplex sample listener to receive unfiltered demodulated samples + * Adds a real sample listener to receive unfiltered demodulated samples */ - public abstract void addUnfilteredSimplexSampleListener( SimplexSampleListener listener ); + public abstract void addUnfilteredRealSampleListener( RealSampleListener listener ); /** - * Adds a simplex sample listener to receive demodulated samples + * Adds a real sample listener to receive demodulated samples */ - public void addSimplexSampleListener( SimplexSampleListener listener ) + public void addRealSampleListener( RealSampleListener listener ) { - mSimplexBroadcaster.addListener( listener ); + mRealBroadcaster.addListener( listener ); } /** - * Remove the simplex sample listener from receiving demodulated samples + * Remove the real sample listener from receiving demodulated samples */ - public void removeSimplexListener( SimplexSampleListener listener ) + public void removeRealListener( RealSampleListener listener ) { - mSimplexBroadcaster.removeListener( listener ); + mRealBroadcaster.removeListener( listener ); } /** diff --git a/src/decode/fleetsync2/Fleetsync2Decoder.java b/src/decode/fleetsync2/Fleetsync2Decoder.java index 3391292a..f586958e 100644 --- a/src/decode/fleetsync2/Fleetsync2Decoder.java +++ b/src/decode/fleetsync2/Fleetsync2Decoder.java @@ -26,7 +26,7 @@ import java.util.ArrayList; import java.util.List; import sample.Listener; -import sample.simplex.SimplexSampleListener; +import sample.real.RealSampleListener; import source.Source.SampleType; import alias.AliasList; import bits.MessageFramer; @@ -72,11 +72,11 @@ public class Fleetsync2Decoder extends Decoder implements Instrumentable public Fleetsync2Decoder( AliasList aliasList ) { - super( SampleType.FLOAT ); + super( SampleType.REAL ); mDecimationFilter = new FloatHalfBandFilter( Filters.FIR_HALF_BAND_31T_ONE_EIGHTH_FCO, 1.0002 ); - addSimplexSampleListener( mDecimationFilter ); + addRealSampleListener( mDecimationFilter ); mBandPassFilter = new FloatFIRFilter( Filters.FIRBP_1200FSK_24000FS.getCoefficients(), 1.02 ); @@ -116,9 +116,9 @@ public class Fleetsync2Decoder extends Decoder implements Instrumentable * Returns a float listener interface for connecting this decoder to a * float stream provider */ - public SimplexSampleListener getSimplexReceiver() + public RealSampleListener getRealReceiver() { - return (SimplexSampleListener)mDecimationFilter; + return (RealSampleListener)mDecimationFilter; } @Override @@ -148,7 +148,7 @@ public class Fleetsync2Decoder extends Decoder implements Instrumentable { case INSTRUMENT_INPUT: FloatTap inputTap = (FloatTap)tap; - addSimplexSampleListener( inputTap ); + addRealSampleListener( inputTap ); break; case INSTRUMENT_BANDPASS_FILTER_TO_FSK2_DEMOD: FloatTap bpTap = (FloatTap)tap; @@ -172,7 +172,7 @@ public class Fleetsync2Decoder extends Decoder implements Instrumentable { case INSTRUMENT_INPUT: FloatTap inputTap = (FloatTap)tap; - removeSimplexListener( inputTap ); + removeRealListener( inputTap ); break; case INSTRUMENT_BANDPASS_FILTER_TO_FSK2_DEMOD: mBandPassFilter.setListener( mFSKDecoder ); @@ -184,7 +184,7 @@ public class Fleetsync2Decoder extends Decoder implements Instrumentable } @Override - public void addUnfilteredSimplexSampleListener( SimplexSampleListener listener ) + public void addUnfilteredRealSampleListener( RealSampleListener listener ) { //Not implemented } diff --git a/src/decode/ltrnet/LTRNetDecoder.java b/src/decode/ltrnet/LTRNetDecoder.java index 5dede991..850ac4db 100644 --- a/src/decode/ltrnet/LTRNetDecoder.java +++ b/src/decode/ltrnet/LTRNetDecoder.java @@ -24,7 +24,7 @@ import java.util.ArrayList; import java.util.List; import message.MessageDirection; -import sample.simplex.SimplexSampleListener; +import sample.real.RealSampleListener; import source.Source.SampleType; import alias.AliasList; import bits.MessageFramer; @@ -81,7 +81,7 @@ public class LTRNetDecoder extends Decoder implements Instrumentable mDCRemovalFilter = new DCRemovalFilter2( sDC_REMOVAL_RATIO ); mDemodulator.addListener( mDCRemovalFilter ); - mDCRemovalFilter.setListener( this.getSimplexReceiver() ); + mDCRemovalFilter.setListener( this.getRealReceiver() ); } mLTRFSKDecoder = new LTRFSKDecoder(); @@ -96,7 +96,7 @@ public class LTRNetDecoder extends Decoder implements Instrumentable } else { - this.addSimplexSampleListener( mLTRFSKDecoder ); + this.addRealSampleListener( mLTRFSKDecoder ); } if( direction == MessageDirection.OSW ) @@ -151,7 +151,7 @@ public class LTRNetDecoder extends Decoder implements Instrumentable } @Override - public void addUnfilteredSimplexSampleListener( SimplexSampleListener listener ) + public void addUnfilteredRealSampleListener( RealSampleListener listener ) { if( mDemodulator != null ) { diff --git a/src/decode/ltrstandard/LTRStandardDecoder.java b/src/decode/ltrstandard/LTRStandardDecoder.java index bc1a3eb4..9594f547 100644 --- a/src/decode/ltrstandard/LTRStandardDecoder.java +++ b/src/decode/ltrstandard/LTRStandardDecoder.java @@ -18,7 +18,7 @@ package decode.ltrstandard; import message.MessageDirection; -import sample.simplex.SimplexSampleListener; +import sample.real.RealSampleListener; import source.Source.SampleType; import alias.AliasList; import bits.MessageFramer; @@ -73,7 +73,7 @@ public class LTRStandardDecoder extends Decoder mDCRemovalFilter = new DCRemovalFilter2( sDC_REMOVAL_RATIO ); mDemodulator.addListener( mDCRemovalFilter ); - mDCRemovalFilter.setListener( this.getSimplexReceiver() ); + mDCRemovalFilter.setListener( this.getRealReceiver() ); } mLTRFSKDecoder = new LTRFSKDecoder(); @@ -88,7 +88,7 @@ public class LTRStandardDecoder extends Decoder } else { - this.addSimplexSampleListener( mLTRFSKDecoder ); + this.addRealSampleListener( mLTRFSKDecoder ); } if( direction == MessageDirection.OSW ) @@ -118,7 +118,7 @@ public class LTRStandardDecoder extends Decoder } @Override - public void addUnfilteredSimplexSampleListener( SimplexSampleListener listener ) + public void addUnfilteredRealSampleListener( RealSampleListener listener ) { if( mDemodulator != null ) { diff --git a/src/decode/mdc1200/MDCDecoder.java b/src/decode/mdc1200/MDCDecoder.java index a5c993a6..f6a48916 100644 --- a/src/decode/mdc1200/MDCDecoder.java +++ b/src/decode/mdc1200/MDCDecoder.java @@ -25,7 +25,7 @@ import instrument.tap.stream.FloatTap; import java.util.ArrayList; import java.util.List; -import sample.simplex.SimplexSampleListener; +import sample.real.RealSampleListener; import source.Source.SampleType; import alias.AliasList; import bits.MessageFramer; @@ -74,12 +74,12 @@ public class MDCDecoder extends Decoder implements Instrumentable public MDCDecoder( AliasList aliasList ) { - super( SampleType.FLOAT ); + super( SampleType.REAL ); /* Decimation filter: 48000 / 2 = 24000 */ mDecimationFilter = new FloatHalfBandFilter( Filters.FIR_HALF_BAND_31T_ONE_EIGHTH_FCO, 1.0002 ); - addSimplexSampleListener( mDecimationFilter ); + addRealSampleListener( mDecimationFilter ); /* Bandpass filter - predefined */ mBandPassFilter = new FloatFIRFilter( @@ -154,7 +154,7 @@ public class MDCDecoder extends Decoder implements Instrumentable switch( tap.getName() ) { case INSTRUMENT_INPUT: - addSimplexSampleListener( (FloatTap)tap ); + addRealSampleListener( (FloatTap)tap ); break; case INSTRUMENT_BANDPASS_FILTER_TO_FSK2_DEMOD: /* wire the tap between the bandpass filter and the demod */ @@ -186,7 +186,7 @@ public class MDCDecoder extends Decoder implements Instrumentable switch( tap.getName() ) { case INSTRUMENT_INPUT: - removeSimplexListener( (FloatTap)tap ); + removeRealListener( (FloatTap)tap ); break; case INSTRUMENT_BANDPASS_FILTER_TO_FSK2_DEMOD: mBandPassFilter.setListener( mFSKDecoder ); @@ -202,7 +202,7 @@ public class MDCDecoder extends Decoder implements Instrumentable } @Override - public void addUnfilteredSimplexSampleListener( SimplexSampleListener listener ) + public void addUnfilteredRealSampleListener( RealSampleListener listener ) { //Not implemented } diff --git a/src/decode/mpt1327/MPT1327Decoder.java b/src/decode/mpt1327/MPT1327Decoder.java index e32c5f22..ba487a56 100644 --- a/src/decode/mpt1327/MPT1327Decoder.java +++ b/src/decode/mpt1327/MPT1327Decoder.java @@ -26,7 +26,7 @@ import java.util.ArrayList; import java.util.List; import sample.Broadcaster; -import sample.simplex.SimplexSampleListener; +import sample.real.RealSampleListener; import source.Source.SampleType; import alias.AliasList; import bits.MessageFramer; @@ -106,7 +106,7 @@ public class MPT1327Decoder extends Decoder implements Instrumentable if( mNBFMDemodulator != null ) { mNBFMDemodulator.addListener( mDCRemovalFilter ); - mDCRemovalFilter.setListener( this.getSimplexReceiver() ); + mDCRemovalFilter.setListener( this.getRealReceiver() ); } } @@ -115,7 +115,7 @@ public class MPT1327Decoder extends Decoder implements Instrumentable /* Decimation filter - 48000 / 2 = 24000 output */ mDecimationFilter = new FloatHalfBandFilter( Filters.FIR_HALF_BAND_31T_ONE_EIGHTH_FCO, 1.0002 ); - addSimplexSampleListener( mDecimationFilter ); + addRealSampleListener( mDecimationFilter ); /* Low pass filter: 2kHz to pass the 1200 & 1800 Hz FSK */ mLowPassFilter = new FloatFIRFilter( @@ -169,7 +169,7 @@ public class MPT1327Decoder extends Decoder implements Instrumentable } @Override - public void addUnfilteredSimplexSampleListener( SimplexSampleListener listener ) + public void addUnfilteredRealSampleListener( RealSampleListener listener ) { if( mNBFMDemodulator != null ) { @@ -256,7 +256,7 @@ public class MPT1327Decoder extends Decoder implements Instrumentable } else { - addSimplexSampleListener( inputTap ); + addRealSampleListener( inputTap ); } break; case INSTRUMENT_HB1_FILTER_TO_LOW_PASS: @@ -292,7 +292,7 @@ public class MPT1327Decoder extends Decoder implements Instrumentable } else { - removeSimplexListener( inputTap ); + removeRealListener( inputTap ); } break; case INSTRUMENT_HB1_FILTER_TO_LOW_PASS: diff --git a/src/decode/nbfm/NBFMConventionalDecoder.java b/src/decode/nbfm/NBFMConventionalDecoder.java index f6790e19..745e5858 100644 --- a/src/decode/nbfm/NBFMConventionalDecoder.java +++ b/src/decode/nbfm/NBFMConventionalDecoder.java @@ -17,7 +17,7 @@ ******************************************************************************/ package decode.nbfm; -import sample.simplex.SimplexSampleListener; +import sample.real.RealSampleListener; import source.Source.SampleType; import decode.Decoder; import decode.DecoderType; @@ -66,7 +66,7 @@ public class NBFMConventionalDecoder extends Decoder * Route the demodulated, filtered samples back to this class to send * to all registered listeners */ - mDCRemovalFilter.setListener( this.getSimplexReceiver() ); + mDCRemovalFilter.setListener( this.getRealReceiver() ); } } @@ -77,7 +77,7 @@ public class NBFMConventionalDecoder extends Decoder } @Override - public void addUnfilteredSimplexSampleListener( SimplexSampleListener listener ) + public void addUnfilteredRealSampleListener( RealSampleListener listener ) { if( mDemodulator != null ) { diff --git a/src/decode/p25/P25Decoder.java b/src/decode/p25/P25Decoder.java index 30131be4..4563a3c3 100644 --- a/src/decode/p25/P25Decoder.java +++ b/src/decode/p25/P25Decoder.java @@ -24,7 +24,7 @@ import instrument.tap.stream.FloatTap; import java.util.ArrayList; import java.util.List; -import sample.simplex.SimplexSampleListener; +import sample.real.RealSampleListener; import source.Source.SampleType; import alias.AliasList; import decode.Decoder; @@ -83,12 +83,12 @@ public class P25Decoder extends Decoder implements Instrumentable * Route the demodulated, filtered samples back to this class to send * to all registered listeners */ - mDCRemovalFilter.setListener( this.getSimplexReceiver() ); + mDCRemovalFilter.setListener( this.getRealReceiver() ); } mC4FMDecoder = new C4FMDecoder(); - addSimplexSampleListener( mC4FMDecoder ); + addRealSampleListener( mC4FMDecoder ); } @Override @@ -120,8 +120,8 @@ public class P25Decoder extends Decoder implements Instrumentable { case TAP_DEMOD_TO_DECODER: FloatTap demodTap = (FloatTap)tap; - removeSimplexListener( mC4FMDecoder ); - addSimplexSampleListener( demodTap ); + removeRealListener( mC4FMDecoder ); + addRealSampleListener( demodTap ); demodTap.setListener( mC4FMDecoder ); break; } @@ -136,15 +136,15 @@ public class P25Decoder extends Decoder implements Instrumentable { case TAP_DEMOD_TO_DECODER: FloatTap demodTap = (FloatTap)tap; - removeSimplexListener( demodTap ); + removeRealListener( demodTap ); demodTap.removeListener( mC4FMDecoder ); - addSimplexSampleListener( mC4FMDecoder ); + addRealSampleListener( mC4FMDecoder ); break; } } @Override - public void addUnfilteredSimplexSampleListener( SimplexSampleListener listener ) + public void addUnfilteredRealSampleListener( RealSampleListener listener ) { // TODO Auto-generated method stub } diff --git a/src/decode/passport/PassportDecoder.java b/src/decode/passport/PassportDecoder.java index 2e05ee62..fefe7ee2 100644 --- a/src/decode/passport/PassportDecoder.java +++ b/src/decode/passport/PassportDecoder.java @@ -23,7 +23,7 @@ import instrument.tap.Tap; import java.util.ArrayList; import java.util.List; -import sample.simplex.SimplexSampleListener; +import sample.real.RealSampleListener; import source.Source.SampleType; import alias.AliasList; import bits.MessageFramer; @@ -78,7 +78,7 @@ public class PassportDecoder extends Decoder implements Instrumentable */ mDCRemovalFilter = new DCRemovalFilter2( sDC_REMOVAL_RATIO ); mNBFMDemodulator.addListener( mDCRemovalFilter ); - mDCRemovalFilter.setListener( this.getSimplexReceiver() ); + mDCRemovalFilter.setListener( this.getRealReceiver() ); } mPassportFSKDecoder = @@ -94,7 +94,7 @@ public class PassportDecoder extends Decoder implements Instrumentable } else { - addSimplexSampleListener( mPassportFSKDecoder ); + addRealSampleListener( mPassportFSKDecoder ); } @@ -141,7 +141,7 @@ public class PassportDecoder extends Decoder implements Instrumentable } @Override - public void addUnfilteredSimplexSampleListener( SimplexSampleListener listener ) + public void addUnfilteredRealSampleListener( RealSampleListener listener ) { if( mNBFMDemodulator != null ) { diff --git a/src/dsp/afc/AutomaticFrequencyControl.java b/src/dsp/afc/AutomaticFrequencyControl.java index 6bc8b5f0..491616b0 100644 --- a/src/dsp/afc/AutomaticFrequencyControl.java +++ b/src/dsp/afc/AutomaticFrequencyControl.java @@ -1,12 +1,12 @@ package dsp.afc; -import sample.simplex.SimplexSampleListener; +import sample.real.RealSampleListener; import source.tuner.FrequencyChangeEvent; import source.tuner.FrequencyChangeEvent.Attribute; import source.tuner.FrequencyChangeListener; import buffer.FloatAveragingBuffer; -public class AutomaticFrequencyControl implements SimplexSampleListener, +public class AutomaticFrequencyControl implements RealSampleListener, FrequencyChangeListener { private static float LARGE_ERROR = 10000.0f; diff --git a/src/dsp/agc/ComplexAutomaticGainControl.java b/src/dsp/agc/ComplexAutomaticGainControl.java new file mode 100644 index 00000000..4e037f11 --- /dev/null +++ b/src/dsp/agc/ComplexAutomaticGainControl.java @@ -0,0 +1,198 @@ +package dsp.agc; + +import java.util.concurrent.atomic.AtomicBoolean; + +import sample.Listener; +import sample.Provider; +import sample.complex.ComplexSample; +import buffer.ComplexCircularBuffer; +import buffer.DoubleCircularBuffer; + +/** + * Automatic Gain Control (AGC) for complex samples at 48000 sample rate. + */ +public class ComplexAutomaticGainControl implements Listener, + Provider +{ + private static final double SAMPLE_RATE = 48000; + + /* Signal delay line - time delay in seconds */ + private static final double DELAY_TIME_CONSTANT = 0.015; + + /* Peak detector window - time delay in seconds */ + private static final double WINDOW_TIME_CONSTANT = 0.018; + + /* Attack time constants in seconds */ + private static final double ATTACK_RISE_TIME_CONSTANT = 0.002; + private static final double ATTACK_FALL_TIME_CONSTANT = 0.005; + + private static final double ATTACK_RISE_ALPHA = 1.0 - + Math.exp( -1.0 / SAMPLE_RATE * ATTACK_RISE_TIME_CONSTANT ); + + private static final double ATTACK_FALL_ALPHA = 1.0 - + Math.exp( -1.0 / SAMPLE_RATE * ATTACK_FALL_TIME_CONSTANT ); + + /* AGC decay value in milliseconds (20 to 5000) */ + private static final double DECAY = 200; + + /* Ratio between rise and fall times of decay time constants - adjust for + * best action with SSB */ + private static final double DECAY_RISEFALL_RATIO = 0.3; + + private static final double DECAY_RISE_ALPHA = 1.0 - + Math.exp( -1.0 / ( SAMPLE_RATE * DECAY * .001 * DECAY_RISEFALL_RATIO ) ); + + private static final double DECAY_FALL_ALPHA = 1.0 - + Math.exp( -1.0 / ( SAMPLE_RATE * DECAY * .001 ) ); + + /* Hang timer release decay time constant in seconds */ + private static final double RELEASE_TIME_CONSTANT = 0.05; + + /* Specifies the AGC Knee in dB if AGC is active (nominal range -160 to 0 dB) */ + private static final double THRESHOLD = -100; + + /* Limit output to about 3db of maximum */ + private static final double AGC_OUT_SCALE = 0.7; + + /* Keep max input and output the same */ + private static final double MAX_AMPLITUDE = 32767.0; //1.0; + private static final double MAX_MANUAL_AMPLITUDE = 32767.0; //1.0; + + /* Specifies AGC manual gain in dB if AGC is not active ( 0 to 100 dB) */ + private static final double MANUAL_GAIN = 0.0; + + private static final double MANUAL_AGC_GAIN = MAX_MANUAL_AMPLITUDE * + Math.pow( 10.0, MANUAL_GAIN / 20.0 ); + + /* Specifies dB reduction in output at knee from max output level (0 - 10dB) */ + private static final double SLOPE_FACTOR = 2.0; + + private static final double KNEE = THRESHOLD / 20.0; + + private static final double GAIN_SLOPE = SLOPE_FACTOR / 100.0; + + private static final double FIXED_GAIN = AGC_OUT_SCALE * + Math.pow( 10.0, KNEE * ( GAIN_SLOPE - 1.0 ) ); + + /* Constant for calc log() so that a value of 0 magnitude = -8 */ + private static final double MIN_CONSTANT = 3.2767E-4; + + private AtomicBoolean mAGCEnabled = new AtomicBoolean( true ); + + private double mPeakMagnitude = 0.0; + private double mAttackAverage = 0.0; + private double mDecayAverage = 0.0; + + private ComplexCircularBuffer mDelayBuffer = + new ComplexCircularBuffer( (int)( SAMPLE_RATE * DELAY_TIME_CONSTANT ) ); + private DoubleCircularBuffer mMagnitudeBuffer = + new DoubleCircularBuffer( (int)( SAMPLE_RATE * WINDOW_TIME_CONSTANT ) ); + + private Listener mListener; + + public ComplexAutomaticGainControl() + { + } + + @Override + public void receive( ComplexSample currentSample ) + { + ComplexSample delayedSample = mDelayBuffer.get( currentSample ); + + double gain = MANUAL_AGC_GAIN; + + if( mAGCEnabled.get() ) + { + float max = currentSample.maximumAbsolute(); + + double currentMagnitude = Math.log10( max + MIN_CONSTANT ) - + Math.log10( MAX_AMPLITUDE ); + + double delayedMagnitude = mMagnitudeBuffer.get( currentMagnitude ); + + if( currentMagnitude > mPeakMagnitude ) + { + /* Use current magnitude as peak if it's larger */ + mPeakMagnitude = currentMagnitude; + } + else if( delayedMagnitude == mPeakMagnitude ) + { + /* If delayed magnitude is the current peak, then find a new peak */ + mPeakMagnitude = mMagnitudeBuffer.max(); + } + + /* Exponential decay mode */ + if( mPeakMagnitude > mAttackAverage ) + { + mAttackAverage = ( ( 1.0 - ATTACK_RISE_ALPHA ) * mAttackAverage ) + + ( ATTACK_RISE_ALPHA * mPeakMagnitude ); + } + else + { + mAttackAverage = ( ( 1.0 - ATTACK_FALL_ALPHA ) * mAttackAverage ) + + ( ATTACK_FALL_ALPHA * mPeakMagnitude ); + } + + if( mPeakMagnitude > mDecayAverage ) + { + mDecayAverage = ( ( 1.0 - DECAY_RISE_ALPHA ) * mDecayAverage ) + + ( DECAY_RISE_ALPHA * mPeakMagnitude ); + } + else + { + mDecayAverage = ( ( 1.0 - DECAY_FALL_ALPHA ) * mDecayAverage ) + + ( DECAY_RISE_ALPHA * mPeakMagnitude ); + } + + double magnitude = ( mAttackAverage > mDecayAverage ) ? + mAttackAverage : mDecayAverage; + + if( magnitude < KNEE ) + { + gain = FIXED_GAIN; + } + else + { + gain = AGC_OUT_SCALE * Math.pow( 10.0, + magnitude * ( GAIN_SLOPE - 1.0 ) ); + } + + } + + delayedSample.multiply( (float)gain ); + + if( mListener != null ) + { + mListener.receive( delayedSample ); + } + } + + /** + * Enables or disables Automatic Gain Control (AGC). + */ + public void setAGCEnabled( boolean enabled ) + { + mAGCEnabled.set( enabled ); + } + + /** + * Indicates if AGC is enabled + * @return true=AGC, false=MANUAL GAIN + */ + public boolean isAGCEnabled() + { + return mAGCEnabled.get(); + } + + @Override + public void setListener( Listener listener ) + { + mListener = listener; + } + + @Override + public void removeListener( Listener listener ) + { + mListener = null; + } +} diff --git a/src/dsp/filter/DCRemovalFilter.java b/src/dsp/filter/DCRemovalFilter.java index 2ea181b0..4806ccaa 100644 --- a/src/dsp/filter/DCRemovalFilter.java +++ b/src/dsp/filter/DCRemovalFilter.java @@ -18,17 +18,17 @@ package dsp.filter; import sample.Listener; -import sample.simplex.SimplexSampleListener; +import sample.real.RealSampleListener; /** * Implements the real-time general DC removal algorithm described on page * 762, figure 13-62d, in Understanding Digital Signal Processing 3e, Lyons. */ -public class DCRemovalFilter implements SimplexSampleListener +public class DCRemovalFilter implements RealSampleListener { private double mAlpha; private float mPrevious; - private SimplexSampleListener mListener; + private RealSampleListener mListener; public DCRemovalFilter( double alpha ) { @@ -59,7 +59,7 @@ public class DCRemovalFilter implements SimplexSampleListener } } - public void setListener( SimplexSampleListener listener ) + public void setListener( RealSampleListener listener ) { mListener = listener; } diff --git a/src/dsp/filter/DCRemovalFilter2.java b/src/dsp/filter/DCRemovalFilter2.java index fa1fe6a5..36827935 100644 --- a/src/dsp/filter/DCRemovalFilter2.java +++ b/src/dsp/filter/DCRemovalFilter2.java @@ -18,13 +18,13 @@ package dsp.filter; import sample.Listener; -import sample.simplex.SimplexSampleListener; +import sample.real.RealSampleListener; -public class DCRemovalFilter2 implements SimplexSampleListener +public class DCRemovalFilter2 implements RealSampleListener { private double mAverage; private double mRatio; - private SimplexSampleListener mListener; + private RealSampleListener mListener; public DCRemovalFilter2( double ratio ) { @@ -50,7 +50,7 @@ public class DCRemovalFilter2 implements SimplexSampleListener } } - public void setListener( SimplexSampleListener listener ) + public void setListener( RealSampleListener listener ) { mListener = listener; } diff --git a/src/dsp/filter/DCRemovalFilter3.java b/src/dsp/filter/DCRemovalFilter3.java index af119490..43d331c6 100644 --- a/src/dsp/filter/DCRemovalFilter3.java +++ b/src/dsp/filter/DCRemovalFilter3.java @@ -1,14 +1,14 @@ package dsp.filter; -import sample.simplex.SimplexSampleListener; +import sample.real.RealSampleListener; -public class DCRemovalFilter3 implements SimplexSampleListener +public class DCRemovalFilter3 implements RealSampleListener { private float mAlpha; private float mPreviousInput = 0.0f; private float mPreviousOutput = 0.0f; - private SimplexSampleListener mListener; + private RealSampleListener mListener; /** * IIR single-pole DC removal filter, as described by J M de Freitas in @@ -38,7 +38,7 @@ public class DCRemovalFilter3 implements SimplexSampleListener mPreviousOutput = currentOutput; } - public void setListener( SimplexSampleListener listener ) + public void setListener( RealSampleListener listener ) { mListener = listener; } diff --git a/src/dsp/filter/FloatFIRFilter.java b/src/dsp/filter/FloatFIRFilter.java index edaa4711..c2c8d69e 100644 --- a/src/dsp/filter/FloatFIRFilter.java +++ b/src/dsp/filter/FloatFIRFilter.java @@ -19,11 +19,11 @@ package dsp.filter; import java.util.ArrayList; -import sample.simplex.SimplexSampleListener; +import sample.real.RealSampleListener; -public class FloatFIRFilter implements SimplexSampleListener +public class FloatFIRFilter implements RealSampleListener { - private SimplexSampleListener mListener; + private RealSampleListener mListener; private ArrayList mBuffer; private int mBufferSize = 1; //Temporary initial value private int mBufferPointer = 0; @@ -61,7 +61,7 @@ public class FloatFIRFilter implements SimplexSampleListener return mCoefficients.length; } - public void setListener( SimplexSampleListener listener ) + public void setListener( RealSampleListener listener ) { mListener = listener; } diff --git a/src/dsp/filter/FloatHalfBandFilter.java b/src/dsp/filter/FloatHalfBandFilter.java index e0816ba8..e1a47392 100644 --- a/src/dsp/filter/FloatHalfBandFilter.java +++ b/src/dsp/filter/FloatHalfBandFilter.java @@ -19,11 +19,11 @@ package dsp.filter; import java.util.ArrayList; -import sample.simplex.SimplexSampleListener; +import sample.real.RealSampleListener; -public class FloatHalfBandFilter implements SimplexSampleListener +public class FloatHalfBandFilter implements RealSampleListener { - private SimplexSampleListener mListener; + private RealSampleListener mListener; private ArrayList mBuffer; private int mBufferSize = 1; //Temporary initial value private int mBufferPointer = 0; @@ -188,7 +188,7 @@ public class FloatHalfBandFilter implements SimplexSampleListener /** * Registers a listener for filtered samples */ - public void setListener( SimplexSampleListener listener ) + public void setListener( RealSampleListener listener ) { mListener = listener; } diff --git a/src/dsp/filter/FloatHalfBandNoDecimateFilter.java b/src/dsp/filter/FloatHalfBandNoDecimateFilter.java index aa180c2e..57937df1 100644 --- a/src/dsp/filter/FloatHalfBandNoDecimateFilter.java +++ b/src/dsp/filter/FloatHalfBandNoDecimateFilter.java @@ -19,11 +19,11 @@ package dsp.filter; import java.util.ArrayList; -import sample.simplex.SimplexSampleListener; +import sample.real.RealSampleListener; -public class FloatHalfBandNoDecimateFilter implements SimplexSampleListener +public class FloatHalfBandNoDecimateFilter implements RealSampleListener { - private SimplexSampleListener mListener; + private RealSampleListener mListener; private ArrayList mBuffer; private int mBufferSize = 1; //Temporary initial value private int mBufferPointer = 0; @@ -178,7 +178,7 @@ public class FloatHalfBandNoDecimateFilter implements SimplexSampleListener /** * Registers a listener for filtered samples */ - public void setListener( SimplexSampleListener listener ) + public void setListener( RealSampleListener listener ) { mListener = listener; } diff --git a/src/dsp/filter/SquaringFilter.java b/src/dsp/filter/SquaringFilter.java index 0d79615c..3857e8a0 100644 --- a/src/dsp/filter/SquaringFilter.java +++ b/src/dsp/filter/SquaringFilter.java @@ -18,9 +18,9 @@ package dsp.filter; import sample.Listener; -import sample.simplex.SimplexSampleListener; +import sample.real.RealSampleListener; -public class SquaringFilter implements SimplexSampleListener +public class SquaringFilter implements RealSampleListener { private Listener mListener; diff --git a/src/dsp/fsk/C4FMDecoder.java b/src/dsp/fsk/C4FMDecoder.java index ca21f638..5184422e 100644 --- a/src/dsp/fsk/C4FMDecoder.java +++ b/src/dsp/fsk/C4FMDecoder.java @@ -7,9 +7,9 @@ import instrument.tap.stream.FloatTap; import java.util.ArrayList; import java.util.List; -import sample.simplex.SimplexSampleListener; +import sample.real.RealSampleListener; -public class C4FMDecoder implements SimplexSampleListener, Instrumentable +public class C4FMDecoder implements RealSampleListener, Instrumentable { private final String TAP_C4FM_INPUT = "C4FM Input"; private ArrayList mTaps; diff --git a/src/dsp/fsk/FSK2Decoder.java b/src/dsp/fsk/FSK2Decoder.java index c8e66cfa..a9c06789 100644 --- a/src/dsp/fsk/FSK2Decoder.java +++ b/src/dsp/fsk/FSK2Decoder.java @@ -26,7 +26,7 @@ import java.util.BitSet; import java.util.List; import sample.Listener; -import sample.simplex.SimplexSampleListener; +import sample.real.RealSampleListener; import buffer.BooleanAveragingBuffer; import dsp.fsk.SymbolEvent.Shift; @@ -50,7 +50,7 @@ import dsp.fsk.SymbolEvent.Shift; * Implements instrumentable interface, so that slice events can be received * externally to analyze decoder performance. */ -public class FSK2Decoder implements Instrumentable, SimplexSampleListener +public class FSK2Decoder implements Instrumentable, RealSampleListener { public enum Output{ NORMAL, INVERTED }; diff --git a/src/dsp/fsk/LTRFSKDecoder.java b/src/dsp/fsk/LTRFSKDecoder.java index 21ef2b16..89a06f54 100644 --- a/src/dsp/fsk/LTRFSKDecoder.java +++ b/src/dsp/fsk/LTRFSKDecoder.java @@ -27,7 +27,7 @@ import java.util.ArrayList; import java.util.List; import sample.Listener; -import sample.simplex.SimplexSampleListener; +import sample.real.RealSampleListener; import dsp.Slicer; import dsp.Slicer.Output; import dsp.filter.DCRemovalFilter3; @@ -37,7 +37,7 @@ import dsp.filter.FloatHalfBandNoDecimateFilter; import dsp.filter.LTRPulseShapingFilter; import dsp.filter.SquaringFilter; -public class LTRFSKDecoder implements SimplexSampleListener, Instrumentable +public class LTRFSKDecoder implements RealSampleListener, Instrumentable { private FloatHalfBandFilter mHBFilter1; private FloatHalfBandFilter mHBFilter2; diff --git a/src/dsp/nbfm/FMDiscriminator.java b/src/dsp/nbfm/FMDiscriminator.java index 3c8b9a9d..0f57b2b3 100644 --- a/src/dsp/nbfm/FMDiscriminator.java +++ b/src/dsp/nbfm/FMDiscriminator.java @@ -19,11 +19,11 @@ package dsp.nbfm; import sample.Listener; import sample.complex.ComplexSample; -import sample.simplex.SimplexSampleListener; +import sample.real.RealSampleListener; public class FMDiscriminator implements Listener { - private SimplexSampleListener mListener; + private RealSampleListener mListener; private ComplexSample mPreviousSample = new ComplexSample( 0.0f, 0.0f ); private double mGain; @@ -94,7 +94,7 @@ public class FMDiscriminator implements Listener mPreviousSample = currentSample; } - public void setListener( SimplexSampleListener listener ) + public void setListener( RealSampleListener listener ) { mListener = listener; } diff --git a/src/dsp/nbfm/FilteringNBFMDemodulator.java b/src/dsp/nbfm/FilteringNBFMDemodulator.java index f9815c08..4d74f08d 100644 --- a/src/dsp/nbfm/FilteringNBFMDemodulator.java +++ b/src/dsp/nbfm/FilteringNBFMDemodulator.java @@ -19,8 +19,8 @@ package dsp.nbfm; import sample.Listener; import sample.complex.ComplexSample; -import sample.simplex.SimplexSampleBroadcaster; -import sample.simplex.SimplexSampleListener; +import sample.real.RealSampleBroadcaster; +import sample.real.RealSampleListener; import dsp.filter.ComplexFIRFilter; import dsp.filter.FilterFactory; import dsp.filter.FloatFIRFilter; @@ -28,7 +28,7 @@ import dsp.filter.Window.WindowType; public class FilteringNBFMDemodulator implements Listener { - private SimplexSampleBroadcaster mBroadcaster = new SimplexSampleBroadcaster(); + private RealSampleBroadcaster mBroadcaster = new RealSampleBroadcaster(); private ComplexFIRFilter mIQFilter; private FloatFIRFilter mAudioFilter; private FMDiscriminator mDiscriminator; @@ -78,7 +78,7 @@ public class FilteringNBFMDemodulator implements Listener /** * Adds a listener to receive demodulated samples */ - public void addListener( SimplexSampleListener listener ) + public void addListener( RealSampleListener listener ) { mBroadcaster.addListener( listener ); } @@ -86,7 +86,7 @@ public class FilteringNBFMDemodulator implements Listener /** * Removes a listener from receiving demodulated samples */ - public void removeListener( SimplexSampleListener listener ) + public void removeListener( RealSampleListener listener ) { mBroadcaster.removeListener( listener ); } diff --git a/src/dsp/nbfm/NBFMDemodulator.java b/src/dsp/nbfm/NBFMDemodulator.java index c763e620..1545c752 100644 --- a/src/dsp/nbfm/NBFMDemodulator.java +++ b/src/dsp/nbfm/NBFMDemodulator.java @@ -19,15 +19,15 @@ package dsp.nbfm; import sample.Listener; import sample.complex.ComplexSample; -import sample.simplex.SimplexSampleBroadcaster; -import sample.simplex.SimplexSampleListener; +import sample.real.RealSampleBroadcaster; +import sample.real.RealSampleListener; import dsp.filter.ComplexFIRFilter; import dsp.filter.FilterFactory; import dsp.filter.Window.WindowType; public class NBFMDemodulator implements Listener { - private SimplexSampleBroadcaster mBroadcaster = new SimplexSampleBroadcaster(); + private RealSampleBroadcaster mBroadcaster = new RealSampleBroadcaster(); private ComplexFIRFilter mIQFilter; private FMDiscriminator mDiscriminator; @@ -78,7 +78,7 @@ public class NBFMDemodulator implements Listener /** * Adds a listener to receive demodulated samples */ - public void addListener( SimplexSampleListener listener ) + public void addListener( RealSampleListener listener ) { mBroadcaster.addListener( listener ); } @@ -86,7 +86,7 @@ public class NBFMDemodulator implements Listener /** * Removes a listener from receiving demodulated samples */ - public void removeListener( SimplexSampleListener listener ) + public void removeListener( RealSampleListener listener ) { mBroadcaster.removeListener( listener ); } diff --git a/src/instrument/gui/DecoderViewFrame.java b/src/instrument/gui/DecoderViewFrame.java index 98cd1575..5311c161 100644 --- a/src/instrument/gui/DecoderViewFrame.java +++ b/src/instrument/gui/DecoderViewFrame.java @@ -77,10 +77,10 @@ public class DecoderViewFrame extends JInternalFrame { mLog.error( "Hey, we're not wired up yet for complex" ); } - else if( source.getSampleType() == SampleType.FLOAT ) + else if( source.getSampleType() == SampleType.REAL ) { FloatWaveSource fws = (FloatWaveSource)mWaveSource; - fws.setListener( mDecoder.getSimplexReceiver() ); + fws.setListener( mDecoder.getRealReceiver() ); } mDecoder.addMessageListener( this ); diff --git a/src/instrument/gui/WaveSourceFrame.java b/src/instrument/gui/WaveSourceFrame.java index 03d9fcfa..61d5c648 100644 --- a/src/instrument/gui/WaveSourceFrame.java +++ b/src/instrument/gui/WaveSourceFrame.java @@ -145,19 +145,19 @@ public class WaveSourceFrame extends JInternalFrame implements PositionListener decoder = new Fleetsync2Decoder( null ); break; case LTR_NET: - decoder = new LTRNetDecoder( SampleType.FLOAT, null, MessageDirection.OSW ); + decoder = new LTRNetDecoder( SampleType.REAL, null, MessageDirection.OSW ); break; case MDC1200: decoder = new MDCDecoder( null ); break; case MPT1327: - decoder = new MPT1327Decoder( SampleType.FLOAT, null, Sync.NORMAL ); + decoder = new MPT1327Decoder( SampleType.REAL, null, Sync.NORMAL ); break; case PASSPORT: - decoder = new PassportDecoder( SampleType.FLOAT, null ); + decoder = new PassportDecoder( SampleType.REAL, null ); break; case P25: - decoder = new P25Decoder( SampleType.FLOAT, null ); + decoder = new P25Decoder( SampleType.REAL, null ); break; } diff --git a/src/instrument/tap/stream/FloatTap.java b/src/instrument/tap/stream/FloatTap.java index 4253c09c..1beebfa5 100644 --- a/src/instrument/tap/stream/FloatTap.java +++ b/src/instrument/tap/stream/FloatTap.java @@ -19,11 +19,11 @@ package instrument.tap.stream; import instrument.tap.TapListener; import instrument.tap.TapType; -import sample.simplex.SimplexSampleListener; +import sample.real.RealSampleListener; -public class FloatTap extends StreamTap implements SimplexSampleListener +public class FloatTap extends StreamTap implements RealSampleListener { - private SimplexSampleListener mListener; + private RealSampleListener mListener; public FloatTap( String name, int delay, @@ -46,12 +46,12 @@ public class FloatTap extends StreamTap implements SimplexSampleListener } } - public void setListener( SimplexSampleListener listener ) + public void setListener( RealSampleListener listener ) { mListener = listener; } - public void removeListener( SimplexSampleListener listener ) + public void removeListener( RealSampleListener listener ) { mListener = null; } diff --git a/src/record/wave/FloatWaveRecorder.java b/src/record/wave/FloatWaveRecorder.java index 1a789f13..67ce74a5 100644 --- a/src/record/wave/FloatWaveRecorder.java +++ b/src/record/wave/FloatWaveRecorder.java @@ -28,14 +28,14 @@ import org.slf4j.LoggerFactory; import record.Recorder; import record.RecorderType; -import sample.simplex.SimplexSampleListener; +import sample.real.RealSampleListener; import util.waveaudio.WaveWriter; import buffer.FloatSampleBufferAssembler; /** * Threaded WAVE audio recorder for recording mono float samples to a wave file */ -public class FloatWaveRecorder extends Recorder implements SimplexSampleListener +public class FloatWaveRecorder extends Recorder implements RealSampleListener { private final static Logger mLog = LoggerFactory.getLogger( FloatWaveRecorder.class ); diff --git a/src/sample/complex/ComplexSample.java b/src/sample/complex/ComplexSample.java index 33e1849e..63898c4f 100644 --- a/src/sample/complex/ComplexSample.java +++ b/src/sample/complex/ComplexSample.java @@ -182,6 +182,21 @@ public class ComplexSample implements Serializable return mRight; } + /** + * Returns the greater absolute value between left and right values + */ + public float maximumAbsolute() + { + if( Math.abs( mLeft ) > Math.abs( mRight ) ) + { + return Math.abs( mLeft ); + } + else + { + return Math.abs( mRight ); + } + } + /** * Creates a new complex sample representing the angle with unit circle * magnitude diff --git a/src/sample/decimator/SimplexDecimator.java b/src/sample/decimator/RealDecimator.java similarity index 90% rename from src/sample/decimator/SimplexDecimator.java rename to src/sample/decimator/RealDecimator.java index 315942dd..3a01249f 100644 --- a/src/sample/decimator/SimplexDecimator.java +++ b/src/sample/decimator/RealDecimator.java @@ -3,7 +3,7 @@ package sample.decimator; import sample.complex.ComplexSampleListener; -public class SimplexDecimator implements ComplexSampleListener +public class RealDecimator implements ComplexSampleListener { private ComplexSampleListener mListener; private int mCounter = 0; @@ -12,7 +12,7 @@ public class SimplexDecimator implements ComplexSampleListener /** * Constructs a new Decimator object with the specified decimation rate. */ - public SimplexDecimator( int rate ) + public RealDecimator( int rate ) { mDecimationRate = rate; } diff --git a/src/sample/simplex/SimplexBuffer.java b/src/sample/real/RealBuffer.java similarity index 74% rename from src/sample/simplex/SimplexBuffer.java rename to src/sample/real/RealBuffer.java index f627b5d6..b4ed8ffb 100644 --- a/src/sample/simplex/SimplexBuffer.java +++ b/src/sample/real/RealBuffer.java @@ -1,15 +1,15 @@ -package sample.simplex; +package sample.real; import java.util.Arrays; -public class SimplexBuffer +public class RealBuffer { private float[] mSamples; /** * Wrapper around float array containing float samples */ - public SimplexBuffer( float[] samples ) + public RealBuffer( float[] samples ) { mSamples = samples; } @@ -17,11 +17,11 @@ public class SimplexBuffer /** * Creates a deep copy of the buffer */ - public SimplexBuffer copyOf() + public RealBuffer copyOf() { float[] copy = Arrays.copyOf( mSamples, mSamples.length ); - return new SimplexBuffer( copy ); + return new RealBuffer( copy ); } /** diff --git a/src/sample/simplex/SimplexSampleBroadcaster.java b/src/sample/real/RealSampleBroadcaster.java similarity index 80% rename from src/sample/simplex/SimplexSampleBroadcaster.java rename to src/sample/real/RealSampleBroadcaster.java index f5734894..5dbbb04e 100644 --- a/src/sample/simplex/SimplexSampleBroadcaster.java +++ b/src/sample/real/RealSampleBroadcaster.java @@ -15,17 +15,17 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package sample.simplex; +package sample.real; import java.util.concurrent.CopyOnWriteArrayList; /** * Broadcasts a received float sample to multiple listeners */ -public class SimplexSampleBroadcaster implements SimplexSampleListener +public class RealSampleBroadcaster implements RealSampleListener { - private CopyOnWriteArrayList mListeners = - new CopyOnWriteArrayList(); + private CopyOnWriteArrayList mListeners = + new CopyOnWriteArrayList(); @Override public void receive( float sample ) @@ -51,12 +51,12 @@ public class SimplexSampleBroadcaster implements SimplexSampleListener return mListeners.size(); } - public void addListener( SimplexSampleListener listener ) + public void addListener( RealSampleListener listener ) { mListeners.add( listener ); } - public void removeListener( SimplexSampleListener listener ) + public void removeListener( RealSampleListener listener ) { mListeners.remove( listener ); } @@ -68,7 +68,7 @@ public class SimplexSampleBroadcaster implements SimplexSampleListener public void broadcast( float sample ) { - for( SimplexSampleListener listener: mListeners ) + for( RealSampleListener listener: mListeners ) { listener.receive( sample ); } diff --git a/src/sample/real/RealSampleListener.java b/src/sample/real/RealSampleListener.java new file mode 100644 index 00000000..de32950d --- /dev/null +++ b/src/sample/real/RealSampleListener.java @@ -0,0 +1,6 @@ +package sample.real; + +public interface RealSampleListener +{ + public void receive( float sample ); +} diff --git a/src/sample/real/RealSampleProvider.java b/src/sample/real/RealSampleProvider.java new file mode 100644 index 00000000..3adcface --- /dev/null +++ b/src/sample/real/RealSampleProvider.java @@ -0,0 +1,8 @@ +package sample.real; + +public interface RealSampleProvider +{ + public void setListener( RealSampleListener listener ); + + public void removeListener( RealSampleListener listener ); +} diff --git a/src/sample/simplex/SimplexSampleListener.java b/src/sample/simplex/SimplexSampleListener.java deleted file mode 100644 index bd63cf26..00000000 --- a/src/sample/simplex/SimplexSampleListener.java +++ /dev/null @@ -1,6 +0,0 @@ -package sample.simplex; - -public interface SimplexSampleListener -{ - public void receive( float sample ); -} diff --git a/src/sample/simplex/SimplexSampleProvider.java b/src/sample/simplex/SimplexSampleProvider.java deleted file mode 100644 index 73c29710..00000000 --- a/src/sample/simplex/SimplexSampleProvider.java +++ /dev/null @@ -1,8 +0,0 @@ -package sample.simplex; - -public interface SimplexSampleProvider -{ - public void setListener( SimplexSampleListener listener ); - - public void removeListener( SimplexSampleListener listener ); -} diff --git a/src/source/FloatSource.java b/src/source/FloatSource.java index 6e7d849b..a4d297a9 100644 --- a/src/source/FloatSource.java +++ b/src/source/FloatSource.java @@ -6,6 +6,6 @@ public abstract class FloatSource extends Source implements Provider { public FloatSource( String name ) { - super( name, SampleType.FLOAT ); + super( name, SampleType.REAL ); } } diff --git a/src/source/RealSource.java b/src/source/RealSource.java new file mode 100644 index 00000000..352ff26f --- /dev/null +++ b/src/source/RealSource.java @@ -0,0 +1,13 @@ +package source; + +import sample.Provider; +import sample.real.RealBuffer; + + +public abstract class RealSource extends Source implements Provider +{ + public RealSource( String name ) + { + super( name, SampleType.REAL ); + } +} diff --git a/src/source/SimplexSource.java b/src/source/SimplexSource.java deleted file mode 100644 index 2c5ce78c..00000000 --- a/src/source/SimplexSource.java +++ /dev/null @@ -1,13 +0,0 @@ -package source; - -import sample.Provider; -import sample.simplex.SimplexBuffer; - - -public abstract class SimplexSource extends Source implements Provider -{ - public SimplexSource( String name ) - { - super( name, SampleType.FLOAT ); - } -} diff --git a/src/source/Source.java b/src/source/Source.java index 8f53a979..506955d0 100644 --- a/src/source/Source.java +++ b/src/source/Source.java @@ -25,7 +25,7 @@ public abstract class Source protected String mName; protected SampleType mSampleType; - public enum SampleType { COMPLEX, FLOAT } + public enum SampleType { COMPLEX, REAL } public Source( String name, SampleType sampleType ) { diff --git a/src/source/mixer/MixerManager.java b/src/source/mixer/MixerManager.java index cc44fe61..d233776d 100644 --- a/src/source/mixer/MixerManager.java +++ b/src/source/mixer/MixerManager.java @@ -82,9 +82,9 @@ public class MixerManager return sInstance; } - public SimplexMixerSource getSource( ProcessingChain processingChain ) + public RealMixerSource getSource( ProcessingChain processingChain ) { - SimplexMixerSource retVal = null; + RealMixerSource retVal = null; SourceConfiguration config = processingChain.getChannel().getSourceConfiguration(); @@ -120,7 +120,7 @@ public class MixerManager if( dataLine != null ) { - return new SimplexMixerSource( dataLine, + return new RealMixerSource( dataLine, MONO, mixerName, new ShortAdapter() ); @@ -148,7 +148,7 @@ public class MixerManager if( dataLine != null ) { - return new SimplexMixerSource( dataLine, STEREO, + return new RealMixerSource( dataLine, STEREO, mixerName, new ChannelShortAdapter( mixerConfig.getChannel() ) ); } diff --git a/src/source/mixer/SimplexMixerSource.java b/src/source/mixer/RealMixerSource.java similarity index 89% rename from src/source/mixer/SimplexMixerSource.java rename to src/source/mixer/RealMixerSource.java index ae2ca924..a560108d 100644 --- a/src/source/mixer/SimplexMixerSource.java +++ b/src/source/mixer/RealMixerSource.java @@ -31,14 +31,14 @@ import org.slf4j.LoggerFactory; import sample.Listener; import sample.adapter.SampleAdapter; -import sample.simplex.SimplexBuffer; -import source.SimplexSource; +import sample.real.RealBuffer; +import source.RealSource; import source.SourceException; -public class SimplexMixerSource extends SimplexSource +public class RealMixerSource extends RealSource { private final static Logger mLog = - LoggerFactory.getLogger( SimplexMixerSource.class ); + LoggerFactory.getLogger( RealMixerSource.class ); private long mFrequency = 0; private int mBufferSize = 16384; @@ -50,13 +50,13 @@ public class SimplexMixerSource extends SimplexSource private int mBytesPerFrame = 0; private SampleAdapter mSampleAdapter; - CopyOnWriteArrayList> mSampleListeners = - new CopyOnWriteArrayList>(); + CopyOnWriteArrayList> mSampleListeners = + new CopyOnWriteArrayList>(); /** - * Simplex Mixer Source - constructs a reader on the mixer/sound card target + * Real Mixer Source - constructs a reader on the mixer/sound card target * data line using the specified audio format (sample size, sample rate ) - * and broadcasts simplex buffers (float arrays) to all registered listeners. + * and broadcasts real buffers (float arrays) to all registered listeners. * Reads buffers sized to 10% of the sample rate specified in audio format. * * @param targetDataLine - mixer or sound card to be used @@ -69,7 +69,7 @@ public class SimplexMixerSource extends SimplexSource * mixer into float array data. Can optionally invert the channel data if * the left/right stereo channels are inverted. */ - public SimplexMixerSource( TargetDataLine targetDataLine, + public RealMixerSource( TargetDataLine targetDataLine, AudioFormat format, String name, SampleAdapter sampleAdapter ) @@ -81,7 +81,7 @@ public class SimplexMixerSource extends SimplexSource mSampleAdapter = sampleAdapter; } - public void setListener( Listener listener ) + public void setListener( Listener listener ) { mSampleListeners.add( listener ); @@ -95,7 +95,7 @@ public class SimplexMixerSource extends SimplexSource } } - public void removeListener( Listener listener ) + public void removeListener( Listener listener ) { mSampleListeners.remove( listener ); @@ -106,13 +106,13 @@ public class SimplexMixerSource extends SimplexSource } } - public void broadcast( SimplexBuffer samples ) + public void broadcast( RealBuffer samples ) { - Iterator> it = mSampleListeners.iterator(); + Iterator> it = mSampleListeners.iterator(); while( it.hasNext() ) { - Listener next = it.next(); + Listener next = it.next(); /* if this is the last (or only) listener, send him the original * buffer, otherwise send him a copy of the buffer */ @@ -226,7 +226,7 @@ public class SimplexMixerSource extends SimplexSource mSampleAdapter.convert( buffer ); /* Dispatch samples to registered listeners */ - broadcast( new SimplexBuffer( samples ) ); + broadcast( new RealBuffer( samples ) ); } catch ( Exception e ) { diff --git a/src/source/tuner/hackrf/HackRFTunerController.java b/src/source/tuner/hackrf/HackRFTunerController.java index f38051a8..045f7d65 100644 --- a/src/source/tuner/hackrf/HackRFTunerController.java +++ b/src/source/tuner/hackrf/HackRFTunerController.java @@ -491,8 +491,6 @@ public class HackRFTunerController extends TunerController */ public void setSampleRate( HackRFSampleRate rate ) throws UsbException { - mLog.debug( "Setting sample rate to:" + rate.name() ); - setSampleRateManual( rate.getRate(), 1 ); mFrequencyController.setSampleRate( rate.getRate() ); diff --git a/src/source/wave/FloatWaveSource.java b/src/source/wave/FloatWaveSource.java index 471f8e2d..8174d122 100644 --- a/src/source/wave/FloatWaveSource.java +++ b/src/source/wave/FloatWaveSource.java @@ -29,7 +29,7 @@ import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.UnsupportedAudioFileException; -import sample.simplex.SimplexSampleListener; +import sample.real.RealSampleListener; public class FloatWaveSource extends WaveSource { @@ -44,7 +44,7 @@ public class FloatWaveSource extends WaveSource private int mBufferPointer = 0; private int mBufferLength; private ShortBuffer mBufferWrapper; - private SimplexSampleListener mListener; + private RealSampleListener mListener; private static int BUFFER_SAMPLE_SIZE = 2000; @@ -70,7 +70,7 @@ public class FloatWaveSource extends WaveSource */ public FloatWaveSource( File file, boolean loop ) throws IOException { - super( file, SampleType.FLOAT ); + super( file, SampleType.REAL ); mLoop = loop; } @@ -272,12 +272,12 @@ public class FloatWaveSource extends WaveSource /** * Adds a new listener to receive samples as they are read from the wave file */ - public void setListener( SimplexSampleListener listener ) + public void setListener( RealSampleListener listener ) { mListener = listener; } - public void removeListener( SimplexSampleListener listener ) + public void removeListener( RealSampleListener listener ) { mListener = null; } diff --git a/src/spectrum/ChannelSpectrumPanel.java b/src/spectrum/ChannelSpectrumPanel.java index cca89602..7fd4837b 100644 --- a/src/spectrum/ChannelSpectrumPanel.java +++ b/src/spectrum/ChannelSpectrumPanel.java @@ -18,7 +18,7 @@ import javax.swing.SwingUtilities; import net.miginfocom.swing.MigLayout; import sample.Listener; import sample.complex.ComplexBuffer; -import sample.simplex.SimplexSampleListener; +import sample.real.RealSampleListener; import settings.ColorSetting.ColorSettingName; import settings.ColorSettingMenuItem; import settings.Setting; @@ -45,7 +45,7 @@ import dsp.filter.Window.WindowType; public class ChannelSpectrumPanel extends JPanel implements ChannelEventListener, - SimplexSampleListener, + RealSampleListener, SettingChangeListener, SpectralDisplayAdjuster { @@ -54,7 +54,7 @@ public class ChannelSpectrumPanel extends JPanel "channel_spectrum_averaging_size"; private ResourceManager mResourceManager; - private DFTProcessor mDFTProcessor = new DFTProcessor( SampleType.FLOAT ); + private DFTProcessor mDFTProcessor = new DFTProcessor( SampleType.REAL ); private DFTResultsConverter mDFTConverter = new RealDecibelConverter(); private JLayeredPane mLayeredPane; private SpectrumPanel mSpectrumPanel; @@ -206,7 +206,7 @@ public class ChannelSpectrumPanel extends JPanel { if( mEnabled.get() && mCurrentChannel != null && mCurrentChannel.isProcessing() ) { - mCurrentChannel.getProcessingChain().addSimplexListener( (SimplexSampleListener)this ); + mCurrentChannel.getProcessingChain().addRealListener( (RealSampleListener)this ); mDFTProcessor.start(); } } @@ -216,7 +216,7 @@ public class ChannelSpectrumPanel extends JPanel if( mCurrentChannel != null && mCurrentChannel.isProcessing() ) { - mCurrentChannel.getProcessingChain().removeSimplexListener( (SimplexSampleListener)this ); + mCurrentChannel.getProcessingChain().removeRealListener( (RealSampleListener)this ); } mDFTProcessor.stop(); @@ -491,7 +491,7 @@ public class ChannelSpectrumPanel extends JPanel } } - public class SampleAssembler implements SimplexSampleListener + public class SampleAssembler implements RealSampleListener { private Listener mListener; diff --git a/src/spectrum/DFTProcessor.java b/src/spectrum/DFTProcessor.java index 58d32f52..98a9bd55 100644 --- a/src/spectrum/DFTProcessor.java +++ b/src/spectrum/DFTProcessor.java @@ -327,7 +327,7 @@ public class DFTProcessor implements Listener, Window.apply( mWindow, samples ); - if( mSampleType == SampleType.FLOAT ) + if( mSampleType == SampleType.REAL ) { mFFT.realForward( samples ); }