mirror of
https://github.com/DSheirer/sdrtrunk.git
synced 2026-11-14 01:27:34 -05:00
Resolves issue with correct display and scaling of decibel values in
both the spectral and waterfall displays. Resolves issue with gain loss in HilbertTransform.
This commit is contained in:
@@ -17,10 +17,21 @@
|
||||
******************************************************************************/
|
||||
package dsp.mixer;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import org.jtransforms.fft.FloatFFT_1D;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import dsp.filter.Filters;
|
||||
import dsp.filter.hilbert.HilbertTransform;
|
||||
import sample.complex.Complex;
|
||||
|
||||
public class Oscillator
|
||||
{
|
||||
private final static Logger mLog =
|
||||
LoggerFactory.getLogger( Oscillator.class );
|
||||
|
||||
private double mFrequency;
|
||||
private double mSampleRate;
|
||||
|
||||
@@ -105,4 +116,109 @@ public class Oscillator
|
||||
{
|
||||
return mCurrentAngle.real();
|
||||
}
|
||||
|
||||
public static void main( String[] args )
|
||||
{
|
||||
Oscillator o = new Oscillator( 1536, 4096 );
|
||||
|
||||
o.rotate();
|
||||
|
||||
float[] samples = new float[ 8192 ];
|
||||
|
||||
for( int x = 0; x < 8192; x++ )
|
||||
{
|
||||
samples[ x ] = o.inphase();
|
||||
|
||||
o.rotate();
|
||||
}
|
||||
|
||||
logLargest( "Real: ", samples, false );
|
||||
|
||||
HilbertTransform ht = new HilbertTransform();
|
||||
|
||||
float[] transformed = ht.filter( samples );
|
||||
|
||||
logLargest( "Hilbert: ", transformed, true );
|
||||
|
||||
FloatFFT_1D fft = new FloatFFT_1D( 4096 );
|
||||
|
||||
fft.complexForward( transformed );
|
||||
|
||||
logLargest( "DFT:", transformed, true );
|
||||
}
|
||||
|
||||
private static void logLargest( String label, float[] samples, boolean complex )
|
||||
{
|
||||
float largestI = 0.0f;
|
||||
int indexLargestI = 0;
|
||||
float largestQ = 0.0f;
|
||||
int indexLargestQ = 0;
|
||||
|
||||
float smallestI = 0.0f;
|
||||
int indexsmallestI = 0;
|
||||
float smallestQ = 0.0f;
|
||||
int indexsmallestQ = 0;
|
||||
|
||||
for( int x = 0; x < samples.length; x++ )
|
||||
{
|
||||
if( complex )
|
||||
{
|
||||
if( x % 2 == 0 )
|
||||
{
|
||||
if( samples[ x ] > largestI )
|
||||
{
|
||||
largestI = samples[ x ];
|
||||
indexLargestI = x;
|
||||
}
|
||||
if( samples[ x ] < smallestI )
|
||||
{
|
||||
smallestI = samples[ x ];
|
||||
indexsmallestI = x;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if( samples[ x ] > largestQ )
|
||||
{
|
||||
largestQ = samples[ x ];
|
||||
indexLargestQ = x;
|
||||
}
|
||||
if( samples[ x ] < smallestQ )
|
||||
{
|
||||
smallestQ = samples[ x ];
|
||||
indexsmallestQ = x;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if( samples[ x ] > largestI )
|
||||
{
|
||||
largestI = samples[ x ];
|
||||
indexLargestI = x;
|
||||
}
|
||||
if( samples[ x ] < smallestI )
|
||||
{
|
||||
smallestI = samples[ x ];
|
||||
indexsmallestI = x;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if( complex )
|
||||
{
|
||||
mLog.debug( label +
|
||||
" largestI (" + indexLargestI + "): " + largestI +
|
||||
" smallestI (" + indexsmallestI + "): " + smallestI +
|
||||
" largestQ (" + indexLargestQ + "): " + largestQ +
|
||||
" smallestQ (" + indexsmallestQ + "): " + smallestQ );
|
||||
}
|
||||
else
|
||||
{
|
||||
mLog.debug( label +
|
||||
" largest (" + indexLargestI + "): " + largestI +
|
||||
" smallest (" + indexsmallestI + "): " + smallestI );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user