呂博
(寶雞文理學院 音樂學院,寶雞 721013)
隨著現代科技的進步,人們的學習和工作變得更加智能化,現代信息技術逐漸代替了人們基本的人工勞動,很多行業也開始借助計算機來進行工作[1]。本文分析的數字音符主要是利用單片機技術,讓高低音調音頻可以在顯示屏上以音樂簡譜的方式展示出來,這樣可以更好人工代替“翻譯”,從而幫助音樂愛好者學習,有助于地方音樂的數字化記錄。本文將用到具有Arduino的設備作為開發板,以及LCD顯示器、音頻傳感器等[2-3]。Arduino就像C語言、java所處的Processing/Wiring開發環境。
Arduino是建立在Simple I/O平臺上開放原始代碼,它的功能比較豐富,使用比較方面,價格低廉,所以在電子系統、互動功能開發方面使用比較廣泛。該開發并平臺是以ArduinoUNO為控制核心平臺,它具有以數組形式的節拍數據、樂曲音高等數據,可以與外圍設備接口連接實現通信,從而實現音樂播放[4-5]。音符簡譜顯示包括字母簡譜、數字簡譜兩種,而本文主要分析的是數字簡譜,每種頻率都有自己對應音符。
在聲學中,“樂音”是指發音物體表現有規律的震動產生的固定音頻,如小提琴、鋼琴、西府曲子伴奏樂器二胡、三弦等樂器發出的樂音。從聲學原理中分析樂音的主要特征包括:音色、響度、音調,而音調是不同的樂音基波頻率決定,通常使用音符進行表示,比如:494 Hz這個基波頻率就自己對應的音符[6-7]。利用快速傅里葉對任意一個樂音信號進行變換,可以得到每個頻率變換后基波頻率對應的幅值大小。通過該功能可以先提取基波頻率在完成之后的系列換算,從而實現音符的轉變并顯示。數字音符硬件實時顯示連接圖,如圖1所示。
本文主要利用奈奎斯特采樣定理進行信號的采集和輸入,該定理就是如果在有限的頻帶寬度下,從抽樣信號中完全恢復原來的信號,這時的抽樣頻率需要大于2倍最高信號頻率。也就說在采集信號的時候需要選擇大于最高頻率的2倍頻率,這樣才不會出現信號重疊情況。本次研究主要以2 000 Hz以下的中低音頻信號進行分析,其中采樣的頻率是5 120 Hz(每個195 μs進行一次采樣)[8-9]。這里使用音頻傳感器將檢測的聲音變成輸入的音頻信號到Arduino接口ADC(A0)處,在將每個250 ms采集一次信息輸入系統中,每次采樣的點數是256點,這里使用fs、f0、n作為采樣的頻率、頻率分辨率、采樣點數等,而f0=fs/n,之后將音頻信號256點進行FFT轉變,得到頻率分辨率是20 Hz。

