趙宇飛,張遠哲,姚纓英,樊偉敏
(浙江大學 電氣工程學院,浙江 杭州310027)
本文所述基于條碼掃描器和ATmega16的五線譜識別發(fā)音設備實現(xiàn)了紙質(zhì)五線譜的掃描識別發(fā)音。經(jīng)過實測,該方案的識別準確率很高,且發(fā)音準確。據(jù)了解,目前國內(nèi)還沒有類似成果出現(xiàn),只有國外某所大學從事過類似研究,但其使用的方案與本成果不同。
該設備使用激光條形碼掃描器作為采集設備,將五線譜的光學信號轉(zhuǎn)換為脈沖寬度數(shù)字脈沖信號,利用ATmega16單片機接收方波信號并進行分析比對處理,實現(xiàn)音符的判別,并根據(jù)標準十二平均律確定每個音符對應的聲音頻率,最后用單片機定時器產(chǎn)生相應頻率方波信號輸出到耳機。系統(tǒng)結構清晰,各部分分工明確。限于條碼掃描器每次只能掃描一行,目前每次只能掃描一個音符,并且不對音符的節(jié)奏做出判別,只判定音符名。
該設備操作簡單,只需將條碼掃描器的激光線對準要掃描的音符,就可以識別音符并發(fā)聲。
值得一提的是,本成果在五線譜識別發(fā)音功能的基礎上保留了條碼掃描器自身的功能。只要連接數(shù)據(jù)線,仍然可以正常地完成條碼掃描的功能。
本系統(tǒng)最大限度地利用了條碼掃描器自有的時鐘信號和輸出信號。由于輸出信號為脈沖寬度與被掃描黑白線寬度一致的方波信號,因此系統(tǒng)的任務是首先測量掃描音符獲取方波高低電平的寬度,然后分析被掃描樂譜的特征,經(jīng)過比對后得出音符名,進而發(fā)聲。系統(tǒng)的總體結構如圖1所示。其中,單片機部分的工作流程分為預處理(歸一化)、特征提取、音符識別、頻率發(fā)聲等環(huán)節(jié)。

圖1 系統(tǒng)總體結構
2.1.1 條碼掃描器工作原理
激光條碼掃描器由激光發(fā)生器、接收器、信號整形部分、單片機處理模塊等部分組成[1-2]。激光器發(fā)出的紅激光經(jīng)條碼反射后被光電轉(zhuǎn)換器接收,產(chǎn)生隨條碼黑白條紋變化的信號,再經(jīng)過整形放大電路,產(chǎn)生標準邏輯電平的可變脈沖寬度方波。其結構如圖2所示[1]。
脈沖寬度為了將條碼掃描器改造成可以使用的采集模塊,經(jīng)過示波器的檢測,找到了整形信號輸出點、時鐘信號輸出點、按鍵控制信號輸出點三個重要的信號點,并將掃描器的電源線和地線用排線一并引出。 掃描空五線時的信號波形如圖3所示,結果清晰,高低電平分別代表白線和黑線,并且寬度與五線完全一致。

2.1.2 條碼掃描器與AVR單片機接口
表1列出了激光條碼掃描器與ATmega16的連接。
2.1.3 單片機數(shù)據(jù)采集
ATmega16單片機的定時器T1具有輸入捕捉功能[3]:當輸入捕捉引腳上的電位按照預設要求變化時,在中斷使能條件下輸入捕捉中斷將被觸發(fā),并將該時刻定時器寄存器的值存儲到輸入捕捉寄存器中。利用這個特性可以方便地測量方波高電平和低電平的持續(xù)時間。需要注意的細節(jié)是,每次進入中斷都必須將定時寄存器清零,以保證每次從零開始計時,使各數(shù)據(jù)有相同基準。
INT0連接了按鍵信號,每次按鍵信號到來之后數(shù)據(jù)輸出由INT1接入的時鐘信號同步,并在INT1中斷服務子程序中打開T1的輸入捕捉功能,開始采集數(shù)據(jù)。這相當于利用中斷的先后順序控制程序流程。相比于普通的主程序控制流,這種流程控制起來更為靈活,執(zhí)行效率更高,避免了不必要的主程序等待時間。這三個中斷相互控制的流程如圖4所示。

