mirror of
https://github.com/lewismoten/data-over-audio.git
synced 2026-02-01 15:55:50 +08:00
wip: big refactor
This commit is contained in:
53
HammingEncoding.js
Normal file
53
HammingEncoding.js
Normal file
@@ -0,0 +1,53 @@
|
||||
// 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]
|
||||
];
|
||||
}
|
||||
Reference in New Issue
Block a user