我需要在短消息(100到200位之間)上使用糾錯技術。可用於添加冗餘位的空間受限於20-50%。我將不得不在C/C++中實現編碼和解碼。所以它需要開源或者編程足夠簡單。 (我在過去有一些解碼算法的經驗 - 他們是可怕的!)糾錯碼
任何人都可以建議一個合適的錯誤代碼使用(與相關參數)?
我需要在短消息(100到200位之間)上使用糾錯技術。可用於添加冗餘位的空間受限於20-50%。我將不得不在C/C++中實現編碼和解碼。所以它需要開源或者編程足夠簡單。 (我在過去有一些解碼算法的經驗 - 他們是可怕的!)糾錯碼
任何人都可以建議一個合適的錯誤代碼使用(與相關參數)?
我以前成功地使用過Reed Solomon,即使C API也夠簡單。 –
這看起來完全像我在找的東西。非常感謝。 –
的Reed-Solomon編碼器的形式RS(能力,有效載荷)進行說明。容量始終爲2^SYMBOL-1,其中SYMBOL是每個Reed-Solomon符號中的位數。通常,這個SYMBOL大小是8位(一個正常字節)。它通常可以是3到16位的任何值。對於8位符號,Reed-Solomon編碼器將被命名爲RS(255,PAYLOAD)。
PAYLOAD是非奇偶校驗符號的數量。如果你想要4個奇偶校驗符號,你可以指定RS(255,251)。
爲了有效地糾正數據塊中的錯誤,必須首先將數據打包爲符號(比特組,通常只有8比特字節)。你的目標是嘗試安排(如果可能的話)任何錯誤聚集成儘可能少的符號。例如,如果平均每8位發生一次錯誤,則8位符號將不合適;例如,如果平均每8位發生一次錯誤,那麼8位符號將不合適。幾乎每個符號都會有錯誤!您可能會使用4位符號並使用RS(15,11)編解碼器 - 一次最多可使用11個4位符號,每個塊產生4個奇偶校驗符號。符號大小越小,容量越低(例如SYMBOL大小爲4位,2^4-1 == 15符號CAPACITY)。
但通常情況下,您會使用8位符號。如果你有一個比較現實的錯誤率,例如你的8位符號的10%是錯誤的,那麼你可以使用一個RS(255,205) - 每255個符號Reed-Solomon「碼字」的50個奇偶校驗符號, 205字節的PAYLOAD。這給了我們〜25%的平價,使我們能夠糾正包含高達〜12.5%錯誤的碼字。
使用https://github.com/pjkundert/ezpwd-reed-solomon的C++/ezpwd/RS裏德 - 所羅門API,你會爲指定此:
#include <ezpwd/rs>
...
ezpwd::RS<255,205> rscodec;
放入一個std :: string的數據(它可以處理原始8位二進制數據就好)或一個std ::向量並調用API,將奇偶校驗的50個符號:
std::string data;
// ... fill data with a fixed size block, up to 205 bytes
rscodec.encode(data);
發送的數據,後來,你接收到的數據加上奇偶校驗位後,恢復原始數據(和丟棄50個奇偶符號):
int corrected = rscodec.decode(data);
如果可以恢復數據,則會返回糾正的符號數,如果Reed-Solomon碼字包含太多錯誤,則返回-1。
享受!
感謝您的關懷。這個問題已經兩歲了。從那以後,我使用歐幾里德算法開發了我自己的RS校正器(相比之下編碼器是一個孩子的玩耍)。誠然,這是一個相當痛苦的經歷,因爲這個理論真的是火箭科學,細節上有一個討厭的惡魔。但最終掌握這些奧祕是相當有益的。 –
你期望什麼樣的錯誤?突發數據中連續的較大部分數據是缺陷還是單位翻轉遍佈整個區域?僅僅檢測錯誤就足夠了,還是需要糾正錯誤? –