簡體   English   中英

實現 CRC 算法

[英]Implementing a CRC algorithm

我正在嘗試實現某些視頻接口標准中定義的 CRC 算法:

原始數據是 10 位字,被壓縮成 8 位字節,我在 numpy 中提取和使用這些字節沒有問題。

CRC 具有多項式:

CRC(X) = X^18 + X^5 + X^4 + 1

我相信這給了我一個常數:

POLY = 0x40031

我嘗試了幾種不同的實現,但我生成的任何內容都與我的示例數據不匹配。 這個實現的靈感來自這個

MASK = 0x3FFFF
class MYCRC:
    crc_table = []
    def __init__(self):
        if not self.crc_table:
            for i in range(1024):
                k = i
                for j in range(10):
                    if k & 1:
                        k ^= POLY
                    k >>= 1
                self.crc_table.append(k)

    def calc(self, crc, data):
        crc ^= MASK
        for d in data:
            crc = (crc >> 10) ^ self.crc_table[(crc & 0x3FF) ^ d]
        return crc ^ MASK

然后是我從某個地方提取的這個實現(不確定在哪里)

def crc_calc(crc, p):
    crc = MASK & ~crc
    for i in range(len(p)):
        crc = (crc ^ p[i]) # & BIG_MASK
        for j in range(10):
            crc = ((crc >> 1) ^ (POLY & -(crc & 1))) # & BIG_MASK
    return MASK & ~crc

我還研究了使用這個支持使用自定義多項式的庫,但它似乎是為使用 8 位數據而不是我擁有的 10 位數據而構建的。

我不確定如何最好地共享測試數據,因為我只有整個幀,如果導出為 numpy 文件約為 5MB。 我也不清楚我應該提供給 CRC 計算的數據范圍。 我認為從閱讀它開始,它應該是從一行上的第一個活動樣本開始,一直到之后行的行數,然后是在該范圍內計算的校驗和。 從硬件的角度來看,這是最有意義的,但標准對我來說並沒有清楚地理解。

編輯:包含 10 行測試數據的pastebin ,其中包括嵌入式校驗和。 在一行數據中,樣本0-7是EAV標記,8-11是行號,12-16是兩個校驗和。 數據是兩個交錯的視頻數據流(亮度通道和 CbCr 通道)。 標准 state 校驗和從第一個活動樣本運行到行數據的末尾,我解釋為它從一行的樣本 740 運行到下一行的樣本 11。

根據 SMPTE292M 的第 5 節,數據是 10 位數據,不能 go 低於 0x3 或高於 0x3FC。 根據表 4,CRC 的結果應該是 18 位,它們被拆分並作為兩個字嵌入到 stream 中(一個位用非另一個位填充)請注意,每個數據通道都有一個校驗和,這些每行有兩個校驗和在 12-16

編輯 2一些更長的測試數據,跨越從空白數據到活動幀數據的跳躍

CRC計算必須反映。 (表 9 注釋中的線索:“注意 – CRC0 是錯誤檢測碼的 MSB。”)

此 C 例程正確檢查示例中的 CRC:

// Update the CRC-18 crc with the low ten bits of word.
// Polynomial = 1000000000000110001
// Reflected (dropping x^18) = 10 0011 0000 0000 0000 = 0x23000
unsigned crc18(unsigned crc, unsigned word) {
    crc ^= word & 0x3ff;
    for (int k = 0; k < 10; k++)
        crc = crc & 1 ? (crc >> 1) ^ 0x23000 : crc >> 1;
    return crc;
}

實際上,檢查的跨度是從活動行的開頭到行號,直到 stream 中的兩個 CRC 之前。 該計算與這兩個 CRC 匹配。 每個 CRC 都是根據 stream 中的交替字計算的。 CRC 被初始化為零。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM