|
|
|
Error Correction Code Final Project
|
|
|
|
|
|
|
|
|
|
|
|
Reed Solomon Program Design
|
|
|
|
=============================
|
|
|
|
在撰寫程式碼的時候,為了要讓程式碼能夠簡潔乾淨。我使用了大量的物件導技巧向來實作這份作業所需要的功能。如GF(64), Polynomial都被我包裝成可支援四則運算的c++ class。實作RS decoder的時候,要比較注意的地方是收到的訊號萬一沒有erasure,σ0(x)=1而不是0,而且當erasure超過R=21的時候,不管有多少的error,σ1(x)都是等於一,所以要提早寫判斷式去早期偵測出這種狀況。
|
|
|
|
|
|
|
|
在解碼上是採用time_domain_completion的演算法來計算error pattern,只要實作講義上寫好的Euclid Algorithm,就可以直接算出需要的σ1(x),及ω(x)。當初在計算Error pattern的時候,我一度誤以為ω(x) = rj(x) / rj(0)。所以解碼出來的codeword總是會有固定的差距,查了許久才發覺到那邊應該要是ω(x) = rj(x) / νj(0)
|
|
|
|
|
|
|
|
|
|
|
|
![bit_error_rate](/uploads/d87fbc484f3dc5c35c48e4c24318f2f5/bit_error_rate.png)
|
|
|
|
上圖為Bit Error Rate的比較圖
|
|
|
|
|
|
|
|
|
|
|
|
部份程式碼,這是測試在GF64 space的物件是否能正常運作。
|
|
|
|
```cpp
|
|
|
|
bool GF64::test()
|
|
|
|
{
|
|
|
|
bool a = (GF64(35) + GF64(2) == GF64(33));
|
|
|
|
bool b = (GF64(51) - GF64(17) == GF64(34));
|
|
|
|
bool c = (GF64(53) * GF64(48) == GF64(9));
|
|
|
|
bool d = (GF64(42) * GF64(17) == GF64(20));
|
|
|
|
bool e = (GF64(8) / GF64(34) == GF64(29));
|
|
|
|
bool f = (GF64(63) / GF64(31) == GF64(4));
|
|
|
|
bool plus = a & b;
|
|
|
|
bool mul = c & d;
|
|
|
|
bool div = e & f;
|
|
|
|
// 如果那六個等式都成立,則回傳 true
|
|
|
|
return plus & mul & div;
|
|
|
|
}
|
|
|
|
``` |