I kicked the can down the road with Matt E. and Tom R… We have
spent two weeks on this total and others are welcome to contribute. We
need to have the argument: How do we specify the constellations? How do
we map carrier usage (which are pilots, clocks, etc.)?
To open a discussion on that topic, here is my first proposition:
We create a generic OFDM mapper block. It should treat every occupied
carrier as a proper channel. I think of something like:
gr_make_io_signature (nchannels, nchannels, sizeof(unsigned char))
The input streams are unpacked bytes, containing 1 to 8 bits. In front
of the mapper, connect several packed_to_unpacked blocks and some
stream_to_streams. A parameter to the mapper block is a channel list
that assigns a modulation type to every subchannel.
The mapper’s task is, in this model, to map chunks to symbols
independently for each subchannel. Additionally, it periodically outputs
known symbols that help synchronisation in the receiver(s).
Maybe a new packed_to_unpacked block can be created that fulfills two
tasks; to unpack and to split the input. I think of a block taking a
packed byte stream as input and outputting several unpacked byte streams
with different pack-sizes per output stream.
In the receiver, we do the inverse thing. Information exchange
transmitter <-> receiver could be done through a network (for a testing
By this, we can benefit of the OFDM’s main advantage - to use the
optimal modulation to every subchannel. In the background, there can be
a control application that evaluates SNRs, receives them from the
clients (for first try: through network) and assigns modulation etc.
We can also insert pilot channels - simply connect a “pilot block” to a
subchannel input. This may help on synchronization and channel
And it allows a new use case: 1 to N transmission, with one transmitter
and several receivers.
This system will allow to evaluate new algorithms for subcarrier
assignment, channel estimation, synchronization etc.