1 : A method of processing data received over a channel, the method comprising, at a controller of a decoder: receiving data representing probabilities associated with a plurality of variables of a candidate codeword; receiving a parity check matrix associated with a factor graph and corresponding to a codebook, the codebook comprising a plurality of valid codewords, the factor graph comprising variable nodes, check nodes and edges connecting variable and check nodes; calculating initial messages to be sent from variable nodes to associated check nodes based on the received data; and iteratively exchanging messages between variable nodes and check nodes by iterating the following steps: sending messages from the variable nodes to associated check nodes; sending messages from the check nodes to associated variable nodes based on messages received at the check nodes; and after each exchange of messages between the variable nodes and check nodes: calculating messages based on messages received at the variable nodes; and calculating permuted messages to be sent from the variable nodes in the next iteration by applying a permutation to the calculated messages, wherein the permutation is of a set of permutations which map each codeword of the set of codewords onto a different codeword of the set of codewords.