趙宇飛,張遠(yuǎn)哲,姚纓英,樊偉敏
(浙江大學(xué) 電氣工程學(xué)院,浙江 杭州310027)
本文所述基于條碼掃描器和ATmega16的五線譜識(shí)別發(fā)音設(shè)備實(shí)現(xiàn)了紙質(zhì)五線譜的掃描識(shí)別發(fā)音。經(jīng)過實(shí)測,該方案的識(shí)別準(zhǔn)確率很高,且發(fā)音準(zhǔn)確。據(jù)了解,目前國內(nèi)還沒有類似成果出現(xiàn),只有國外某所大學(xué)從事過類似研究,但其使用的方案與本成果不同。
該設(shè)備使用激光條形碼掃描器作為采集設(shè)備,將五線譜的光學(xué)信號(hào)轉(zhuǎn)換為脈沖寬度數(shù)字脈沖信號(hào),利用ATmega16單片機(jī)接收方波信號(hào)并進(jìn)行分析比對處理,實(shí)現(xiàn)音符的判別,并根據(jù)標(biāo)準(zhǔn)十二平均律確定每個(gè)音符對應(yīng)的聲音頻率,最后用單片機(jī)定時(shí)器產(chǎn)生相應(yīng)頻率方波信號(hào)輸出到耳機(jī)。系統(tǒng)結(jié)構(gòu)清晰,各部分分工明確。限于條碼掃描器每次只能掃描一行,目前每次只能掃描一個(gè)音符,并且不對音符的節(jié)奏做出判別,只判定音符名。
該設(shè)備操作簡單,只需將條碼掃描器的激光線對準(zhǔn)要掃描的音符,就可以識(shí)別音符并發(fā)聲。
值得一提的是,本成果在五線譜識(shí)別發(fā)音功能的基礎(chǔ)上保留了條碼掃描器自身的功能。只要連接數(shù)據(jù)線,仍然可以正常地完成條碼掃描的功能。
本系統(tǒng)最大限度地利用了條碼掃描器自有的時(shí)鐘信號(hào)和輸出信號(hào)。由于輸出信號(hào)為脈沖寬度與被掃描黑白線寬度一致的方波信號(hào),因此系統(tǒng)的任務(wù)是首先測量掃描音符獲取方波高低電平的寬度,然后分析被掃描樂譜的特征,經(jīng)過比對后得出音符名,進(jìn)而發(fā)聲。系統(tǒng)的總體結(jié)構(gòu)如圖1所示。其中,單片機(jī)部分的工作流程分為預(yù)處理(歸一化)、特征提取、音符識(shí)別、頻率發(fā)聲等環(huán)節(jié)。
圖1 系統(tǒng)總體結(jié)構(gòu)
2.1.1 條碼掃描器工作原理
激光條碼掃描器由激光發(fā)生器、接收器、信號(hào)整形部分、單片機(jī)處理模塊等部分組成[1-2]。激光器發(fā)出的紅激光經(jīng)條碼反射后被光電轉(zhuǎn)換器接收,產(chǎn)生隨條碼黑白條紋變化的信號(hào),再經(jīng)過整形放大電路,產(chǎn)生標(biāo)準(zhǔn)邏輯電平的可變脈沖寬度方波。其結(jié)構(gòu)如圖2所示[1]。
脈沖寬度為了將條碼掃描器改造成可以使用的采集模塊,經(jīng)過示波器的檢測,找到了整形信號(hào)輸出點(diǎn)、時(shí)鐘信號(hào)輸出點(diǎn)、按鍵控制信號(hào)輸出點(diǎn)三個(gè)重要的信號(hào)點(diǎn),并將掃描器的電源線和地線用排線一并引出。 掃描空五線時(shí)的信號(hào)波形如圖3所示,結(jié)果清晰,高低電平分別代表白線和黑線,并且寬度與五線完全一致。
2.1.2 條碼掃描器與AVR單片機(jī)接口
表1列出了激光條碼掃描器與ATmega16的連接。
2.1.3 單片機(jī)數(shù)據(jù)采集
ATmega16單片機(jī)的定時(shí)器T1具有輸入捕捉功能[3]:當(dāng)輸入捕捉引腳上的電位按照預(yù)設(shè)要求變化時(shí),在中斷使能條件下輸入捕捉中斷將被觸發(fā),并將該時(shí)刻定時(shí)器寄存器的值存儲(chǔ)到輸入捕捉寄存器中。利用這個(gè)特性可以方便地測量方波高電平和低電平的持續(xù)時(shí)間。需要注意的細(xì)節(jié)是,每次進(jìn)入中斷都必須將定時(shí)寄存器清零,以保證每次從零開始計(jì)時(shí),使各數(shù)據(jù)有相同基準(zhǔn)。
INT0連接了按鍵信號(hào),每次按鍵信號(hào)到來之后數(shù)據(jù)輸出由INT1接入的時(shí)鐘信號(hào)同步,并在INT1中斷服務(wù)子程序中打開T1的輸入捕捉功能,開始采集數(shù)據(jù)。這相當(dāng)于利用中斷的先后順序控制程序流程。相比于普通的主程序控制流,這種流程控制起來更為靈活,執(zhí)行效率更高,避免了不必要的主程序等待時(shí)間。這三個(gè)中斷相互控制的流程如圖4所示。
表1 條碼掃描器與單片機(jī)信號(hào)連接表
[3]提供了對AVR單片機(jī)C語言編程的指導(dǎo)。
在同一次掃描中,采集到的數(shù)字脈沖信號(hào)會(huì)發(fā)生小范圍抖動(dòng),因此需要將其預(yù)處理變換為標(biāo)準(zhǔn)的定值序列,以克服因方波高低電平持續(xù)時(shí)間變化對識(shí)別造成的不利影響。
預(yù)處理的方法是,首先尋找有效數(shù)據(jù)區(qū)間內(nèi)的最小非零值并將其作為當(dāng)前采集數(shù)據(jù)的基準(zhǔn)值;然后將所有值除以該基準(zhǔn)值,實(shí)現(xiàn)歸一化。雖然由于每次掃描高度、角度不同引起絕對數(shù)值偏差,但歸一后的數(shù)值保持穩(wěn)定。
考慮到采集的數(shù)據(jù)對應(yīng)于五線譜中一條縱向切線的信息,相當(dāng)于一維圖像,包含的信息量小,因此選擇了針對一維圖像識(shí)別的比較匹配算法。特征提取從一維信息入手。圖5所示為音符掃描圖。
通過對實(shí)際采集的數(shù)值進(jìn)行分析發(fā)現(xiàn),高低電平持續(xù)時(shí)間可以分為3檔,若分別予以標(biāo)記為0、1、2,即構(gòu)成一組三進(jìn)制序列。規(guī)定這組序列從左到右表示一個(gè)三進(jìn)制數(shù)值,將其轉(zhuǎn)換成相應(yīng)的十進(jìn)制數(shù),就實(shí)現(xiàn)了音符的特征提取。得到的十進(jìn)制數(shù)值就是該音符的特征值。
完成特征提取后,即可建立一張音符與特征值的對應(yīng)表,如表2所示。根據(jù)比較匹配即可識(shí)別出正確的音符。
表2 音符編碼表
音高由發(fā)聲部件的頻率決定,表3表示為音符頻率參照表。根據(jù)音符名,通過在PA0口產(chǎn)生與指定音符所表示的聲音頻率相同的方波,就能實(shí)現(xiàn)對音符的發(fā)聲。硬件上通過PA0口外接耳機(jī)得到相應(yīng)聲音,并在發(fā)聲期間屏蔽其他進(jìn)程。
表3 音符頻率參照表
發(fā)聲子程序被主程序調(diào)用時(shí),音符碼將以參數(shù)形式傳入子程序。完成局部變量初始化后,首先通過預(yù)定義的音符頻率表得到相應(yīng)音符的頻率,然后通過該頻率值換算得到計(jì)數(shù)器計(jì)數(shù)值,利用比較匹配模式就可以產(chǎn)生所需方波。
進(jìn)入中斷服務(wù)程序后,當(dāng)達(dá)到發(fā)聲時(shí)限時(shí)清除使能,屏蔽計(jì)時(shí)器中斷,解除對其他進(jìn)程的屏蔽。
測試時(shí)使用標(biāo)準(zhǔn)樂譜,包含兩個(gè)音階的1/4音符。結(jié)果顯示,所有音符都可以正常讀出,但是識(shí)別率不夠高。使用串口分析圖像采集階段的數(shù)據(jù),發(fā)現(xiàn)是數(shù)據(jù)庫中的音符信息出現(xiàn)了誤差:分析同一個(gè)音符在不同掃描條件下的結(jié)果,發(fā)現(xiàn)某一位的數(shù)據(jù)與數(shù)據(jù)表不符。因此,還需要將同一個(gè)音符在不同掃描條件下得到的全部結(jié)果補(bǔ)充到數(shù)據(jù)庫中。修改后,音符的識(shí)別率大大提升,經(jīng)實(shí)測,識(shí)別率在75%以上。
該系統(tǒng)存在如下限制條件與不足:每次只能識(shí)別單個(gè)音符,無法實(shí)現(xiàn)整行讀取連續(xù)發(fā)音,需要外接電源。如果改用攝像頭采集數(shù)據(jù),預(yù)期可以獲得識(shí)別樂譜演奏樂曲的高級(jí)效果。
參考文獻(xiàn)
[1]田海軍,蘭建軍,劉彥臣.基于單片機(jī)的條形碼數(shù)據(jù)采集系統(tǒng)[J].北華大學(xué)學(xué)報(bào)(自然科學(xué)版),2005,6(6):568-570.
[2]沈群群.單片機(jī)在條形碼掃描儀中的應(yīng)用[J].湖州職業(yè)技術(shù)學(xué)院學(xué)報(bào),2005,3(2):89-91.
[3]巴雷特,古爾.嵌入式C編程與Atmel AVR[M].周俊杰,譯.北京:清華大學(xué)出版社,2003.