一种基于Arduino平台的数字音符实时显示设计分析
2018-11-22吕博
吕博
(宝鸡文理学院 音乐学院,宝鸡 721013)
0 引言
随着现代科技的进步,人们的学习和工作变得更加智能化,现代信息技术逐渐代替了人们基本的人工劳动,很多行业也开始借助计算机来进行工作[1]。本文分析的数字音符主要是利用单片机技术,让高低音调音频可以在显示屏上以音乐简谱的方式展示出来,这样可以更好人工代替“翻译”,从而帮助音乐爱好者学习,有助于地方音乐的数字化记录。本文将用到具有Arduino的设备作为开发板,以及LCD显示器、音频传感器等[2-3]。Arduino就像C语言、java所处的Processing/Wiring开发环境。
1 数字音符实现的原理
Arduino是建立在Simple I/O平台上开放原始代码,它的功能比较丰富,使用比较方面,价格低廉,所以在电子系统、互动功能开发方面使用比较广泛。该开发并平台是以ArduinoUNO为控制核心平台,它具有以数组形式的节拍数据、乐曲音高等数据,可以与外围设备接口连接实现通信,从而实现音乐播放[4-5]。音符简谱显示包括字母简谱、数字简谱两种,而本文主要分析的是数字简谱,每种频率都有自己对应音符。
在声学中,“乐音”是指发音物体表现有规律的震动产生的固定音频,如小提琴、钢琴、西府曲子伴奏乐器二胡、三弦等乐器发出的乐音。从声学原理中分析乐音的主要特征包括:音色、响度、音调,而音调是不同的乐音基波频率决定,通常使用音符进行表示,比如:494 Hz这个基波频率就自己对应的音符[6-7]。利用快速傅里叶对任意一个乐音信号进行变换,可以得到每个频率变换后基波频率对应的幅值大小。通过该功能可以先提取基波频率在完成之后的系列换算,从而实现音符的转变并显示。数字音符硬件实时显示连接图,如图1所示。
2 Arduino平台数字音符显示设计实现
2.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 硬件实时连接的数字音符示意图
2.2 提取基波频率
FFT提取基波频率时,需要CIA杨频率大于基波频率,这样才能保证基波频率采集的完整性。将采取数据进行FFT转变之后,确定转变之后的幅值最大点以及其对应的序号,给其赋值num变量,之后在将num变量与频率分辨率20 Hz相乘,即可得到基波频率,这里使用的公式是fn=num×f0,其中f0=20 Hz,fn是基波频率)。
2.3 数字音符的显示
本次研究主要显示十六分音符、四分音符、八分音符等。这里假设十六分音符有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)。
2.5 主要程序编辑
关于音符实时显示程序的编辑如下:
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 总结