Resolved issue with LJ1200 decoder using inverted bit output

This commit is contained in:
dennis.sheirer
2014-11-16 13:43:41 +00:00
parent 827806b6f2
commit 5ef806ef02
7 changed files with 43 additions and 11 deletions

View File

@@ -42,7 +42,7 @@ import decode.mdc1200.MDCDecoder;
import decode.mpt1327.MPT1327ChannelState; import decode.mpt1327.MPT1327ChannelState;
import decode.mpt1327.MPT1327Decoder; import decode.mpt1327.MPT1327Decoder;
import decode.nbfm.NBFMChannelState; import decode.nbfm.NBFMChannelState;
import decode.nbfm.NBFMConventionalDecoder; import decode.nbfm.NBFMDecoder;
import decode.p25.P25ChannelState; import decode.p25.P25ChannelState;
import decode.p25.P25Decoder; import decode.p25.P25Decoder;
import decode.passport.PassportChannelState; import decode.passport.PassportChannelState;
@@ -71,7 +71,7 @@ public class DecoderFactory
retVal = new AMDecoder( sampleType ); retVal = new AMDecoder( sampleType );
break; break;
case NBFM: case NBFM:
retVal = new NBFMConventionalDecoder( sampleType ); retVal = new NBFMDecoder( sampleType );
break; break;
case LTR_STANDARD: case LTR_STANDARD:
DecodeConfigLTRStandard ltrStandardConfig = DecodeConfigLTRStandard ltrStandardConfig =

View File

@@ -80,7 +80,7 @@ public class LJ1200Decoder extends Decoder implements Instrumentable
mDecimationFilter.setListener( mBandPassFilter ); mDecimationFilter.setListener( mBandPassFilter );
mFSKDecoder = new FSK2Decoder( DECIMATED_SAMPLE_RATE, mFSKDecoder = new FSK2Decoder( DECIMATED_SAMPLE_RATE,
SYMBOL_RATE, Output.INVERTED ); SYMBOL_RATE, Output.NORMAL );
mBandPassFilter.setListener( mFSKDecoder ); mBandPassFilter.setListener( mFSKDecoder );
mMessageFramer = new MessageFramer( mMessageFramer = new MessageFramer(

View File

@@ -119,6 +119,7 @@ public class LJ1200Message extends Message
sb.append( "VRC: " + getVRC() ); sb.append( "VRC: " + getVRC() );
sb.append( " LRC: " + getLRC() ); sb.append( " LRC: " + getLRC() );
sb.append( " FUNCTION: " + getFunction() ); sb.append( " FUNCTION: " + getFunction() );
sb.append( "ADDRESS:" + getAddress() );
return sb.toString(); return sb.toString();
} }

View File

@@ -24,7 +24,7 @@ import decode.DecoderType;
import dsp.filter.DCRemovalFilter2; import dsp.filter.DCRemovalFilter2;
import dsp.nbfm.FilteringNBFMDemodulator; 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 * This value determines how quickly the DC remove filter responds to
@@ -35,7 +35,7 @@ public class NBFMConventionalDecoder extends Decoder
private FilteringNBFMDemodulator mDemodulator; private FilteringNBFMDemodulator mDemodulator;
private DCRemovalFilter2 mDCRemovalFilter; private DCRemovalFilter2 mDCRemovalFilter;
public NBFMConventionalDecoder( SampleType sampleType ) public NBFMDecoder( SampleType sampleType )
{ {
super( sampleType ); super( sampleType );

View File

@@ -2,6 +2,7 @@ package dsp.agc;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import sample.real.RealBuffer;
import sample.real.RealSampleListener; import sample.real.RealSampleListener;
import sample.real.RealSampleProvider; import sample.real.RealSampleProvider;
import buffer.DoubleCircularBuffer; import buffer.DoubleCircularBuffer;
@@ -145,7 +146,32 @@ public class RealAutomaticGainControl implements RealSampleListener,
} }
@Override @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 ); float delayedSample = mDelayBuffer.get( currentSample );
@@ -208,11 +234,8 @@ public class RealAutomaticGainControl implements RealSampleListener,
} }
delayedSample = (float)( delayedSample * gain ); delayedSample = (float)( delayedSample * gain );
if( mListener != null ) return delayedSample;
{
mListener.receive( delayedSample );
}
} }
/** /**

View File

@@ -46,6 +46,7 @@ import source.wave.WaveSource.PositionListener;
import decode.Decoder; import decode.Decoder;
import decode.DecoderType; import decode.DecoderType;
import decode.fleetsync2.Fleetsync2Decoder; import decode.fleetsync2.Fleetsync2Decoder;
import decode.lj1200.LJ1200Decoder;
import decode.ltrnet.LTRNetDecoder; import decode.ltrnet.LTRNetDecoder;
import decode.mdc1200.MDCDecoder; import decode.mdc1200.MDCDecoder;
import decode.mpt1327.MPT1327Decoder; import decode.mpt1327.MPT1327Decoder;
@@ -144,6 +145,9 @@ public class WaveSourceFrame extends JInternalFrame implements PositionListener
case FLEETSYNC2: case FLEETSYNC2:
decoder = new Fleetsync2Decoder( null ); decoder = new Fleetsync2Decoder( null );
break; break;
case LJ_1200:
decoder = new LJ1200Decoder( null );
break;
case LTR_NET: case LTR_NET:
decoder = new LTRNetDecoder( SampleType.REAL, null, MessageDirection.OSW ); decoder = new LTRNetDecoder( SampleType.REAL, null, MessageDirection.OSW );
break; break;

View File

@@ -29,6 +29,7 @@ import javax.sound.sampled.TargetDataLine;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import dsp.agc.RealAutomaticGainControl;
import sample.Listener; import sample.Listener;
import sample.adapter.SampleAdapter; import sample.adapter.SampleAdapter;
import sample.real.RealBuffer; import sample.real.RealBuffer;
@@ -49,6 +50,7 @@ public class RealMixerSource extends RealSource
private String mDisplayName; private String mDisplayName;
private int mBytesPerFrame = 0; private int mBytesPerFrame = 0;
private SampleAdapter mSampleAdapter; private SampleAdapter mSampleAdapter;
private RealAutomaticGainControl mAGC = new RealAutomaticGainControl();
CopyOnWriteArrayList<Listener<RealBuffer>> mSampleListeners = CopyOnWriteArrayList<Listener<RealBuffer>> mSampleListeners =
new CopyOnWriteArrayList<Listener<RealBuffer>>(); new CopyOnWriteArrayList<Listener<RealBuffer>>();
@@ -118,10 +120,12 @@ public class RealMixerSource extends RealSource
* buffer, otherwise send him a copy of the buffer */ * buffer, otherwise send him a copy of the buffer */
if( it.hasNext() ) if( it.hasNext() )
{ {
// next.receive( mAGC.process( samples.copyOf() ) );
next.receive( samples.copyOf() ); next.receive( samples.copyOf() );
} }
else else
{ {
// next.receive( mAGC.process( samples ) );
next.receive( samples ); next.receive( samples );
} }
} }