CMA Equalizer - work in progress

This commit is contained in:
dennis.sheirer
2015-05-12 13:15:05 +00:00
parent b728b71d61
commit 5dd4454c4c
2 changed files with 51 additions and 18 deletions

View File

@@ -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 );
}
} }

View 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;
}
}