A device for transmitting data, the device comprising: a processor; a memory, storing instructions, which when executed by the processor, causes the processor to perform the steps of: receiving a bitstream encoded with an error correction code for transmission; determining a plurality of symbols based upon values in the bitstream, each symbol corresponding to one or more bits of the bitstream; selecting two or more of the plurality of symbols corresponding to the bitstream such that a measure of spread of the selected symbols meets a threshold, the threshold being based on properties of the error correction code, based on the hardware of a receiver and how fast the receiver can correct error correction code errors, or based on the type of data transmitted, wherein the measure of spread comprises a minimum distance between respective selected symbols, an average distance between respective selected symbols, or a variance of the selected symbols in the bitstream; intentionally introducing an error in the bitstream by changing values of each of the selected symbols to a different value chosen based upon an optimization goal that improves a communication metric relative to the communication metric prior to changing the values of each of the selected symbols; and transmitting the plurality of symbols with the changed values to the receiver over a communication network. a processor; a memory, storing instructions, which when executed by the processor, causes the processor to perform the steps of: receiving a bitstream encoded with an error correction code for transmission; determining a plurality of symbols based upon values in the bitstream, each symbol corresponding to one or more bits of the bitstream; selecting two or more of the plurality of symbols corresponding to the bitstream such that a measure of spread of the selected symbols meets a threshold, the threshold being based on properties of the error correction code, based on the hardware of a receiver and how fast the receiver can correct error correction code errors, or based on the type of data transmitted, wherein the measure of spread comprises a minimum distance between respective selected symbols, an average distance between respective selected symbols, or a variance of the selected symbols in the bitstream; intentionally introducing an error in the bitstream by changing values of each of the selected symbols to a different value chosen based upon an optimization goal that improves a communication metric relative to the communication metric prior to changing the values of each of the selected symbols; and transmitting the plurality of symbols with the changed values to the receiver over a communication network. receiving a bitstream encoded with an error correction code for transmission; determining a plurality of symbols based upon values in the bitstream, each symbol corresponding to one or more bits of the bitstream; selecting two or more of the plurality of symbols corresponding to the bitstream such that a measure of spread of the selected symbols meets a threshold, the threshold being based on properties of the error correction code, based on the hardware of a receiver and how fast the receiver can correct error correction code errors, or based on the type of data transmitted, wherein the measure of spread comprises a minimum distance between respective selected symbols, an average distance between respective selected symbols, or a variance of the selected symbols in the bitstream; intentionally introducing an error in the bitstream by changing values of each of the selected symbols to a different value chosen based upon an optimization goal that improves a communication metric relative to the communication metric prior to changing the values of each of the selected symbols; and transmitting the plurality of symbols with the changed values to the receiver over a communication network.