產(chǎn)品設(shè)計(jì)原理:在小尺寸DSP上實(shí) 2D條形碼解碼
條形碼一般被用于將關(guān)鍵的字母數(shù)字信息轉(zhuǎn)換為數(shù)字系統(tǒng)能夠掃描和讀取的符號(hào)信息,而無(wú)需每次都要將信息錄入數(shù)字系統(tǒng)。
本文引用地址:http://butianyuan.cn/article/257815.htm 1D(一維)條形碼只能對(duì)數(shù)字?jǐn)?shù)據(jù)進(jìn)行編碼,在過(guò)去二十年中主要用于產(chǎn)品運(yùn)輸和追蹤、系統(tǒng)安全、超市等場(chǎng)合。使用 2D(二維)條形碼,數(shù)據(jù)在水平和垂直方向被編碼為 2D 符號(hào),如下圖 1 所示。
2D 符號(hào)所能包含的數(shù)據(jù)量遠(yuǎn)大于 1D 符號(hào)。2D 條形碼解決方案可比傳統(tǒng) 1D 條形碼提供更大的信息密度,特別是對(duì)于那些需要對(duì)精密信息而不是簡(jiǎn)單的碼信息進(jìn)行編碼的應(yīng)用。
2D 條形碼技術(shù)的一些應(yīng)用包括產(chǎn)品標(biāo)簽、產(chǎn)品信息追蹤和檢驗(yàn)、移動(dòng)安全、出入境檢查服務(wù)、醫(yī)療保健和電子商務(wù)等。
圖 1:2D 條形碼示例
如今存在很多 2D 條形碼算法,這催生出采用不同條形碼技術(shù)的一系列應(yīng)用。一般來(lái)說(shuō),有兩種類型的 2D 條形碼:1) 堆疊式 2D 條形碼,例如 PDF417 和 Code 49,2) 矩陣式條形碼,例如 QR 碼和數(shù)據(jù)矩陣。在這篇文章中,我們僅限于討論數(shù)據(jù)矩陣式條形碼技術(shù)[2]。
2D 數(shù)據(jù)矩陣式條形碼技術(shù)
2D 數(shù)據(jù)矩陣式條形碼包括在正方形或長(zhǎng)方形中排列的黑色和白色模塊,如圖 1 所示。編碼數(shù)據(jù)位映射到黑色和白色模塊(或單元)組成的區(qū)域,稱為數(shù)據(jù)區(qū)域。關(guān)于 2D 數(shù)據(jù)矩陣式條形碼所支持的不同類型的編碼方案的詳細(xì)信息,請(qǐng)參見(jiàn)參考文獻(xiàn)[2]。
數(shù)據(jù)區(qū)域由定位圖形包圍(定位圖形的底部和左側(cè)只包含黑色模塊,而定位圖形的上部和右側(cè)由交替的白色和黑色模塊組成)。數(shù)據(jù)矩陣 2D 條形碼支持由排位圖形分隔的多個(gè)數(shù)據(jù)區(qū)域,從而能容納更多數(shù)據(jù)信息。
有兩種版本的數(shù)據(jù)矩陣,一種是基于循環(huán)冗余校驗(yàn)(CRC)和卷積糾錯(cuò),另一種是基于里德所羅門(mén)(RS)糾錯(cuò)。對(duì)于掃描、讀取和提取數(shù)據(jù)位,基于 CRC 與基于 RS 的數(shù)據(jù)矩陣解碼沒(méi)有區(qū)別。提取數(shù)據(jù)位之后,基于 CRC 的解碼與基于 RS 的解碼路徑不同,因?yàn)樗鼈兊慕豢椇图m錯(cuò)方法不同。
圖 2:2D 條形碼掃描器框圖和 DSP 處理內(nèi)核
這里我們考慮在小尺寸 Blackfin 處理器上對(duì)新興的基于 RS 碼的 2D 數(shù)據(jù)矩陣式條形碼進(jìn)行解碼。通過(guò) PPI-DMA 通道連接到 DSP 處理器的 2D 條形碼掃描器的框圖如上面圖 2 所示。
在小尺寸 DSP 上實(shí)現(xiàn)條形碼
傳感器對(duì)條形碼進(jìn)行掃描并將像素?cái)?shù)據(jù)通過(guò)并行端口接口(PPI)傳輸給 DSP。之后,DSP 處理器處理圖像像素并提取數(shù)據(jù)區(qū)域中黑色和白色模塊對(duì)應(yīng)的數(shù)據(jù)位,然后進(jìn)行糾錯(cuò)。從掃描的 2D 條形碼的特定數(shù)據(jù)區(qū)域提取數(shù)據(jù)位的過(guò)程如下面圖 3 所示的流程圖。
圖 3:從 2D 數(shù)據(jù)矩陣符號(hào)提取數(shù)據(jù)位的流程圖
我們將 2D 數(shù)據(jù)矩陣式條形碼看做大小為 M x N 的圖像(通常是 QVGA 或 VGA 圖像)并進(jìn)行處理。相機(jī)的 CMOS 傳感器捕獲圖像并將圖像像素傳輸給 DSP 進(jìn)行處理。
現(xiàn)在的問(wèn)題是,需要多大的存儲(chǔ)器來(lái)保存處理過(guò)程中的圖像?例如,以 VGA(即 640x480)為例,我們需要大約 300 kB 的數(shù)據(jù)存儲(chǔ)器來(lái)保存捕獲到的圖像。處理器內(nèi)核的尺寸取決于其包含的存儲(chǔ)器的數(shù)量。
特別是 L1 高速存儲(chǔ)器,它占用更多的硅面積,總成本也更高。因此,大多數(shù)處理器包含非常有限的 L1 存儲(chǔ)器。
另一方面,L2 或 L3 存儲(chǔ)器通常有較大的容量,占用較小的面積,成本也較低。然而,它們速度較慢,需要通過(guò) DMA 與處理器的工作存儲(chǔ)器(L1)進(jìn)行數(shù)據(jù)傳輸。
接下來(lái)我們將討論用 Blackfin 系列的兩款不同處理器實(shí)現(xiàn)數(shù)據(jù)矩陣 2D 條形碼在,其中一款具有 16 kB 的 L1 和較大 L2/L3 存儲(chǔ)器,另一款只有 16 kB 的 L1 存儲(chǔ)器。
對(duì)于帶有 L2 和 L3 存儲(chǔ)器的處理器,捕獲的圖像通過(guò) DMA 和 PPI 接口傳輸?shù)?L2 存儲(chǔ)器。然后通過(guò)將少量圖像像素同時(shí)從 L2 移動(dòng)到 L1 存儲(chǔ)器,來(lái)對(duì) 2D 條形碼中提取的數(shù)據(jù)位進(jìn)行處理。在這種情況下,我們使用另一個(gè) DMA 進(jìn)行 L1 和 L2 之間的數(shù)據(jù)傳輸,整體解碼很簡(jiǎn)單也不復(fù)雜。
在另一方面,如果僅有少量的 L1 存儲(chǔ)器,并且沒(méi)有 L2/L3 存儲(chǔ)器,那么問(wèn)題就相當(dāng)棘手。在這種情況下,我們對(duì)同樣的條形碼要進(jìn)行更多的掃描,并將目標(biāo)區(qū)域(ROI)通過(guò)適當(dāng)設(shè)置的 PPI-DMA 通道傳輸?shù)?L1 存儲(chǔ)器進(jìn)行處理。
雖然這個(gè)系統(tǒng)設(shè)置起來(lái)很復(fù)雜,但其成本和尺寸與前一個(gè)例子相比要小。接下來(lái),我們將討論使用上面提到的兩個(gè)處理器實(shí)例對(duì) 2D 數(shù)據(jù)矩陣式條形碼進(jìn)行解碼的技術(shù)。
用 L2 存儲(chǔ)器實(shí)施
在這種情況下,經(jīng)掃描的所有圖像通過(guò) PPI-DMA 通道被讀入 L2 存儲(chǔ)器,采用另一個(gè)存儲(chǔ)器 DMA 通過(guò)訪問(wèn) L2 中的部分圖像對(duì)其進(jìn)行處理。如下圖 4(a)所示。
圖 4:用小尺寸 Blackfin 處理器進(jìn)行 2D 條形碼解碼,
(a)具有 L2/L3 和 L1 存儲(chǔ)器,(b)僅有 L1 存儲(chǔ)器。
采用 OmniVision CMOS VGA 傳感器[3],我們逐行獲得像素?cái)?shù)據(jù)和控制信號(hào)、HREF(水平基準(zhǔn)輸出)、VSYNC(垂直同步輸出)和 PCLK(像素時(shí)鐘輸出)。PPI-DMA 通道以 27 MHz 時(shí)鐘速率將像素讀入 L2 存儲(chǔ)器。在這種情況下,DMA 設(shè)置很簡(jiǎn)單,因?yàn)槲覀冊(cè)趩未螔呙柚凶x取整個(gè)圖像。
我們基本上遵循上面圖 3 所示的流程圖來(lái)從數(shù)據(jù)矩陣式條形碼模塊中提取數(shù)據(jù)位。如果在掃描的圖像中存在任何方向,我們能夠糾正方向和偏差,因?yàn)槲覀冊(cè)?L2 存儲(chǔ)器中有全部圖像。
現(xiàn)在,我們假設(shè)圖像被正確掃描,沒(méi)有任何方向和偏差。首先,我們將數(shù)據(jù)矩陣式條形碼定位圖形的頂部幾行和右邊幾列從 L2 移入 L1 存儲(chǔ)器。在測(cè)量定位圖形中模塊的平均高度和寬度后,我們?yōu)槎ㄎ粓D形所有頂部和右邊模塊的中點(diǎn)做標(biāo)記,將中點(diǎn)像素位置的 x 和 y 坐標(biāo)值存入存儲(chǔ)器,留作以后使用。無(wú) L2 或 L3 存儲(chǔ)器無(wú) L2/L3 存儲(chǔ)器時(shí),我們直接將圖像讀入 L1 存儲(chǔ)器。由于 L1 存儲(chǔ)器空間有限,我們一次
直接讀取整個(gè)圖像到 L1 存儲(chǔ)器中。如上圖 4(b)所示。
在這種情況下,進(jìn)行條形碼解碼時(shí)我們要多次掃描圖像。使用 PPI 延遲和 PPI 計(jì)數(shù)寄存器,定位圖形模塊像素的頂部幾行和右邊幾列在一次掃描中被讀入 L1 存儲(chǔ)器。在這種情況下需要更多地 DMA 編程,因?yàn)槲覀冃枰獜膾呙杵鬏敵鰧⑺x的圖像像素通過(guò)PPI-DMA 通道讀入 L1 存儲(chǔ)器。我們找到定位圖形模塊的大小及其中點(diǎn)位置坐標(biāo),并將其存儲(chǔ)起來(lái)為將來(lái)使用。
在圖像有細(xì)微方向或偏離時(shí),我們讀取多行像素來(lái)糾正方向或偏差。這里,我們逐行進(jìn)行圖像處理,因?yàn)槲覀儧](méi)有完整的圖像。從數(shù)據(jù)矩陣式條形碼中提取數(shù)據(jù)位我們遵循下半部分流程圖(如之前圖 3 所示),從數(shù)據(jù)矩陣式條形碼黑色和白色模塊中提取位信息。
這里,我們假設(shè)數(shù)據(jù)矩陣包含有黑色和白色模塊組成的單一數(shù)據(jù)區(qū)域。我們知道,有了定位圖形模塊的中點(diǎn)位置坐標(biāo),我們能很容易地獲得所有模塊中心點(diǎn)作為相交叉的水平線(與左側(cè)定位圖形垂直)。
它也通過(guò)定位圖形右側(cè)模塊的中點(diǎn)位置和垂直線(與定位圖形下邊垂直并通過(guò)定位圖形的上邊模塊的中點(diǎn)位置)。我們不能畫(huà)出所有這些線來(lái)標(biāo)識(shí)交叉點(diǎn),因?yàn)槲覀冊(cè)?L1 存儲(chǔ)器中沒(méi)有完整的圖像。
然而,我們可以通過(guò)一次掃描一行的方式來(lái)獲得交叉點(diǎn)(使用定位圖形右側(cè)模塊中點(diǎn)的 y坐標(biāo)作為行索引),將當(dāng)前行列索引與定位圖形上邊模塊中點(diǎn) x 坐標(biāo)進(jìn)行比較。
如果兩者相同,那么就是交叉點(diǎn),否則我們繼續(xù)掃描這一行。采用這一過(guò)程,我們掃描模塊的交叉點(diǎn),并找到該位置像素的值。
如果像素值大于 128(即淺色),我們將該位解碼為 0,或者如果像素值小于 128,我們將該位解碼為 1。采用同樣的方式,我們能提取數(shù)據(jù)矩陣式條形碼數(shù)據(jù)區(qū)域的所有位。
對(duì)于具有 L2 存儲(chǔ)器的處理器,我們將與定位圖形右側(cè)模塊中點(diǎn) y 坐標(biāo)對(duì)應(yīng)的像素行從 L2移入 L1 存儲(chǔ)器。當(dāng)我們正在處理當(dāng)前像素行時(shí),使用 DMA 來(lái)移動(dòng)下一像素行。但是,在使用無(wú) L2 存儲(chǔ)器的處理器時(shí),我們必須進(jìn)行實(shí)時(shí)數(shù)據(jù)提取。此時(shí),PPI-DMA 將下一行數(shù)據(jù)填入 L1 存儲(chǔ)器,我們必須完成對(duì)當(dāng)前行的處理(進(jìn)行基本的數(shù)據(jù)位提取)。
2D 解交織
據(jù)矩陣式條形碼使用 2D 交織的數(shù)據(jù)位。從數(shù)據(jù)區(qū)域模塊中提取數(shù)據(jù)位后,我們執(zhí)行解交織來(lái)獲得糾錯(cuò)碼字的數(shù)據(jù)位。關(guān)于 2D 數(shù)據(jù)位交織的詳細(xì)信息,請(qǐng)參見(jiàn)參考文獻(xiàn)[2]。
我們用預(yù)計(jì)算查找表來(lái)進(jìn)行解交織。由于數(shù)據(jù)矩陣式條形碼支持不同尺寸的數(shù)據(jù)區(qū)域,因此解交錯(cuò)查找表的大小和表單元也不同。不可能在小尺寸處理器中保存所有尺寸的查找表。然而,如果在預(yù)先給定的應(yīng)用中數(shù)據(jù)矩陣大小是已知的,我們只需要存儲(chǔ)特定解交織查找表。解交織后,數(shù)據(jù)位按字節(jié)格式形成碼字,輸入 RS 解碼器。
條形碼糾錯(cuò)
新興的 ECC-200 型數(shù)據(jù)矩陣式條形碼使用 RS (N, K)碼來(lái)糾正解交織位的錯(cuò)誤和遺漏。RS (N, K)碼可以糾正最多(N-K)/2 個(gè)錯(cuò)誤或者最多(N-K)個(gè)遺漏(如果不存在錯(cuò)誤)。在這個(gè)應(yīng)用中使用的 Galois 域是 GF(28)。對(duì)于不同數(shù)據(jù)區(qū)域大小,數(shù)據(jù)矩陣式條形碼使用不同的 RS 碼字長(zhǎng)度。例如,14x14 大小的數(shù)據(jù)區(qū)域條形碼使用 RS(24, 12)碼來(lái)糾錯(cuò),16x16 大小的數(shù)據(jù)區(qū)域條形碼使用 RS(32, 18)碼。RS 解碼器的復(fù)雜度取決于數(shù)據(jù)區(qū)域的大小。隨著 RS 碼字長(zhǎng)度的增加,存儲(chǔ)器需要存儲(chǔ)的所有 RS 解碼工作緩沖區(qū)也要增加。
為了高效地實(shí)施 RS 解碼器,我們使用查找表來(lái)進(jìn)行 Galois 域計(jì)算。對(duì)所有 RS 碼字長(zhǎng)度進(jìn)行解碼時(shí)使用相同的 Galois 域?qū)?shù)和反對(duì)數(shù)查找表,因此域單元也屬于 GF(28)。我們需要大約 2 kB 的 L1 存儲(chǔ)器來(lái)存儲(chǔ)對(duì)數(shù)和反對(duì)數(shù)查找表。
數(shù)據(jù)矩陣式條形碼解碼復(fù)雜度
2D 條形碼解碼有兩個(gè)部分:1) 圖像處理,2)條形碼解碼。如果捕捉的圖像與解碼區(qū)域沒(méi)有適當(dāng)對(duì)齊,我們可能需要進(jìn)行圖像旋轉(zhuǎn)、偏差糾正等,來(lái)使圖像與解碼區(qū)域?qū)R。
在這種情況下,圖像處理階段的復(fù)雜度比實(shí)際條形碼解碼要大。在這篇文章中,我們假設(shè)圖像與解碼區(qū)域是對(duì)齊的。數(shù)據(jù)矩陣式條形碼的解碼復(fù)雜度(在周期和存儲(chǔ)器方面)取決于數(shù)據(jù)符號(hào)的大小。如果數(shù)據(jù)符號(hào)尺寸較大,每個(gè)符號(hào)中包含多個(gè)較大的數(shù)據(jù)區(qū)域,那么我們需要更多的存儲(chǔ)器來(lái)保存圖像的行像素和 RS 工作緩沖。每單位時(shí)間需要處理的數(shù)據(jù)量也隨著數(shù)據(jù)區(qū)域的尺寸而增加。以每個(gè)數(shù)據(jù)矩陣式條形碼符號(hào)具有 16x16 數(shù)據(jù)區(qū)域的 VGA 圖像為例,我們需要大約 6kB數(shù)據(jù)存儲(chǔ)器和 4kB 的 Blackfin 程序存儲(chǔ)器。BF53x 內(nèi)核上運(yùn)行單個(gè)模塊的近似周期數(shù)如下:
模塊尺寸和數(shù)量:7,200
數(shù)據(jù)位提取: 2,000 個(gè)周期
解交織和封包:600
RS 解碼:7,000 個(gè)周期
本文小結(jié)
本文討論了在小尺寸 Blackfin 處理器上進(jìn)行數(shù)據(jù)矩陣 2D 條形碼解碼。同時(shí)解釋了使用或不使用高延遲 L2 存儲(chǔ)器對(duì) 2D 條形碼進(jìn)行解碼的不同方法。分析了基于 RS 的數(shù)據(jù)矩陣 2D條形碼解碼的復(fù)雜度,并估算了使用 BF53x 處理器對(duì) VGA 圖像中單個(gè) 16x16 數(shù)據(jù)符號(hào)進(jìn)行解碼所需的存儲(chǔ)器和周期數(shù).
評(píng)論