The waterfall file has now a constant sized header of 52 bytes,
so that plotting tools can reconstruct properly the spectrum.
The structure of the header is the following:
- A 32 byte string containing the timestamp in
ISO-8601 format. This timer has microsecond accuracy.
- A 4 byte integer containing the sampling rate
- A 4 byte integer with the FFT size
- A 4 byte integer containing the number of FFT snapshots for one row
at the waterfall
- A 4 byte float with the center frequency of the observation.
- A 4 byte integer indicating the endianness of the rest of the file. If
set to 0 the file continues in Big endian. Otherwise, in little endian.
The change of the endianness is performed to reduce the overhead at the
station.
Note that all contents of the header are in Network Byte order! The rest
of the file is in native byte order, mainly for performance reasons.
Users can use data of the header to determine if their architecture match
the architecture of the host generated the waterfall file and act
accordingly.
The file continues with information regarding the spectral content of the
observation.
Each waterfall line is prepended with a int64_t field indicating the
absolute time in microseconds with respect to the start of the waterfall
data (stored in the corresponding header field).
The spectral content is stored in $FFT$ float values already converted in
dB scale.
In case of scrambling the self synchronizing scrambler ensures
that enough repetitions of the AX.25 flag have been received.
However, this does not hold for the case of non scrambled
transmissions. In this case, we wait for at least two consecutive
AX.25 flags to reduce the false alarms. Experiments have shown
that due to the poor CRC there were many false positive frames.
It is expected however, to miss some transmissions that use only one
AX.25 flag.
Add a IEEE 802.15.4 like decoder, which supports
the IEEE 802.15.4 standard but also a large variety
of ICs based on this framing scheme. Such framings
are quite common in many Cubesat missions.
The decoder has been tested an works well with at least
the Reaktor Hello World satellite
* Removed obsolete blocks
* Created a new CRC class with static methods. This will make easier the
integration of new CRC schemes. The old way was rather too C-styled
* Blocks removed are now covered from decoders available supporting the
new decoder architecture
* The quadrature demodulation filter block, had as primary goal to
reduce the false alarms and the performance of the DUV decoder. Now the
new DUV decoder, uses a shift register approach, likewise the AX.25
decoder, therefore it is not needed anymore.
TODO:
* Use the shift register likewise the AX.25 to get rid off the
quadrature demodulation filter. This will significantly increase the
number of decoded frames
The decoders produce a PMT message containing several information about
the decoded frame. While this is very convenient for handling data
inside the flowgraph, it is not for third party applications. The JSON
converter block is responsible to serialize all the information
contained in a PMT originating from a decoded frame.
For simple demonstration some metadata were added on the AX.25 decoder.
These metadata are still a WIP and they subjected to changes.
To simplify the logic and allow an easy and more efficient way to add
new decoders, the new architecture uses only one decoder block.
This block takes as input a void* stream and produces PDUs with their
metadata. To do so, the block accepts a decoder object. Every decoder
should implement the virtual class decoder(). This class provides the
necessary API and an arbitrary number of decoders can be supported. The
decoding status is reported to the frame_decoder block through the
decoder_status_t structure.
This commits introduces a significant redesign of the AX.25 decoding
block. Due to the poor AX.25 sync flag, the decoders exhibited too many
false alarms. To deal with this problem, we introduced the quadrature
demod filter block, that tried to measure the SNR based on the running
variance of the signal. The problem with that was that the user should
have to fine tune two parameters, the one related with the amplitude of
the incoming signal and the second one related with the window that the
calculations should take place. This solution worked until now, but we
can always increase the performance.
The new AX.25 decoder stores the bitstream in a queue and always tries
to exlpoit possible valid frames in the queue. If now sync flags have
been encountered, the queue is flushed. After a valid frame extraction,
bits corresponding to this frame are also deleted from the queue.
This technique requires more memory and CPU, but it increases a lot the
decoding performance.
* Introduce the hysteresis option, in order the CW demodulator to adjust
properly the plateau length based on the WPM and any filtering that can
be used before
* Instead for a frame per word, now the CW decoder waits for 10 long
spaces before it commits a frame. With this way many words are placed on
the same frame telemetry decoding is easier
std::bitset can be used only with compile time known size. Most of the flowgraphs take the shift register size as a parameter through the GRC so it cannot be used. This commit implements a shift register using the std::deque that supports arbitrary number of memory stages
Seems that there is a probleb with general blocks and the history, so
the filter cannot act as valve. However, it produces zeros, in the
presence of noise.
This is an attempt to cut the signal free period after the quadrature
demodulation block. The idea seems that works, but there still an issue
with the samples not passing correctly from the valve.
The CW encoder is a debug block that can be used to check the
performance of the CW decoder of gr-satnogs module under different RF
conditions. It can also serve as a perfect debug tool for sattelite
missions.