From 5dd4454c4c5bbad2adc70cab807ded862a83677a Mon Sep 17 00:00:00 2001 From: "dennis.sheirer" Date: Tue, 12 May 2015 13:15:05 +0000 Subject: [PATCH] CMA Equalizer - work in progress --- src/dsp/filter/equalizer/CMAEqualizer.java | 38 ++++++++++++---------- src/dsp/gain/ComplexGain.java | 31 ++++++++++++++++++ 2 files changed, 51 insertions(+), 18 deletions(-) create mode 100644 src/dsp/gain/ComplexGain.java diff --git a/src/dsp/filter/equalizer/CMAEqualizer.java b/src/dsp/filter/equalizer/CMAEqualizer.java index 506b725e..4d1ead28 100644 --- a/src/dsp/filter/equalizer/CMAEqualizer.java +++ b/src/dsp/filter/equalizer/CMAEqualizer.java @@ -10,7 +10,7 @@ public class CMAEqualizer implements Listener { 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 mMu; @@ -27,26 +27,34 @@ public class CMAEqualizer implements Listener { mModulus = modulus; mMu = mu; - - mTaps[ 0 ] = new ComplexSample( 1.0f, 1.0f ); - mBuffer[ 0 ] = new ComplexSample( 1.0f, 1.0f ); + + /* Set first tap to 1,0 as a start */ + mTaps[ 0 ] = new ComplexSample( 1.0f, 0.0f ); for( int x = 1; x < TAP_COUNT; x++ ) { 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++ ) { // tap -= mu * conj(sample) * error mTaps[ x ] = ComplexSample.subtract( mTaps[ x ], - ComplexSample.multiply( ComplexSample.multiply( - mBuffer[ x ].conjugate(), mMu ), mError ) ); + ComplexSample.multiply( ComplexSample.multiply( + mBuffer[ x ].conjugate(), mError ), mMu ) ); } } @@ -61,9 +69,7 @@ public class CMAEqualizer implements Listener ComplexSample equalized = filter(); - calculateError( equalized ); - - updateTaps(); + updateTaps( equalized ); if( mListener != null ) { @@ -79,8 +85,9 @@ public class CMAEqualizer implements Listener for( int x = 0; x < TAP_COUNT; x++ ) { - sum = ComplexSample.add( sum, - ComplexSample.multiply( mBuffer[ x ], mTaps[ x ] ) ); + sum = ComplexSample.add( sum, ComplexSample.multiply( + mBuffer[ ( x + mBufferPointer ) % TAP_COUNT ], + mTaps[ TAP_COUNT - x - 1 ] ) ); } return sum; @@ -91,9 +98,4 @@ public class CMAEqualizer implements Listener mListener = listener; } - private void calculateError( ComplexSample sample ) - { - mError = ComplexSample.multiply( sample, sample.norm() - mModulus ); - mError.clip( 1.0f ); - } } diff --git a/src/dsp/gain/ComplexGain.java b/src/dsp/gain/ComplexGain.java new file mode 100644 index 00000000..a8ea1b4e --- /dev/null +++ b/src/dsp/gain/ComplexGain.java @@ -0,0 +1,31 @@ +package dsp.gain; + +import sample.Listener; +import sample.complex.ComplexSample; + +public class ComplexGain implements Listener +{ + private float mGain; + private Listener 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 listener ) + { + mListener = listener; + } +}