samples prior to interpolation.
Resolves issue with using incorrect quadrature index when pulling a
sample from the interpolating buffer.
Resolves issue where the instrumented version of the interpolating
buffer was being constructed in the non-interpolated decoder component.
was not computationally feasible with my 3rd Gen i7 processor running
and airspy at 10 MHz. Restructured the polyphase channelizer to use
vector iteration structures that the JDK 9 JIT compiler can translate
into SIMD instructions. Separated the IFFT processing from the filter
process so that they can be executed on separate threads and this allows
the processing to occur real time.
P25 C4FM decoding at 25 kHz channel sample rate using an airspy
10MHz sample stream seems to be working nicely with ~25% CPU usage and
~300 to 500 MB memory usage. Incremental (parallel) channel decoding
should have a minimal increase in CPU loading since all of the 12.5 kHz
channels are available in the polyphase channelizer and the only
additional workload is the decoding of the 25 kHz sample stream.
There is still an issue with stopping channels and the channelizer keeps
processing, and occasionally when starting traffic channels something
deadlocks and causes out of memory.
adds Feed forward gain support to the C4FM DQPSK demodulator which seems
to improve output from the interpolating sample buffer at each symbol
period. Updates the symbol timing gain for C4FM to decrease the gain a
bit since the feed forward gain is providing a better interpolated symbol.
updates the LSM decoder to follow the same design pattern. Adds LSM
decoder support to the demodulator viewer application. The current
symbol timing gain for LSM is set too high -- is using the C4FM gain
and causes too much fluctuation in the timing error.
error calculator. After increasing the gain for symbol timing, this
new symbol evaluator class seems to track the signal very accurately
despite lots of noise and ISI.
timing error calculation with symbol decision. In the process of
changing over to this new class and remove the previous implementations
for the 3 values. This commit includes the partial implementation
so I can access from another dev machine.
based on the P25 LSM decoder using a costas loop and a gardner detector.
Updates the Demodulator Viewer FX application to add in a symbol chart
and a phase error chart. The decoder won't lock on yet ... still a wip.
ordering to each channel configuration to provide the user with greater
control over initial application startup configuration.
Adds new dialog window that displays on startup that allows the user to
invoke/cancel auto-start, or simply allow the timer to expire whereby
the channels will be auto-started.
Updates channel table model to include an auto-start column and relabels
the 'Enabled' column to read 'Playing'.
Updates channel editor to change the 'Enable/Disable' button to read
'Start/Stop'.
Changes the 'enabled' property of the channel configuration to indicate
the current 'processing' status - isProcessing().
Channel's XML configuration re-purposes the 'enabled' property to indicate
auto-start and adds a new (optional) auto-start 'order' attribute.
so that on startup, the application attempts to source the channel from
the preferred tuner.
If the tuner is currently not available, or if the tuner cannot source
the channel, then the next available tuner is selected.
when the tuner controller indicates that there is a center DC spike
blocked region or when the tuner has clipped outer spectral regions
resulting in less than 100% usable bandwidth.
produces a significant reduction in memory usage, especially for tuners
like the airspy and hackrf that produce 10/20 MSPS sample rates. This
is observed to be around 66% reduction in peak memory usage and provides
a more stable memory utilization across time reducing stress on the
garbage collector.
Use of these reusable memory buffers will be pushed further down into
the processing chain modules to ensure we keep new object creation
to the lowest levels possible.
ChannelizerViewer so that we can compare the two-channel synthesis
operations. The SynthesizerViewer is successfully down-sampling and
synthesizing two 25.0 kHz channels into a combined 25.0 kHz channel with
no noticeable drop/nulling in the joined region. However, the channelizer
viewer's synthesized channels definitely have a null in the joined
region. I suspect that the channelizer is not quite where it needs to
be and am going to start experimenting there.
and translating it by -FS/4 to correctly center the synthesized channel.
The low-pass filter is currently disabled to better troubleshoot/view the
state of the synthesized channel. It appears that the synthesizer is
not correctly joining the channel ... instead of down-sampling and then
synthesizing the two channels, it appears to be synthesizing and then
down-sampling. The synthesized channel has a null in the middle which
would render it unusable.