mirror of
https://github.com/DSheirer/sdrtrunk.git
synced 2026-11-12 08:37:25 -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 );
|
||||
|
||||
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<ComplexSample>
|
||||
{
|
||||
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>
|
||||
|
||||
ComplexSample equalized = filter();
|
||||
|
||||
calculateError( equalized );
|
||||
|
||||
updateTaps();
|
||||
updateTaps( equalized );
|
||||
|
||||
if( mListener != null )
|
||||
{
|
||||
@@ -79,8 +85,9 @@ public class CMAEqualizer implements Listener<ComplexSample>
|
||||
|
||||
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<ComplexSample>
|
||||
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