一种基于Arduino平台的数字音符实时显示设计分析

2018-11-22 00:46吕博
微型电脑应用 2018年11期
关键词:乐音开发板基波

吕博

(宝鸡文理学院 音乐学院,宝鸡 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];

}})}}

3 Arduino平台数字音符显示效果

之后将这些代码编入Arduino IDE计算机程序中,与USB接口进行连接,将Arduino开发板连接到计算机上。编译完这些程序之后,将其下载到开发板上,之后将信号发生器形成的单一正弦频率信号写入到Arduino开发板上,这时LCD屏幕会根据接受到的信号显示相应的音符。这里将筝弦单一频率信号进行转变,可以使音频传感器可以输入的信号,因为会受到噪声等因素的影响,还有Arduino自身运行的速度限制,而LCD屏幕显示的音符和实际音符是存在误差的,误差程度和出现位置没有确定性。其事物测试连接,如图2所示。

图2 数字音符实物实时显示图

这里长按“2”、“4”、“2”、“4”等音符相对应的电子琴按键,进行相应的测试,得到的结果5安全与要求符合,如图3、图4所示。

4 总结

根据上述分析,本次研究在国内关于音符的实时显示也得到的突破了,目前关于该内容的研究还是比较少,而市场上关于这种产品的销售还是比较少。在后期的设计中可以选择更好的语音处理设备,将Arduino 开发板换成DSP开发平台,并对程序算法进行相应的完善,实现在屏幕上可以有重音记号、连音线等功能,同时可以是这样的产品大量生产,向音乐结推广,给音乐爱好者提供更好的设备。

猜你喜欢
乐音开发板基波
基于SWT的电力系统基波检测
如何区分乐音和噪声
基于STM32H7的FDCAN通信系统设计与实现∗
作文成功之路·作文交响乐——学生展现心灵乐音的舞台
浅析单片机开发板的设计与制作
用心聆听学会区分
最近电平逼近调制的基波谐波特性解析计算
ARM宣布mbed Enabled Freescale FRDM—K64F开发板通过微软认证
基于小波包变换的乐音时—频综合分析程序的开发
基于p-q变换的改进ip-iq基波正序有功和无功电流检测算法