#39 WIP - initial efforts to restructure the way tuners and tuner

controllers manager sample buffer processing and channel management.
General cleanup across all modules to remove the executor from each
of the start() methods.  Removed the B100 tuner class since it's not
yet implemented.
This commit is contained in:
Denny
2017-12-03 11:10:50 -05:00
parent bf65e10286
commit 57fab2b7ca
88 changed files with 2112 additions and 2547 deletions

View File

@@ -20,7 +20,7 @@ package dsp.filter.channelizer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import source.tuner.TunerChannel;
import source.tuner.channel.TunerChannel;
import java.text.DecimalFormat;
import java.util.ArrayList;

View File

@@ -28,7 +28,8 @@ import settings.SettingsManager;
import source.ISourceEventProcessor;
import source.SourceEvent;
import source.SourceException;
import source.tuner.TunerChannel;
import source.tuner.channel.TunerChannel;
import source.tuner.channel.TunerChannelSource;
import source.tuner.configuration.TunerConfigurationModel;
import source.tuner.test.TestTuner;
import spectrum.DFTProcessor;
@@ -70,12 +71,12 @@ public class ChannelizerViewer extends JFrame
{
mTestTuner = new TestTuner();
mChannelCount = mTestTuner.getSampleRate() / CHANNEL_BANDWIDTH;
mChannelCount = mTestTuner.getTunerController().getSampleRate() / CHANNEL_BANDWIDTH;
mChannelsPerRow = channelsPerRow;
mToneFrequency = mTestTuner.getTunerController().getFrequency() + 19200;
mTestTuner.setToneFrequency(mToneFrequency);
mTestTuner.getTunerController().setToneFrequency(mToneFrequency);
init();
}
@@ -108,10 +109,11 @@ public class ChannelizerViewer extends JFrame
{
if(mPrimarySpectrumPanel == null)
{
mPrimarySpectrumPanel = new PrimarySpectrumPanel(mSettingsManager, mTestTuner.getSampleRate());
mPrimarySpectrumPanel = new PrimarySpectrumPanel(mSettingsManager,
mTestTuner.getTunerController().getSampleRate());
mPrimarySpectrumPanel.setPreferredSize(new Dimension(1000, 200));
mPrimarySpectrumPanel.setDFTSize(mMainPanelDFTSize);
mTestTuner.addListener(mPrimarySpectrumPanel);
mTestTuner.getSourceManager().addComplexBufferListener(mPrimarySpectrumPanel);
}
return mPrimarySpectrumPanel;
@@ -125,7 +127,7 @@ public class ChannelizerViewer extends JFrame
mControlPanel.setLayout(new MigLayout("insets 0 0 0 0", "", ""));
mControlPanel.add(new JLabel("Tone:"), "align left");
int maximumFrequencyOffset = mTestTuner.getSampleRate() / 2;
int maximumFrequencyOffset = mTestTuner.getTunerController().getSampleRate() / 2;
long minimumFrequency = mTestTuner.getTunerController().getFrequency() - maximumFrequencyOffset;
long maximumFrequency = mTestTuner.getTunerController().getFrequency() + maximumFrequencyOffset;
@@ -138,7 +140,7 @@ public class ChannelizerViewer extends JFrame
public void stateChanged(ChangeEvent e)
{
int toneFrequency = model.getNumber().intValue();
mTestTuner.setToneFrequency(toneFrequency);
mTestTuner.getTunerController().setToneFrequency(toneFrequency);
}
});
@@ -147,9 +149,9 @@ public class ChannelizerViewer extends JFrame
mControlPanel.add(spinner);
mControlPanel.add(new JLabel("Hz"));
mControlPanel.add(new JLabel("Sample Rate: " + mTestTuner.getSampleRate() + " Hz"), "push,align right");
mControlPanel.add(new JLabel("Sample Rate: " + mTestTuner.getTunerController().getSampleRate() + " Hz"), "push,align right");
mControlPanel.add(new JLabel("Max: " + (mTestTuner.getSampleRate() / 2) + " Hz"), "push,align right");
mControlPanel.add(new JLabel("Max: " + (mTestTuner.getTunerController().getSampleRate() / 2) + " Hz"), "push,align right");
mControlPanel.add(new JLabel("Channels: " + mChannelCount), "push,align right");
}
@@ -183,7 +185,7 @@ public class ChannelizerViewer extends JFrame
{
setLayout(new MigLayout("insets 0 0 0 0", "fill", "fill"));
long spectralBandwidth = mTestTuner.getSampleRate();
long spectralBandwidth = mTestTuner.getTunerController().getSampleRate();
long halfSpectralBandwidth = spectralBandwidth / 2;
int channelToLog = -1;
@@ -248,7 +250,7 @@ public class ChannelizerViewer extends JFrame
public class ChannelPanel extends JPanel implements Listener<ComplexBuffer>, ISourceEventProcessor
{
private PolyphaseChannelSource mSource;
private TunerChannelSource mSource;
private DFTProcessor mDFTProcessor = new DFTProcessor(SampleType.COMPLEX);
private ComplexDecibelConverter mComplexDecibelConverter = new ComplexDecibelConverter();
private SpectrumPanel mSpectrumPanel;
@@ -268,7 +270,7 @@ public class ChannelizerViewer extends JFrame
mFrequency = frequency;
TunerChannel tunerChannel = new TunerChannel(frequency, bandwidth);
mSource = (PolyphaseChannelSource)mTestTuner.getChannelSource(tunerChannel);
mSource = mTestTuner.getSourceManager().getSource(tunerChannel);
if(mSource != null)
{
@@ -288,7 +290,8 @@ public class ChannelizerViewer extends JFrame
{
mSource.setListener(mDFTProcessor);
}
mSource.start(ThreadPool.SCHEDULED);
mSource.start();
}
else
{
@@ -296,7 +299,7 @@ public class ChannelizerViewer extends JFrame
}
}
public PolyphaseChannelSource getSource()
public TunerChannelSource getSource()
{
return mSource;
}

View File

@@ -25,11 +25,11 @@ import dsp.filter.design.FilterDesignException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sample.Listener;
import sample.complex.IComplexBufferProvider;
import source.Source;
import source.SourceEvent;
import source.SourceException;
import source.tuner.Tuner;
import source.tuner.TunerChannel;
import source.tuner.channel.TunerChannel;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
@@ -42,7 +42,7 @@ public class PolyphaseChannelManager implements Listener<SourceEvent>
private static final int CHANNEL_SAMPLE_RATE = (int)(CHANNEL_BANDWIDTH * CHANNEL_OVERSAMPLING);
private static final int POLYPHASE_FILTER_TAPS_PER_CHANNEL = 17;
private Tuner mTuner;
private IComplexBufferProvider mComplexBufferProvider;
private List<PolyphaseChannelSource> mChannelSources = new CopyOnWriteArrayList<>();
private ChannelCalculator mChannelCalculator;
private ComplexPolyphaseChannelizerM2 mPolyphaseChannelizer;
@@ -57,27 +57,29 @@ public class PolyphaseChannelManager implements Listener<SourceEvent>
* active DDC polyphase channel sources accordingly. This class also monitors source event requests and
* notifications received from active DDC polyphase channel sources to adjust sample streams as required.
*
* @param tuner providing complex sample buffers
* Note: add this channel manager as a source event listener to the complex buffer provider to ensure this manager
* adapts to changes in source frequency and sample rate.
*
* @param complexBufferProvider that supports register/deregister of this channel manager
* @param frequency of the provided complex buffer samples
* @param sampleRate of the provided complex buffer samples
*/
public PolyphaseChannelManager(Tuner tuner)
public PolyphaseChannelManager(IComplexBufferProvider complexBufferProvider, long frequency, int sampleRate)
{
if(tuner == null)
if(complexBufferProvider == null)
{
throw new IllegalArgumentException("Tuner argument cannot be null");
throw new IllegalArgumentException("Complex buffer provider argument cannot be null");
}
mTuner = tuner;
mComplexBufferProvider = complexBufferProvider;
int sampleRate = mTuner.getTunerController().getSampleRate();
//Ensure that tuner sample rate is a multiple of channel sample rate since polyphase channelizer is M2
//Ensure that sample rate is a multiple of channel sample rate since polyphase channelizer is M2
if(sampleRate % (CHANNEL_SAMPLE_RATE) != 0)
{
throw new IllegalArgumentException("Tuner sample rate [" + sampleRate + "] must be an even multiple of " +
CHANNEL_SAMPLE_RATE + " Hz");
}
long frequency = mTuner.getTunerController().getFrequency();
int channelCount = sampleRate / CHANNEL_BANDWIDTH;
mChannelCalculator = new ChannelCalculator(sampleRate, channelCount, frequency, CHANNEL_OVERSAMPLING);
@@ -85,9 +87,6 @@ public class PolyphaseChannelManager implements Listener<SourceEvent>
mBufferProcessor = new ScheduledBufferProcessor(500, 100, 50, 50);
updateChannelizer(sampleRate, null);
mTuner.addSourceEventListener(this);
}
/**
@@ -159,7 +158,7 @@ public class PolyphaseChannelManager implements Listener<SourceEvent>
if(mPolyphaseChannelizer.getRegisteredChannelCount() == 1)
{
mTuner.addListener(mBufferProcessor);
mComplexBufferProvider.addComplexBufferListener(mBufferProcessor);
mBufferProcessor.start();
}
}
@@ -179,7 +178,7 @@ public class PolyphaseChannelManager implements Listener<SourceEvent>
if(mPolyphaseChannelizer.getRegisteredChannelCount() == 0)
{
mTuner.removeListener(mBufferProcessor);
mComplexBufferProvider.removeComplexBufferListener(mBufferProcessor);
mBufferProcessor.stop();
}
}

View File

@@ -18,7 +18,7 @@
******************************************************************************/
package dsp.filter.channelizer;
import channel.heartbeat.Heartbeat;
import source.heartbeat.Heartbeat;
import dsp.filter.channelizer.output.IPolyphaseChannelOutputProcessor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -27,12 +27,10 @@ import sample.complex.ComplexBuffer;
import sample.complex.ComplexToComplexBufferAssembler;
import source.ComplexSource;
import source.ISourceEventProcessor;
import source.Source;
import source.SourceEvent;
import source.SourceException;
import source.tuner.TunerChannel;
import source.tuner.channel.TunerChannel;
import java.util.Arrays;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;