mirror of
https://github.com/DSheirer/sdrtrunk.git
synced 2026-11-15 01:57:39 -05:00
CMA Equalizer - work in progress
This commit is contained in:
@@ -10,7 +10,7 @@ public class CMAEqualizer implements Listener<ComplexSample>
|
|||||||
{
|
{
|
||||||
private final static Logger mLog = LoggerFactory.getLogger( CMAEqualizer.class );
|
private final static Logger mLog = LoggerFactory.getLogger( CMAEqualizer.class );
|
||||||
|
|
||||||
public static final int TAP_COUNT = 4;
|
public static final int TAP_COUNT = 11;
|
||||||
|
|
||||||
private float mModulus;
|
private float mModulus;
|
||||||
private float mMu;
|
private float mMu;
|
||||||
@@ -27,26 +27,34 @@ public class CMAEqualizer implements Listener<ComplexSample>
|
|||||||
{
|
{
|
||||||
mModulus = modulus;
|
mModulus = modulus;
|
||||||
mMu = mu;
|
mMu = mu;
|
||||||
|
|
||||||
mTaps[ 0 ] = new ComplexSample( 1.0f, 1.0f );
|
/* Set first tap to 1,0 as a start */
|
||||||
mBuffer[ 0 ] = new ComplexSample( 1.0f, 1.0f );
|
mTaps[ 0 ] = new ComplexSample( 1.0f, 0.0f );
|
||||||
|
|
||||||
for( int x = 1; x < TAP_COUNT; x++ )
|
for( int x = 1; x < TAP_COUNT; x++ )
|
||||||
{
|
{
|
||||||
mTaps[ x ] = new ComplexSample( 0.0f, 0.0f );
|
mTaps[ x ] = new ComplexSample( 0.0f, 0.0f );
|
||||||
mBuffer[ x ] = new ComplexSample( 1.0f, 1.0f );
|
mBuffer[ x ] = new ComplexSample( 0.0f, 0.0f );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateTaps()
|
private void updateTaps( ComplexSample sample )
|
||||||
{
|
{
|
||||||
|
/* Calculate the error. The ideal sample magnitude is unity (1.0).
|
||||||
|
* When the sample is not at unity, the error vector points in the
|
||||||
|
* opposite direction with a magnitude equal to 1 - sample magnitude.*/
|
||||||
|
mError = ComplexSample.multiply( sample, sample.norm() - mModulus );
|
||||||
|
|
||||||
|
/* Ensure we don't exceed unity */
|
||||||
|
mError.clip( 1.0f );
|
||||||
|
|
||||||
for( int x = 0; x < TAP_COUNT; x++ )
|
for( int x = 0; x < TAP_COUNT; x++ )
|
||||||
{
|
{
|
||||||
// tap -= mu * conj(sample) * error
|
// tap -= mu * conj(sample) * error
|
||||||
|
|
||||||
mTaps[ x ] = ComplexSample.subtract( mTaps[ x ],
|
mTaps[ x ] = ComplexSample.subtract( mTaps[ x ],
|
||||||
ComplexSample.multiply( ComplexSample.multiply(
|
ComplexSample.multiply( ComplexSample.multiply(
|
||||||
mBuffer[ x ].conjugate(), mMu ), mError ) );
|
mBuffer[ x ].conjugate(), mError ), mMu ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,9 +69,7 @@ public class CMAEqualizer implements Listener<ComplexSample>
|
|||||||
|
|
||||||
ComplexSample equalized = filter();
|
ComplexSample equalized = filter();
|
||||||
|
|
||||||
calculateError( equalized );
|
updateTaps( equalized );
|
||||||
|
|
||||||
updateTaps();
|
|
||||||
|
|
||||||
if( mListener != null )
|
if( mListener != null )
|
||||||
{
|
{
|
||||||
@@ -79,8 +85,9 @@ public class CMAEqualizer implements Listener<ComplexSample>
|
|||||||
|
|
||||||
for( int x = 0; x < TAP_COUNT; x++ )
|
for( int x = 0; x < TAP_COUNT; x++ )
|
||||||
{
|
{
|
||||||
sum = ComplexSample.add( sum,
|
sum = ComplexSample.add( sum, ComplexSample.multiply(
|
||||||
ComplexSample.multiply( mBuffer[ x ], mTaps[ x ] ) );
|
mBuffer[ ( x + mBufferPointer ) % TAP_COUNT ],
|
||||||
|
mTaps[ TAP_COUNT - x - 1 ] ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
return sum;
|
return sum;
|
||||||
@@ -91,9 +98,4 @@ public class CMAEqualizer implements Listener<ComplexSample>
|
|||||||
mListener = listener;
|
mListener = listener;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void calculateError( ComplexSample sample )
|
|
||||||
{
|
|
||||||
mError = ComplexSample.multiply( sample, sample.norm() - mModulus );
|
|
||||||
mError.clip( 1.0f );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
31
src/dsp/gain/ComplexGain.java
Normal file
31
src/dsp/gain/ComplexGain.java
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
package dsp.gain;
|
||||||
|
|
||||||
|
import sample.Listener;
|
||||||
|
import sample.complex.ComplexSample;
|
||||||
|
|
||||||
|
public class ComplexGain implements Listener<ComplexSample>
|
||||||
|
{
|
||||||
|
private float mGain;
|
||||||
|
private Listener<ComplexSample> mListener;
|
||||||
|
|
||||||
|
public ComplexGain( float gain )
|
||||||
|
{
|
||||||
|
mGain = gain;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void receive( ComplexSample sample )
|
||||||
|
{
|
||||||
|
if( mListener != null )
|
||||||
|
{
|
||||||
|
sample.multiply( mGain );
|
||||||
|
|
||||||
|
mListener.receive( sample );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setListener( Listener<ComplexSample> listener )
|
||||||
|
{
|
||||||
|
mListener = listener;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user