表1 條碼掃描器與單片機信號連接表

[3]提供了對AVR單片機C語言編程的指導。
在同一次掃描中,采集到的數(shù)字脈沖信號會發(fā)生小范圍抖動,因此需要將其預處理變換為標準的定值序列,以克服因方波高低電平持續(xù)時間變化對識別造成的不利影響。
預處理的方法是,首先尋找有效數(shù)據(jù)區(qū)間內(nèi)的最小非零值并將其作為當前采集數(shù)據(jù)的基準值;然后將所有值除以該基準值,實現(xiàn)歸一化。雖然由于每次掃描高度、角度不同引起絕對數(shù)值偏差,但歸一后的數(shù)值保持穩(wěn)定。
考慮到采集的數(shù)據(jù)對應于五線譜中一條縱向切線的信息,相當于一維圖像,包含的信息量小,因此選擇了針對一維圖像識別的比較匹配算法。特征提取從一維信息入手。圖5所示為音符掃描圖。

通過對實際采集的數(shù)值進行分析發(fā)現(xiàn),高低電平持續(xù)時間可以分為3檔,若分別予以標記為0、1、2,即構成一組三進制序列。規(guī)定這組序列從左到右表示一個三進制數(shù)值,將其轉(zhuǎn)換成相應的十進制數(shù),就實現(xiàn)了音符的特征提取。得到的十進制數(shù)值就是該音符的特征值。
完成特征提取后,即可建立一張音符與特征值的對應表,如表2所示。根據(jù)比較匹配即可識別出正確的音符。

表2 音符編碼表
音高由發(fā)聲部件的頻率決定,表3表示為音符頻率參照表。根據(jù)音符名,通過在PA0口產(chǎn)生與指定音符所表示的聲音頻率相同的方波,就能實現(xiàn)對音符的發(fā)聲。硬件上通過PA0口外接耳機得到相應聲音,并在發(fā)聲期間屏蔽其他進程。

表3 音符頻率參照表
發(fā)聲子程序被主程序調(diào)用時,音符碼將以參數(shù)形式傳入子程序。完成局部變量初始化后,首先通過預定義的音符頻率表得到相應音符的頻率,然后通過該頻率值換算得到計數(shù)器計數(shù)值,利用比較匹配模式就可以產(chǎn)生所需方波。
進入中斷服務程序后,當達到發(fā)聲時限時清除使能,屏蔽計時器中斷,解除對其他進程的屏蔽。
測試時使用標準樂譜,包含兩個音階的1/4音符。結果顯示,所有音符都可以正常讀出,但是識別率不夠高。使用串口分析圖像采集階段的數(shù)據(jù),發(fā)現(xiàn)是數(shù)據(jù)庫中的音符信息出現(xiàn)了誤差:分析同一個音符在不同掃描條件下的結果,發(fā)現(xiàn)某一位的數(shù)據(jù)與數(shù)據(jù)表不符。因此,還需要將同一個音符在不同掃描條件下得到的全部結果補充到數(shù)據(jù)庫中。修改后,音符的識別率大大提升,經(jīng)實測,識別率在75%以上。
該系統(tǒng)存在如下限制條件與不足:每次只能識別單個音符,無法實現(xiàn)整行讀取連續(xù)發(fā)音,需要外接電源。如果改用攝像頭采集數(shù)據(jù),預期可以獲得識別樂譜演奏樂曲的高級效果。
參考文獻
[1]田海軍,蘭建軍,劉彥臣.基于單片機的條形碼數(shù)據(jù)采集系統(tǒng)[J].北華大學學報(自然科學版),2005,6(6):568-570.
[2]沈群群.單片機在條形碼掃描儀中的應用[J].湖州職業(yè)技術學院學報,2005,3(2):89-91.
[3]巴雷特,古爾.嵌入式C編程與Atmel AVR[M].周俊杰,譯.北京:清華大學出版社,2003.