圖1 硬件實時連接的數字音符示意圖
FFT提取基波頻率時,需要CIA楊頻率大于基波頻率,這樣才能保證基波頻率采集的完整性。將采取數據進行FFT轉變之后,確定轉變之后的幅值最大點以及其對應的序號,給其賦值num變量,之后在將num變量與頻率分辨率20 Hz相乘,即可得到基波頻率,這里使用的公式是fn=num×f0,其中f0=20 Hz,fn是基波頻率)。
本次研究主要顯示十六分音符、四分音符、八分音符等。這里假設十六分音符有250 ms的時長,而四份音符時長是1 s,八分音符的是500 ms,之后分析每個音符之間存在的時值關系。
在實際中獲得樂器聲音頻率無法得到準確的理論值,需要對這些頻率規定一定的區間范圍。本次研究是選擇相鄰音符之間的平均值作為分界,比如:3、4、5音符對應的音符頻率是658 Hz、697 Hz、783 Hz等,根據上述分析本次研究使用的頻率分辨率是20 Hz,所以這里選擇的頻率是680~740 Hz(&num≤37,num≥34),而選擇的音符可以用“4”表示。為了方便編程,這里使用數字1~7、11~17、111~117來表示音符“1”~“7”、“1”~“7”、“1”~“7”,這里使用數字“8”表示休止符“0”。
根據預先規定好的音符范圍提取基波頻率,將這些轉換成對應的數字,之后根據每16個數字構成一組數據,根據先后順序添加一個整形數組大小是16的m[]。之后將m[]中元素相同或是相鄰的參數進行合并,將合并得到的元素與10相乘,在進行以此循環合并。在合并后這些元素還是不能整除10,就需要在顯示音符后面增加一個“=”;如果能被10整除但是不能被100整除,需要在音符下面添加一個“-”。在計算下一組數據時,需要清空m[]數據,在重新建立下一組數據。因為提取每個基波頻率是時間是相隔0.25 s,提取每組數據,以及LCD上的音符顯示時間都是4 s(16×0.25 s)。
關于音符實時顯示程序的編輯如下:
For(int i=0;i<512;i+=2){//輸入256個點
delayMicroseconds(195);//每個195 μs進行時間采樣
Wile(!(ADCSRA & 0×10));//進行數據采樣
ADCSRA=0xf5;
Byte m=ADCL;
byte j=ADCH;
int k=(j<<8)|m;
k-=0×0200;
K<<=6;
FFT_input[i]=k;//轉變成了整型數據16位的
FFT_input[i]=k;//把收集到的數據輸入數組實部中
FFT_input[i+1]=0;//將虛部數據清空
}
FFT_window();FFT_reoder(); //對FFT_input[]中的數據進行調整方便采取FFT轉變
FFT_run(); //將該部分的數據進行FFT轉變
FFT_mag_lin(); //將轉變FFT后的每個頻率幅值按照順序保存在該部分中
for(byte i=3,max=0,num=3;i<128;i++){
/*為了減少直流信號的影響,將最大值點的頻率序號提取出來,i是從3開始不是由0開始/
if(FFT_mag_lin_out[i]>max)max=FFT_mag_lin_out[i],num=i;
If(i==127){ //把num變成自己對應的頻率數字
If(2 else if(2 //其他部分相似的程度結構在這里不予多說 …… else if(num>94){m[1]=117;1=1+1;} } for( byte i=0;i<16;i++){ //將兩個相同或是相鄰的元素合并,在之后與10相乘 for(byte i=0;i<16;i++){ if(m[i]==m[i+2] & m[i+1]==0){m[i]=0;m[i+1]=10*m[i+2]; } for(byte i=0;i<16;i++){ if(m[i]==m[i+1]){m[i]=0;m[i+1]=10*m[i+1]; }})}} 之后將這些代碼編入Arduino IDE計算機程序中,與USB接口進行連接,將Arduino開發板連接到計算機上。編譯完這些程序之后,將其下載到開發板上,之后將信號發生器形成的單一正弦頻率信號寫入到Arduino開發板上,這時LCD屏幕會根據接受到的信號顯示相應的音符。這里將箏弦單一頻率信號進行轉變,可以使音頻傳感器可以輸入的信號,因為會受到噪聲等因素的影響,還有Arduino自身運行的速度限制,而LCD屏幕顯示的音符和實際音符是存在誤差的,誤差程度和出現位置沒有確定性。其事物測試連接,如圖2所示。 圖2 數字音符實物實時顯示圖 這里長按“2”、“4”、“2”、“4”等音符相對應的電子琴按鍵,進行相應的測試,得到的結果5安全與要求符合,如圖3、圖4所示。 根據上述分析,本次研究在國內關于音符的實時顯示也得到的突破了,目前關于該內容的研究還是比較少,而市場上關于這種產品的銷售還是比較少。在后期的設計中可以選擇更好的語音處理設備,將Arduino 開發板換成DSP開發平臺,并對程序算法進行相應的完善,實現在屏幕上可以有重音記號、連音線等功能,同時可以是這樣的產品大量生產,向音樂結推廣,給音樂愛好者提供更好的設備。3 Arduino平臺數字音符顯示效果



4 總結