Files
data-over-audio/HammingEncoding.js
2024-05-10 04:42:51 -04:00

53 lines
1.3 KiB
JavaScript

// Encoding to encode/decode data with Hamming Error Correction
export const DECODED_SIZE = 4;
export const ENCODED_SIZE = 7;
export const blockSize = () => ({
encoded: ENCODED_SIZE,
decoded: DECODED_SIZE
});
export const encode = (bits) => {
const encodedBits = [];
for(let i = 0; i < bits.length; i+= DECODED_SIZE) {
const block = bits.slice(i, i + DECODED_SIZE);
encodedBits.push(...encodeBlock(block));
}
return encodedBits;
}
export const decode = bits => {
const decodedBits = [];
for(let i = 0; i < bits.length; i += ENCODED_SIZE) {
const block = bits.slice(i, i + ENCODED_SIZE);
decodedBits.push(...decodeBlock(block));
}
return decodedBits;
}
const encodeBlock = bits => {
if(bits.length !== DECODED_SIZE) return [];
return [
bits[0] ^ bits[1] ^ bits[3],
bits[0] ^ bits[2] ^ bits[3],
bits[0],
bits[1] ^ bits[2] ^ bits[3],
bits[1],
bits[2],
bits[3]
]
}
const decodeBlock = bits => {
if(bits.length !== ENCODED_SIZE) return [];
const error_1 = bits[0] ^ bits[2] ^ bits[4] ^ bits[6];
const error_2 = bits[1] ^ bits[2] ^ bits[5] ^ bits[6];
const error_3 = bits[3] ^ bits[4] ^ bits[5] ^ bits[6];
let error = (error_3 << 2) | (error_2 << 1) | error_1;
if(error !== 0) bits[error - 1] ^= 1;
return [
bits[2],
bits[4],
bits[5],
bits[6]
];
}