diff --git a/src/dsp/filter/channelizer/ChannelizerViewer.java b/src/dsp/filter/channelizer/ChannelizerViewer.java index 45bba720..9ad53ca1 100644 --- a/src/dsp/filter/channelizer/ChannelizerViewer.java +++ b/src/dsp/filter/channelizer/ChannelizerViewer.java @@ -19,6 +19,9 @@ package dsp.filter.channelizer; import dsp.filter.FilterFactory; +import dsp.filter.design.FilterDesignException; +import dsp.filter.fir.FIRFilterSpecification; +import dsp.filter.fir.remez.RemezFIRFilterDesigner; import dsp.mixer.LowPhaseNoiseOscillator; import dsp.mixer.Oscillator; import net.miginfocom.swing.MigLayout; @@ -65,7 +68,7 @@ public class ChannelizerViewer extends JFrame { mChannelCount = channelCount; mSampleRate = mChannelCount * CHANNEL_BANDWIDTH; - mToneFrequency = (int)(CHANNEL_BANDWIDTH * 3); //Set to channel 1 as default + mToneFrequency = (int)(CHANNEL_BANDWIDTH * 1); //Set to channel 1 as default init(); } @@ -143,7 +146,7 @@ public class ChannelizerViewer extends JFrame int maximumFrequency = mSampleRate / 2; SpinnerNumberModel model = new SpinnerNumberModel(mToneFrequency, -maximumFrequency, maximumFrequency, - 500 ); + 100 ); model.addChangeListener(new ChangeListener() { @@ -186,9 +189,38 @@ public class ChannelizerViewer extends JFrame int symbolCount = 14; //Alpha is the residual channel bandwidth left over from the symbol rate and samples per symbol - float alpha = ((float)CHANNEL_BANDWIDTH / (float)(symbolRate * samplesPerSymbol)) - 1.0f; +// float alpha = ((float)CHANNEL_BANDWIDTH / (float)(symbolRate * samplesPerSymbol)) - 1.0f; + + float alpha = 0.8f; + +// float[] taps = FilterFactory.getRootRaisedCosine(samplesPerSymbol * mChannelCount, symbolCount, alpha); + float[] taps = null; + + FIRFilterSpecification specification = FIRFilterSpecification.lowPassBuilder() + .sampleRate(CHANNEL_BANDWIDTH * 2 * mChannelCount) + .gridDensity(16) + .passBandAmplitude(1.0) + .passBandCutoff(11900) + .passBandRipple(0.01) + .stopBandAmplitude(0.0) + .stopBandRipple(0.001) + .stopBandStart(13100) + .build(); + + try + { + RemezFIRFilterDesigner designer = new RemezFIRFilterDesigner(specification); + + if(designer.isValid()) + { + taps = designer.getImpulseResponse(); + } + } + catch(FilterDesignException fde) + { + mLog.error("Filter design error", fde); + } - float[] taps = FilterFactory.getRootRaisedCosine(samplesPerSymbol * mChannelCount, symbolCount, alpha); StringBuilder sb = new StringBuilder(); sb.append("\nPolyphase Channelizer\n"); @@ -224,7 +256,7 @@ public class ChannelizerViewer extends JFrame { setLayout(new MigLayout("insets 0 0 0 0", "fill", "fill")); - int channelsPerRow = 32; + int channelsPerRow = 16; for(int x = 0; x < mChannelCount; x++) { @@ -314,7 +346,7 @@ public class ChannelizerViewer extends JFrame public static void main(String[] args) { - int channelCount = 512; + int channelCount = 4; final ChannelizerViewer frame = new ChannelizerViewer(channelCount); diff --git a/src/dsp/filter/channelizer/PolyphaseChannelizer2.java b/src/dsp/filter/channelizer/PolyphaseChannelizer2.java index 1168b89f..a95a8e7e 100644 --- a/src/dsp/filter/channelizer/PolyphaseChannelizer2.java +++ b/src/dsp/filter/channelizer/PolyphaseChannelizer2.java @@ -67,7 +67,7 @@ public class PolyphaseChannelizer2 implements Listener public void filter(float inphase, float quadrature) { - int index = mFilterPointer * 2; + int index = (mChannelCount - mFilterPointer - 1) * 2; mFilteredSamples[index] = mInphaseFilters[mFilterPointer].filter(inphase); mFilteredSamples[index + 1] = mQuadratureFilters[mFilterPointer].filter(quadrature); diff --git a/src/dsp/filter/design/FilterViewer.java b/src/dsp/filter/design/FilterViewer.java index bedc583f..f5d70995 100644 --- a/src/dsp/filter/design/FilterViewer.java +++ b/src/dsp/filter/design/FilterViewer.java @@ -40,16 +40,16 @@ public class FilterViewer extends Application */ private float[] getFilter() { -// FIRFilterSpecification specification = FIRFilterSpecification.lowPassBuilder() -// .sampleRate(4000) -// .gridDensity(16) -// .passBandCutoff(950) -// .passBandAmplitude(1.0) -// .passBandRipple(0.01) -// .stopBandStart(1050) -// .stopBandAmplitude(0.0) -// .stopBandRipple(0.005) -// .build(); + FIRFilterSpecification specification = FIRFilterSpecification.lowPassBuilder() + .sampleRate(100000) + .gridDensity(16) + .passBandAmplitude(1.0) + .passBandCutoff(12000) + .passBandRipple(0.01) + .stopBandAmplitude(0.0) + .stopBandRipple(0.001) + .stopBandStart(13000) + .build(); // FIRFilterSpecification specification = FIRFilterSpecification.highPassBuilder() // .sampleRate( 24000 ) @@ -75,21 +75,20 @@ public class FilterViewer extends Application // taps = FilterFactory.getLowPass( 16000, 2400, 73, WindowType.HANNING ); - taps = FilterFactory.getRootRaisedCosine(2 * 8, 16, (12500.0f / 9600.0f - 1.0f)); -// try -// { -// RemezFIRFilterDesigner designer = new RemezFIRFilterDesigner(specification); -// -// if(designer.isValid()) -// { -// taps = designer.getImpulseResponse(); -// } -// } -// catch(FilterDesignException fde) -// { -// mLog.error("Filter design error", fde); -// } + try + { + RemezFIRFilterDesigner designer = new RemezFIRFilterDesigner(specification); + + if(designer.isValid()) + { + taps = designer.getImpulseResponse(); + } + } + catch(FilterDesignException fde) + { + mLog.error("Filter design error", fde); + } return taps; }