An apparatus, comprising: a first communication device including a plurality of antennas and configured to access a codebook of unitary matrices that is also accessible by a second communication device; and a processor operatively coupled to the first communication device, the processor configured to: generate a plurality of symbols based on an incoming data; decompose each unitary matrix from a plurality of unitary matrices of the codebook of unitary matrices into an associated plurality of layers, for each unitary matrix from the plurality of unitary matrices, each layer from the plurality of layers associated with that unitary matrix including a permutation and a primitive transformation matrix; apply, to each symbol from the plurality of symbols, at least one layer from an associated unitary matrix from the plurality of unitary matrices, to generate a plurality of transformed symbols; apply, to each transformed symbol from the plurality of transformed symbols, a precode matrix selected from the codebook of unitary matrices, to produce a plurality of precoded symbols; and send a signal to cause transmission, to the second communication device, of a plurality of signals, each signal from the plurality of signals representing a precoded symbol from the plurality of precoded symbols, each signal from the plurality of signals transmitted using a unique antenna from the plurality of antennas. a first communication device including a plurality of antennas and configured to access a codebook of unitary matrices that is also accessible by a second communication device; and a processor operatively coupled to the first communication device, the processor configured to: generate a plurality of symbols based on an incoming data; decompose each unitary matrix from a plurality of unitary matrices of the codebook of unitary matrices into an associated plurality of layers, for each unitary matrix from the plurality of unitary matrices, each layer from the plurality of layers associated with that unitary matrix including a permutation and a primitive transformation matrix; apply, to each symbol from the plurality of symbols, at least one layer from an associated unitary matrix from the plurality of unitary matrices, to generate a plurality of transformed symbols; apply, to each transformed symbol from the plurality of transformed symbols, a precode matrix selected from the codebook of unitary matrices, to produce a plurality of precoded symbols; and send a signal to cause transmission, to the second communication device, of a plurality of signals, each signal from the plurality of signals representing a precoded symbol from the plurality of precoded symbols, each signal from the plurality of signals transmitted using a unique antenna from the plurality of antennas. generate a plurality of symbols based on an incoming data; decompose each unitary matrix from a plurality of unitary matrices of the codebook of unitary matrices into an associated plurality of layers, for each unitary matrix from the plurality of unitary matrices, each layer from the plurality of layers associated with that unitary matrix including a permutation and a primitive transformation matrix; apply, to each symbol from the plurality of symbols, at least one layer from an associated unitary matrix from the plurality of unitary matrices, to generate a plurality of transformed symbols; apply, to each transformed symbol from the plurality of transformed symbols, a precode matrix selected from the codebook of unitary matrices, to produce a plurality of precoded symbols; and send a signal to cause transmission, to the second communication device, of a plurality of signals, each signal from the plurality of signals representing a precoded symbol from the plurality of precoded symbols, each signal from the plurality of signals transmitted using a unique antenna from the plurality of antennas.