mirror of
https://github.com/DSheirer/sdrtrunk.git
synced 2026-11-12 08:37:25 -05:00
Refactoring to use COMPLEX and REAL sample terms throughout
This commit is contained in:
@@ -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 )
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
80
src/buffer/DoubleCircularBuffer.java
Normal file
80
src/buffer/DoubleCircularBuffer.java
Normal file
@@ -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 <http://www.gnu.org/licenses/>
|
||||
******************************************************************************/
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -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<Message>
|
||||
private LinkedTransferQueue<List<ComplexSample>> mComplexQueue =
|
||||
new LinkedTransferQueue<List<ComplexSample>>();
|
||||
|
||||
private SimplexSampleReceiver mSimplexReceiver = new SimplexSampleReceiver();
|
||||
private LinkedTransferQueue<SimplexBuffer> mSimplexQueue =
|
||||
new LinkedTransferQueue<SimplexBuffer>();
|
||||
private RealSampleReceiver mRealReceiver = new RealSampleReceiver();
|
||||
private LinkedTransferQueue<RealBuffer> mRealQueue =
|
||||
new LinkedTransferQueue<RealBuffer>();
|
||||
|
||||
protected Broadcaster<Message> mBroadcaster = new Broadcaster<Message>();
|
||||
|
||||
@@ -121,9 +121,9 @@ public class ProcessingChain implements Listener<Message>
|
||||
return mComplexReceiver;
|
||||
}
|
||||
|
||||
public Listener<SimplexBuffer> getSimplexReceiver()
|
||||
public Listener<RealBuffer> getRealReceiver()
|
||||
{
|
||||
return (Listener<SimplexBuffer>)mSimplexReceiver;
|
||||
return (Listener<RealBuffer>)mRealReceiver;
|
||||
}
|
||||
|
||||
public String toString()
|
||||
@@ -243,10 +243,10 @@ public class ProcessingChain implements Listener<Message>
|
||||
{
|
||||
((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<Message>
|
||||
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<Message>
|
||||
"-" + 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<Message>
|
||||
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<Message>
|
||||
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<Message>
|
||||
/**
|
||||
* 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<Message>
|
||||
}
|
||||
|
||||
/**
|
||||
* 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<SimplexBuffer> sampleBuffers = new ArrayList<SimplexBuffer>();
|
||||
List<RealBuffer> sampleBuffers = new ArrayList<RealBuffer>();
|
||||
|
||||
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<Message>
|
||||
|
||||
for( float sample: samples )
|
||||
{
|
||||
mDecoder.getSimplexReceiver().receive( sample );
|
||||
mDecoder.getRealReceiver().receive( sample );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -749,15 +749,15 @@ public class ProcessingChain implements Listener<Message>
|
||||
}
|
||||
|
||||
/**
|
||||
* 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<SimplexBuffer>
|
||||
public class RealSampleReceiver implements Listener<RealBuffer>
|
||||
{
|
||||
@Override
|
||||
public void receive( SimplexBuffer samples )
|
||||
public void receive( RealBuffer samples )
|
||||
{
|
||||
mSimplexQueue.add( samples );
|
||||
mRealQueue.add( samples );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<Message>
|
||||
{
|
||||
private MessageEventLogger mEventLogger;
|
||||
private Broadcaster<Message> mMessageBroadcaster = new Broadcaster<Message>();
|
||||
private SimplexSampleBroadcaster mSimplexBroadcaster = new SimplexSampleBroadcaster();
|
||||
private RealSampleBroadcaster mRealBroadcaster = new RealSampleBroadcaster();
|
||||
private Broadcaster<ComplexSample> mComplexBroadcaster =
|
||||
new Broadcaster<ComplexSample>();
|
||||
|
||||
@@ -43,11 +43,11 @@ public abstract class Decoder implements Listener<Message>
|
||||
/**
|
||||
* 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<Message>
|
||||
}
|
||||
|
||||
/**
|
||||
* 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<Message>
|
||||
|
||||
mMessageBroadcaster.clear();
|
||||
mComplexBroadcaster.clear();
|
||||
mSimplexBroadcaster.clear();
|
||||
mRealBroadcaster.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -111,7 +111,7 @@ public abstract class Decoder implements Listener<Message>
|
||||
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<Message>
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 );
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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 )
|
||||
{
|
||||
|
||||
@@ -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 )
|
||||
{
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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 )
|
||||
{
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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 )
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
198
src/dsp/agc/ComplexAutomaticGainControl.java
Normal file
198
src/dsp/agc/ComplexAutomaticGainControl.java
Normal file
@@ -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<ComplexSample>,
|
||||
Provider<ComplexSample>
|
||||
{
|
||||
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<ComplexSample> 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<ComplexSample> listener )
|
||||
{
|
||||
mListener = listener;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeListener( Listener<ComplexSample> listener )
|
||||
{
|
||||
mListener = null;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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<Float> 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;
|
||||
}
|
||||
|
||||
@@ -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<Float> 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;
|
||||
}
|
||||
|
||||
@@ -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<Float> 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;
|
||||
}
|
||||
|
||||
@@ -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<Boolean> mListener;
|
||||
|
||||
|
||||
@@ -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<Tap> mTaps;
|
||||
|
||||
@@ -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 };
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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<ComplexSample>
|
||||
{
|
||||
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<ComplexSample>
|
||||
mPreviousSample = currentSample;
|
||||
}
|
||||
|
||||
public void setListener( SimplexSampleListener listener )
|
||||
public void setListener( RealSampleListener listener )
|
||||
{
|
||||
mListener = listener;
|
||||
}
|
||||
|
||||
@@ -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<ComplexSample>
|
||||
{
|
||||
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<ComplexSample>
|
||||
/**
|
||||
* 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<ComplexSample>
|
||||
/**
|
||||
* Removes a listener from receiving demodulated samples
|
||||
*/
|
||||
public void removeListener( SimplexSampleListener listener )
|
||||
public void removeListener( RealSampleListener listener )
|
||||
{
|
||||
mBroadcaster.removeListener( listener );
|
||||
}
|
||||
|
||||
@@ -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<ComplexSample>
|
||||
{
|
||||
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<ComplexSample>
|
||||
/**
|
||||
* 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<ComplexSample>
|
||||
/**
|
||||
* Removes a listener from receiving demodulated samples
|
||||
*/
|
||||
public void removeListener( SimplexSampleListener listener )
|
||||
public void removeListener( RealSampleListener listener )
|
||||
{
|
||||
mBroadcaster.removeListener( listener );
|
||||
}
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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 );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -15,17 +15,17 @@
|
||||
* 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 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<SimplexSampleListener> mListeners =
|
||||
new CopyOnWriteArrayList<SimplexSampleListener>();
|
||||
private CopyOnWriteArrayList<RealSampleListener> mListeners =
|
||||
new CopyOnWriteArrayList<RealSampleListener>();
|
||||
|
||||
@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 );
|
||||
}
|
||||
6
src/sample/real/RealSampleListener.java
Normal file
6
src/sample/real/RealSampleListener.java
Normal file
@@ -0,0 +1,6 @@
|
||||
package sample.real;
|
||||
|
||||
public interface RealSampleListener
|
||||
{
|
||||
public void receive( float sample );
|
||||
}
|
||||
8
src/sample/real/RealSampleProvider.java
Normal file
8
src/sample/real/RealSampleProvider.java
Normal file
@@ -0,0 +1,8 @@
|
||||
package sample.real;
|
||||
|
||||
public interface RealSampleProvider
|
||||
{
|
||||
public void setListener( RealSampleListener listener );
|
||||
|
||||
public void removeListener( RealSampleListener listener );
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
package sample.simplex;
|
||||
|
||||
public interface SimplexSampleListener
|
||||
{
|
||||
public void receive( float sample );
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
package sample.simplex;
|
||||
|
||||
public interface SimplexSampleProvider
|
||||
{
|
||||
public void setListener( SimplexSampleListener listener );
|
||||
|
||||
public void removeListener( SimplexSampleListener listener );
|
||||
}
|
||||
@@ -6,6 +6,6 @@ public abstract class FloatSource extends Source implements Provider<Float>
|
||||
{
|
||||
public FloatSource( String name )
|
||||
{
|
||||
super( name, SampleType.FLOAT );
|
||||
super( name, SampleType.REAL );
|
||||
}
|
||||
}
|
||||
|
||||
13
src/source/RealSource.java
Normal file
13
src/source/RealSource.java
Normal file
@@ -0,0 +1,13 @@
|
||||
package source;
|
||||
|
||||
import sample.Provider;
|
||||
import sample.real.RealBuffer;
|
||||
|
||||
|
||||
public abstract class RealSource extends Source implements Provider<RealBuffer>
|
||||
{
|
||||
public RealSource( String name )
|
||||
{
|
||||
super( name, SampleType.REAL );
|
||||
}
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
package source;
|
||||
|
||||
import sample.Provider;
|
||||
import sample.simplex.SimplexBuffer;
|
||||
|
||||
|
||||
public abstract class SimplexSource extends Source implements Provider<SimplexBuffer>
|
||||
{
|
||||
public SimplexSource( String name )
|
||||
{
|
||||
super( name, SampleType.FLOAT );
|
||||
}
|
||||
}
|
||||
@@ -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 )
|
||||
{
|
||||
|
||||
@@ -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() ) );
|
||||
}
|
||||
|
||||
@@ -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<Listener<SimplexBuffer>> mSampleListeners =
|
||||
new CopyOnWriteArrayList<Listener<SimplexBuffer>>();
|
||||
CopyOnWriteArrayList<Listener<RealBuffer>> mSampleListeners =
|
||||
new CopyOnWriteArrayList<Listener<RealBuffer>>();
|
||||
|
||||
/**
|
||||
* 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<SimplexBuffer> listener )
|
||||
public void setListener( Listener<RealBuffer> listener )
|
||||
{
|
||||
mSampleListeners.add( listener );
|
||||
|
||||
@@ -95,7 +95,7 @@ public class SimplexMixerSource extends SimplexSource
|
||||
}
|
||||
}
|
||||
|
||||
public void removeListener( Listener<SimplexBuffer> listener )
|
||||
public void removeListener( Listener<RealBuffer> listener )
|
||||
{
|
||||
mSampleListeners.remove( listener );
|
||||
|
||||
@@ -106,13 +106,13 @@ public class SimplexMixerSource extends SimplexSource
|
||||
}
|
||||
}
|
||||
|
||||
public void broadcast( SimplexBuffer samples )
|
||||
public void broadcast( RealBuffer samples )
|
||||
{
|
||||
Iterator<Listener<SimplexBuffer>> it = mSampleListeners.iterator();
|
||||
Iterator<Listener<RealBuffer>> it = mSampleListeners.iterator();
|
||||
|
||||
while( it.hasNext() )
|
||||
{
|
||||
Listener<SimplexBuffer> next = it.next();
|
||||
Listener<RealBuffer> 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 )
|
||||
{
|
||||
@@ -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() );
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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<ComplexBuffer> mListener;
|
||||
|
||||
|
||||
@@ -327,7 +327,7 @@ public class DFTProcessor implements Listener<ComplexBuffer>,
|
||||
|
||||
Window.apply( mWindow, samples );
|
||||
|
||||
if( mSampleType == SampleType.FLOAT )
|
||||
if( mSampleType == SampleType.REAL )
|
||||
{
|
||||
mFFT.realForward( samples );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user