diff --git a/src/decode/DecoderFactory.java b/src/decode/DecoderFactory.java index 12c0a761..b1c7f6b4 100644 --- a/src/decode/DecoderFactory.java +++ b/src/decode/DecoderFactory.java @@ -42,7 +42,7 @@ import decode.mdc1200.MDCDecoder; import decode.mpt1327.MPT1327ChannelState; import decode.mpt1327.MPT1327Decoder; import decode.nbfm.NBFMChannelState; -import decode.nbfm.NBFMConventionalDecoder; +import decode.nbfm.NBFMDecoder; import decode.p25.P25ChannelState; import decode.p25.P25Decoder; import decode.passport.PassportChannelState; @@ -71,7 +71,7 @@ public class DecoderFactory retVal = new AMDecoder( sampleType ); break; case NBFM: - retVal = new NBFMConventionalDecoder( sampleType ); + retVal = new NBFMDecoder( sampleType ); break; case LTR_STANDARD: DecodeConfigLTRStandard ltrStandardConfig = diff --git a/src/decode/lj1200/LJ1200Decoder.java b/src/decode/lj1200/LJ1200Decoder.java index 9fd541e4..c3a96f82 100644 --- a/src/decode/lj1200/LJ1200Decoder.java +++ b/src/decode/lj1200/LJ1200Decoder.java @@ -80,7 +80,7 @@ public class LJ1200Decoder extends Decoder implements Instrumentable mDecimationFilter.setListener( mBandPassFilter ); mFSKDecoder = new FSK2Decoder( DECIMATED_SAMPLE_RATE, - SYMBOL_RATE, Output.INVERTED ); + SYMBOL_RATE, Output.NORMAL ); mBandPassFilter.setListener( mFSKDecoder ); mMessageFramer = new MessageFramer( diff --git a/src/decode/lj1200/LJ1200Message.java b/src/decode/lj1200/LJ1200Message.java index 98ca9ff6..505de7d7 100644 --- a/src/decode/lj1200/LJ1200Message.java +++ b/src/decode/lj1200/LJ1200Message.java @@ -119,6 +119,7 @@ public class LJ1200Message extends Message sb.append( "VRC: " + getVRC() ); sb.append( " LRC: " + getLRC() ); sb.append( " FUNCTION: " + getFunction() ); + sb.append( "ADDRESS:" + getAddress() ); return sb.toString(); } diff --git a/src/decode/nbfm/NBFMConventionalDecoder.java b/src/decode/nbfm/NBFMDecoder.java similarity index 96% rename from src/decode/nbfm/NBFMConventionalDecoder.java rename to src/decode/nbfm/NBFMDecoder.java index 745e5858..364612b2 100644 --- a/src/decode/nbfm/NBFMConventionalDecoder.java +++ b/src/decode/nbfm/NBFMDecoder.java @@ -24,7 +24,7 @@ import decode.DecoderType; import dsp.filter.DCRemovalFilter2; import dsp.nbfm.FilteringNBFMDemodulator; -public class NBFMConventionalDecoder extends Decoder +public class NBFMDecoder extends Decoder { /** * This value determines how quickly the DC remove filter responds to @@ -35,7 +35,7 @@ public class NBFMConventionalDecoder extends Decoder private FilteringNBFMDemodulator mDemodulator; private DCRemovalFilter2 mDCRemovalFilter; - public NBFMConventionalDecoder( SampleType sampleType ) + public NBFMDecoder( SampleType sampleType ) { super( sampleType ); diff --git a/src/dsp/agc/RealAutomaticGainControl.java b/src/dsp/agc/RealAutomaticGainControl.java index 7e7b18c1..84512135 100644 --- a/src/dsp/agc/RealAutomaticGainControl.java +++ b/src/dsp/agc/RealAutomaticGainControl.java @@ -2,6 +2,7 @@ package dsp.agc; import java.util.concurrent.atomic.AtomicBoolean; +import sample.real.RealBuffer; import sample.real.RealSampleListener; import sample.real.RealSampleProvider; import buffer.DoubleCircularBuffer; @@ -145,7 +146,32 @@ public class RealAutomaticGainControl implements RealSampleListener, } @Override - public void receive( float currentSample ) + public void receive( float currentSample ) + { + float processed = process( currentSample ); + + if( mListener != null ) + { + mListener.receive( processed ); + } + } + + /** + * Applies AGC to a buffer of real (float) samples + */ + public RealBuffer process( RealBuffer buffer ) + { + float[] samples = buffer.getSamples(); + + for( int x = 0; x < samples.length; x++ ) + { + samples[ x ] = process( samples[ x ] ); + } + + return new RealBuffer( samples ); + } + + public float process( float currentSample ) { float delayedSample = mDelayBuffer.get( currentSample ); @@ -208,11 +234,8 @@ public class RealAutomaticGainControl implements RealSampleListener, } delayedSample = (float)( delayedSample * gain ); - - if( mListener != null ) - { - mListener.receive( delayedSample ); - } + + return delayedSample; } /** diff --git a/src/instrument/gui/WaveSourceFrame.java b/src/instrument/gui/WaveSourceFrame.java index 0ea63073..9eec3dcc 100644 --- a/src/instrument/gui/WaveSourceFrame.java +++ b/src/instrument/gui/WaveSourceFrame.java @@ -46,6 +46,7 @@ import source.wave.WaveSource.PositionListener; import decode.Decoder; import decode.DecoderType; import decode.fleetsync2.Fleetsync2Decoder; +import decode.lj1200.LJ1200Decoder; import decode.ltrnet.LTRNetDecoder; import decode.mdc1200.MDCDecoder; import decode.mpt1327.MPT1327Decoder; @@ -144,6 +145,9 @@ public class WaveSourceFrame extends JInternalFrame implements PositionListener case FLEETSYNC2: decoder = new Fleetsync2Decoder( null ); break; + case LJ_1200: + decoder = new LJ1200Decoder( null ); + break; case LTR_NET: decoder = new LTRNetDecoder( SampleType.REAL, null, MessageDirection.OSW ); break; diff --git a/src/source/mixer/RealMixerSource.java b/src/source/mixer/RealMixerSource.java index a560108d..58937bda 100644 --- a/src/source/mixer/RealMixerSource.java +++ b/src/source/mixer/RealMixerSource.java @@ -29,6 +29,7 @@ import javax.sound.sampled.TargetDataLine; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import dsp.agc.RealAutomaticGainControl; import sample.Listener; import sample.adapter.SampleAdapter; import sample.real.RealBuffer; @@ -49,6 +50,7 @@ public class RealMixerSource extends RealSource private String mDisplayName; private int mBytesPerFrame = 0; private SampleAdapter mSampleAdapter; + private RealAutomaticGainControl mAGC = new RealAutomaticGainControl(); CopyOnWriteArrayList> mSampleListeners = new CopyOnWriteArrayList>(); @@ -118,10 +120,12 @@ public class RealMixerSource extends RealSource * buffer, otherwise send him a copy of the buffer */ if( it.hasNext() ) { +// next.receive( mAGC.process( samples.copyOf() ) ); next.receive( samples.copyOf() ); } else { +// next.receive( mAGC.process( samples ) ); next.receive( samples ); } }