发明内容
本发明所要解决的技术问题是提供一种音乐节拍检测装置及其方法,能够克服上述现有技术的缺陷,不仅能提高节拍检测的质量,且能简化处理方法及提高处理速度,具有提升成本效益的优势。
为了解决上述技术问题,本发明提供了一种音乐节拍检测装置,包括依次连接的音频信号输入模块,节拍获取电路模块,节拍处理模块以及节拍输出模块;其中:
音频信号输入模块,用于接收音乐的音频信号;
节拍获取电路模块,用于对音频信号进行采样,将音频信号中的高频信号滤除,提取音频信号中的低频信号,并将低频信号转换成高、低电平的数字低频信号;
节拍处理模块,用于对输入的数字低频信号进行数字滤波处理,生成准确的数字节拍信号;
节拍输出模块,用于将准确的数字节拍信号输出;
所述节拍处理模块进一步包含依次连接的信号输入/输出模块、节拍时间记录模块、节拍时间值计算模块、存储模块以及数字滤波处理模块,其中:
所述信号输入/输出模块,分别与所述节拍获取电路模块和所述节拍输出模块连接,用于从所述节拍获取电路模块输入高、低电平的数字低频信号,并将所述准确的数字节拍信号通过所述节拍输出模块输出;
所述节拍时间记录模块,用于根据从所述信号输入/输出模块读取的所述高、低电平的数字低频信号,记录所述高、低电平的数字低频信号中每两个相同方向的陡沿之间的节拍时间计数;
所述节拍时间值计算模块,用于根据从所述节拍时间记录模块读取的所述节拍时间计数计算节拍时间值,并将计算出的多个所述节拍时间值依次存储在多个字节的缓存单元中;
所述存储模块,用于提供存储所述多个节拍时间值的所述缓存单元;
所述数字滤波处理模块,用于对从所述存储模块的多个所述缓存单元中读取所述多个节拍时间值进行滤波处理,即从所述多个节拍时间值中滤除由杂波信号产生的时间值;然后将剩余的所述节拍时间值转换成所述准确的数字节拍信号通过所述信号输入/输出模块输出。
进一步地,节拍获取电路模块包括依次连接的放大电路、检波电路以及开关电路;其中:
放大电路,用于将输入的音频信号中的直流分量滤除后,将音频信号中的交流分量放大;
检波电路,用于将放大后的交流音频信号进行检波,获取交流音频信号中的低频包络信号;
开关电路,用于将低频包络信号转换成数字低频信号。
进一步地,放大电路由晶体管放大电路实现,或者由集成运算放大器电路实现。
进一步地,检波电路为半波检波电路,通过对放大后的交流音频信号进行半波检波获取半波包络信号。
进一步地,开关电路由三极管开关电路实现低频包络信号向数字低频信号的转换;或者,开关电路由比较器电路实现低频包络信号向数字低频信号的转换。
进一步地,节拍时间记录模块所记录的每两个相同方向的陡沿之间的节拍时间,为每两个下降沿之间的节拍时间,或为每两个上升沿之间的节拍时间。
进一步地,由杂波信号产生的时间值为小于一个第一时间阈值的时间值,或者由杂波信号产生的时间值为大于一个第二时间阈值的时间值;其中,该第一时间阈值远小于节拍时间值的低限值,该第二时间阈值远大于节拍时间值的高限值;滤波处理还包括对剩余的节拍时间值取其平均值,然后将其转换成数字节拍信号。
为了解决上述技术问题,本发明提供了一种音乐节拍检测方法,包括如下步骤:
(a)对输入的音乐音频信号进行采样,提取音频信号中的低频信号,并将低频信号转换成高、低电平的数字低频信号;
(b)将高、低电平的数字低频信号进行数字滤波处理,生成准确的高、低电平的数字节拍信号输出;
所述步骤(b)进一步包括步骤:
(b1)记录并计算所述高、低电平的数字低频信号中每两个相同方向的陡沿之间的节拍时间值,并将计算出的多个所述节拍时间值依次存储在多个字节的缓存单元中;
(b2)将从所述缓存单元中读取的所述多个节拍时间值中滤除由杂波信号产生的时间值,并将剩余的所述节拍时间值转换成所述数字节拍信号。
进一步地,步骤(a)包括步骤:
(a1)将音频信号中的直流成分滤除,并将音频信号中的交流成分进行放大;
(a2)将经放大的交流音频信号进行检波,提取交流音频信号中的低频包络信号;
(a3)通过开关电路将低频包络信号转换成高、低电平的数字低频信号。
进一步地,步骤(a2)通过半波检波提取交流音频信号中的低频半波包络信号;步骤(a3)通过三极管开关电路完成低频半波包络信号向高、低电平的数字低频信号的转换;或者,通过比较器电路完成低频半波包络信号向高、低电平的数字低频信号的转换。
进一步地,步骤(b1)包括步骤:
(b1-1)记录高、低电平的数字低频信号中每两个相同方向的陡沿之间的节拍时间计数;
(b1-2)根据节拍时间计数计算节拍时间值,即节拍时间值=节拍时间计数×时间值/计数;
步骤(b1)每两个相同方向的陡沿之间的节拍时间值,为每两个下降沿之间的节拍时间值,或为每两个上升沿之间的节拍时间值。
进一步地,步骤(b2)由杂波信号产生的时间值为一个小于第一时间阈值的时间值,或者由杂波信号产生的时间值为一个大于第二时间阈值的时间值;其中,该第一时间阈值远小于节拍时间值的低限值,该第二时间阈值远大于节拍时间值的高限值;步骤(b2)还包括步骤:对剩余的节拍时间值取其平均值,然后将其转换成数字节拍信号。
进一步地,步骤(b1)存储多个节拍时间值的缓存单元的数量为N个,其中N为正整数;步骤(b2)包括步骤:
在节拍时间值的数量为M小于N的初期阶段,将当前存储的M个节拍时间值直接转换成数字节拍信号输出;或者,从当前存储的M个节拍时间值中去掉x对最大值、最小值,并对剩余的节拍时间值取其平均值;其中,M为正整数,x为小于M/2的正整数;
在节拍时间值的数量大于或等于N的阶段,从当前存储的N个节拍时间值范围中去掉y对最大值、最小值,并对剩余的节拍时间值取其平均值;其中,y为小于N/2的正整数。
进一步地,所述初期阶段为M小于或等于N/4的阶段,则将当前存储的M个节拍时间值直接转换成数字节拍信号输出;
或者,所述初期阶段为M大于N/4、小于或等于N/2的阶段,则从当前存储的M个节拍时间值中去掉z对最大值、最小值,并对剩余的节拍时间值取其平均值;其中z为小于M/2的正整数;
或者,所述初期阶段为M大于N/2、小于N的阶段,则从当前存储的M个节拍时间值中去掉w对最大值、最小值,对剩余的节拍时间值取其平均值;其中w为小于M/2的正整数。
进一步地,在节拍时间值的数量大于或等于N的阶段,当节拍时间值的数量等于N时,将缓存单元的地址指针恢复为初始值后,将当前新的节拍时间值存储在当前地址指针所指的缓存单元中;当节拍时间值的数量大于N时,将缓存单元的地址指针加1,然后将当前新的节拍时间值存储在当前地址指针所指的缓存单元中。
进一步地,步骤(b1)存储N个节拍时间值,其中N的选择要满足数字节拍信号输出的及时性和准确性。
本发明将硬件电路与软件处理相结合,通过简单的节拍获取电路采样得到音乐音频声波中的数字低频信号,并通过后期的数字滤波处理得到乐曲准确的数字节拍信号。本发明的节拍检测装置不需进行复杂的A-D转换,并采用普通的8位MCU就可实现对节拍信号的数字滤波处理,由于减轻了信号处理的复杂度而提高了处理速度,故能使得应用产品对乐曲节拍信号做出迅速响应,以此形成低成本、高互动性的玩具产品。
具体实施方式
本发明提供的节拍检测装置,主要是通过节拍获取电路模块对原始的音频信号进行采样,提取其中的低频信号,并将其转换成数字低频信号;通过节拍处理模块对数字低频信号进行数字滤波处理,从而生成准确的数字节拍信号输出。本发明用于节拍采样的电路简单,且后期的数字滤波处理由于减轻了处理的复杂度,因而在8位MCU上即可满足处理速度及检测质量的要求。
下面结合实施例和附图,对本发明上述技术方案进行详细地阐述。
如图2所示,是本发明的音乐节拍检测装置的结构框图,该节拍检测装置100包括依次连接的音频信号输入模块101,节拍获取电路模块102,节拍处理模块103以及节拍输出模块104;其中:
音频信号输入模块101,用于接收音乐的原始音频信号,其波形图如图3所示;
人耳可闻的音域范围一般在10~20KHz之间,不同的乐器奏出的乐曲信号频率也是不同的。一般的乐曲信号频率都是在200Hz~2KHz之间,但鼓的频率是在30Hz~100Hz之间,属于相对低频的信号,而且一首曲子它的鼓点基本上是均匀的,即在每个固定的时间内输出一个鼓点,如图3所示的大峰值的部分通常对应于鼓点的信号部分。
节拍获取电路模块102,用于对原始音频信号进行采样,提取其中的低频信号,并将其转换成数字低频信号输出;亦即将原始音频信号中的高频成分滤除,获取其中的低频信号,并将该低频信号转换成高、低电平的数字信号输出;
首先将原始音频信号中的直流成分去掉,将信号的交流成分经放大、检波提取出音频信号中的低频信号,然后将该低频信号通过信号比较转换成 高、低电平信号。
节拍处理模块103,用于对输入的数字低频信号进行数字滤波处理,生成准确的数字节拍信号输出;亦即依次记录和计算高、低电平信号两个下降沿(或两个上升沿)之间(从一个下降沿开始到另一个下降沿结束)的节拍时间及其时间值,并将其中由杂波产生的时间值滤除;然后将经过滤波处理的节拍时间值转换成高、低电平的节拍信号输出。
节拍输出模块104,用于输出节拍处理模块103处理生成的数字节拍信号。
下面参阅图4、图5及图6对节拍获取电路模块102作进一步说明。
如图4所示,节拍获取电路模块102进一步包括依次连接的放大电路1021、检波电路1022以及开关电路1023;其中:
放大电路1021,用于将输入的音频信号的直流分量滤除后,对其交流分量进行放大;
检波电路1022,用于将放大后的交流音频信号进行半波检波,获取其半波包络(即叠加在一个高频信号上的低频信号),如图3a所示意;
开关电路1023,用于通过信号比较将低频的包络信号转换成高、低电平数字信号。
图5是图4所示的节拍获取电路模块102原理框图的一个实施例。其中:
音频信号输入插头201,是音频信号输入模块101的具体实施,用于将音频信号引入;
放大电路2021,由电阻R1、R2及R5、电容C1和晶体三极管Q1构成,接收来自音频插头的音频信号,经由电容C1将音频信号的交流成分的耦合到三极管Q1的基极,同时将音频信号的直流成分隔离;电阻R2通过电源VCC为三极管Q1的集电极提供反向偏置,电阻R5为三极管Q1发射极提供正向偏置,使得三极管Q1工作在放大状态,同时R2还作为集电极的输出电阻,使得放大电路2022能将交流音频信号进行放大。
本发明的节拍获取电路模块102中的放大电路,不限于本实施例所给出 的上述晶体管放大电路,还可有多种依此电路的变化形式,均能实现本实施例的上述放大功能,它们都是本领域的普通技术人员所熟知的,故在此不再一一赘述。
检波电路2022,由二极管D1、电阻R3以及电容C2构成,接收放大电路2022放大后的交流音频信号,其中二极管D1的负极端与电容C2的一端相连,电容C2的另一端接地,当二极管D1的正极端对地的电压大于二极管D1的导通电压时,对电容C2进行充电(即图3a中包络信号的上升沿部分);当二极管D1的正极端对地的电压为低时,电容C2向R3放电(即图3a中包络信号的缓慢下降部分),由于电容C2的放电的时间比充电的时间要长,所以在电容C2放电没有结束的时候,所述的波形信号的下半周期电压已经到来,二极管D1的正极端对地的电压已经变为高,继续对C2进行充电,这样就利用电容C2的充放电来获取交流音频信号的正半波包络,即滤掉高频信号而获取交流音频信号中的低频信号,如图3a所示。
本实施例是进行正半波检波,获取其正半波包络信号,这仅仅用于说明本发明,而不用于限制本发明。譬如亦可采用负半波检波而获取其负半波包络信号。或者,亦可采用全波检波而获取其全波包络信号。采用哪种方式进行检波,由系统对信号的约定及具体实施电路确定。任何能提取叠加在高频信号上的低频信号作用的检波形式都应在本发明所要求保护的范围内。
开关电路2023,由电容C3、C4、电阻R6以及三极管Q2构成,将包络信号通过电容C3耦合到三极管Q2的基极,利用三极管Q2开关特性的导通和截止两个状态,当三极管Q2的发射结电压小于它的导通电压时,其集射结不导通,集电极输出电压为高电平;当三极管Q2的发射结电压大于它的导通电压时,其集射结导通,集电极输出电压为低电平;也就是通过将三极管Q2的发射结电压与Q2的导通电压相比较,引起三极管Q2产生导通或截止两个状态,从而将输入的模拟信号(即包络信号)转换成高、低电平两种状态的数字信号(1和0),参见图7所示的数字波形图。
图6为本发明的节拍获取电路模块102的另一实施例。其中:
音频信号输入插头301,同样是音频信号输入模块101的具体实施,将音频信号引入;
放大电路3021是一个反向放大的电路,由电容C1、电阻R1、R2、R3、R4以及集成运放U1A构成;电容C1的一端接收输入的音频信号,通过电容C1将音频信号的交流成分耦合到放大器U1A的反向输入端2,电阻R2作为反馈电阻将其输出端1的反馈电压加到放大器U1A反向输入端2,同相输入端3的电压为Vcc/2。假设输入的音频信号电压为Vi,从放大器U1A的输出端1输出信号电压为Vo,则Vo与Vi的关系是:
Vo=-(R2/R1)*(Vi-Vcc/2);相当于是原来的音频信号电压Vi叠加上Vcc/2后放大R2/R1倍,即放大电路3022将交流音频信号进行放大。
本发明的节拍获取电路模块102中的放大电路,不限于本实施例所给出的上述由集成运放所构成的放大电路,还可有多种依此电路的变形,均能实现本实施例的上述放大功能,它们也都是本领域的普通技术人员所熟悉的,在此,也就不一一例举了。
检波电路3022由二极管D1、电阻R5以及电容C3构成,接收放大的交流音频信号后,对交流音频信号的正半波检波,并滤掉其中的高频载波信号,得到低频的包络信号(参见图3a),其电路具体工作过程与图5所示的检波电路2023的工作过程相同,此不再赘述。
开关电路3023由集成运放U1B、电容C2、C9及电阻R6、R7构成。由于集成运放U1B工作在开环状态,所以开关电路3024又作为一个比较器,Vcc/2为比较器的阀值电压,比较器的输出电压为+U或-U。开关电路3024接收来自检波电路3023的低频信号电压,将该低频信号电压经由电容C2耦合到集成运放U1B的反向输入端6,正向输入电压Vcc/2经由电阻R7耦合到集成运放U1B的正向输入端7,集成运放U1B将上述两电压进行比较,若输入的低频信号电压小于正向端输入电压Vcc/2时,输出高电平+U,反之输出低电平-U。由上图可知,输出也是只有高、低电平两种状态的数字信号,即可以得到和图7一样的数字输出信号。
以下参阅图8对本发明的装置中节拍处理模块103作进一步说明。
一般的乐器奏出的乐曲信号频率都是在200Hz~2KHz之间,而鼓声的信号频率是在30Hz~100Hz之间,属于相对低频的信号。由于前端的节拍 获取电路模块通过硬件处理,只能采样得到该相对低频的信号,它仅仅是鼓点信号,即含有鼓点信息的低频信号。单靠该低频信号是不能完全得到一首乐曲准确的节拍的,因为里面会夹有一些杂波信号,如图7中的T11、T12,还需对该低频信号进行滤波处理,还原出准确的节拍信号,所以在硬件处理后加入了节拍处理部分。
本发明的节拍处理模块103的一个实施例,是基于但不限于凌通公司的一款普通的8位MCU(GPC11024A)构建成的,其结构请参见图8。本发明的节拍处理模块103不限于用普通的MCU系统构建,也可以基于专用MCU系统、嵌入式片上系统(SoC,System on Chip)或现场可编程门阵列(FPGA,Field Programmable Gate Array)构建。
如图8所示,节拍处理模块103进一步包含依次连接的信号输入/输出模块1031、节拍时间记录模块1032、节拍时间值计算模块1033、存储模块1034以及数字滤波处理模块1035;其中:
信号输入/输出模块1031,分别与节拍获取电路模块102和节拍输出模块104连接,用于从节拍获取电路模块102输入数字低频信号(即高、低电平信号),并将经节拍计算处理模块1035数字处理的准确的数字节拍信号(即高、低电平信号)通过节拍输出模块104输出;
该信号输入/输出模块1031由MCU中的I/O接口单元实现。
节拍时间记录模块1032,用于根据由信号输入/输出模块1031读取的高、低电平低频信号,记录其中每两个下降沿之间(从一个下降沿开始到另一个下降沿结束)的节拍时间计数;
当然,也可以记录电平信号每两个上升沿之间(从一个上升沿开始到另一个上升沿结束)的节拍时间计数,根据系统对电平信号的约定确定。也就是说,节拍时间记录模块1032记录的是电平信号每两个相同方向的陡沿之间的节拍时间计数。
该节拍时间记录模块1032由MCU中计时器单元实现。这里节拍时间指从当前下降沿开始计时到下一个下降沿的结束作为一个有效的节拍时间,用一个字节表示,如图7所示的数字波形图,时间Tx(x=1,2,...,n)即为所 要记录的节拍时间。
节拍时间值计算模块1033,用于根据由节拍时间记录模块1032读取的节拍时间计数计算获取其节拍时间值,并将计算出的N个节拍时间值依次存储在N个字节的缓存单元里;
由于节拍时间记录模块1032仅仅将节拍时间以时间计数(n个时间计数)的形式记录下来,需要依据该时间计数进一步计算出时间值,即:节拍时间值=n×时间值/计数。
本实施例中通过定义N个字节的缓存单元来记录连续N个节拍时间值。在此,N值的选取上有两点需要考虑:一是节拍信号的准确性,另一是节拍输出的及时性。比如N值越大得到的节拍信息越多,最后计算出的节拍时间值越准确,但存储器开辟的缓存空间就越大,且需要记录满N个节拍时间值所需要的时间也越长,这样要待记满N个节拍时间值后才获取到节拍信号,会造成信号输出的及时性差,使输出的节拍信号滞后。在本实施例中,为兼顾节拍信号的准确性和信号输出的及时性两方面因素,取N=20,即在存储器中定义20个字节的缓存单元。这样定义仅仅是为了更好地说明本发明,而非为限定本发明。
存储模块1034,用于提供存储N个节拍时间值的缓存单元;
数字滤波处理模块1035,用于从存储模块1034的N个缓存单元中依次读取多个节拍时间值,将其中由杂波所产生的时间值滤除,并将经滤波处理的节拍时间值转换成数字节拍信号给信号输入/输出模块1031。
从一般歌曲的特性来看,节拍的时间范围一般在60ms~300ms之间,即1个节拍/秒~4个节拍/秒之间,那么1个节拍具体时间的范围应该在200ms~1s之间。根据该特性可以对节拍时间值通过数字滤波处理,在本实施例中的处理方式是当两个低电平(即两个节拍)之间的时间Tx<t(t<200ms,比如本实施例中t=160ms)的时候,认为当前得到的时间值是由杂波产生,如图7中所示的T11和T12两个节拍时间均小于1 60ms,应将其滤除。当然,遇有Tx>T(T>1.5s)的时间值亦应作为杂波滤除,实际上这样做可视为将漏掉的节拍补回。
以上节拍时间值计算模块1033和数字滤波处理模块1035由MCU中8位微处理器执行程序指令实现。
本发明除了提供上述音乐节拍检测装置外,还提供有音乐节拍检测方法,包括以下步骤:
(a)对输入的音乐音频信号进行采样,提取信号中低频信号,并将其转换成数字低频信号输出;
亦即首先将原始音频信号中的直流成分去掉,将信号的交流成分经放大、检波提取其中的低频信号,然后将该低频信号转换成高、低电平信号。
(b)对采样得到的数字低频信号进行数字滤波处理,生成准确的数字节拍信号(即高、低电平信号)输出。
亦即将高、低电平的低频信号转换成多个连续的时间值,将由低频信号中的杂波所产生的时间值滤除,然后将经过滤波处理的时间值转换成准确的数字节拍信号。
在一首乐曲的初期先分阶段依次记录和计算电平信号两个下降沿(或两个上升沿)之间的节拍时间及其时间值,并将每阶段数据中的杂波时间值滤除;然后将每阶段中经过滤波处理的节拍时间值转换成节拍高、低电平的节拍信号输出。
当有N个节拍时间值填满N个缓存单元后,便以先进先出FIFO的方式移动缓存单元的数据,并将N个数据中的杂波时间值滤除,然后将N个数据中经过滤波处理的节拍时间值转换成节拍高、低电平的节拍信号输出。
下面结合图9和图10对上述方法步骤(b)中数字滤波处理及分阶段输出方法进行详细描述。
如图9所示,本实施例的对数字节拍信号进行数字滤波处理的方法流程包括如下步骤:
800,系统初始化;
MCU系统定义一块具有N字节缓存单元的存储器区域;
定义缓存单元满标志变量(BufferFullFlag),将该变量初始化为0,该变量表示缓存器是否已经存储满N个字节;
定义缓存器地址标志变量(Index),将该变量初始化为0,该变量表示当前指向缓存器的地址位置;
定义乐曲结束计数器(SilenceCounter),将该变量初始化为0,利用该变量来记录高电平持续时间是否超过设定的结束时间值(将这里的结束时间值定义为2秒是根据一首普通乐曲的节拍平均出现的时间来定义,但非局限该值);
定义节拍状态变量(BeatStatus),将该变量初始化为0,该变量表示节拍有无状态。
801,将MCU系统的I/O端口设为输入端口,读取该输入端口的状态;
硬件采样得来的数字低频信号传输给MCU的I/O端口。当该数字低频信号位为高电平时,通过IO端口寄存器(未示出)状态为0或为1来得到当前的信号的状态是高或低电平(在本实施例中0为低电平,1为高电平)。
当从I/O端口读到当前寄存器状态为0时(即下降沿),表示当前有一个节拍来临,则将BeatStatus变量置为1;若当下降沿结束时,表示当前是无节拍状态,则将BeatStatus置为0。在后续的处理过程中变量BeatStatus用作计时器记录节拍时间长度开始和截止标志。
802,判断变量SilenceCounter是否大于或等于2s,亦即查看高电平持续时间是否超过设定的乐曲结束时间值2秒,若是表示乐曲结束,则执行步骤806;若否执行步骤803;
803,记录并计算节拍时间;
本实施例记录节拍时间指从当前下降沿开始计数到下一个下降沿的结束计数作为一个有效节拍的时间计数,然后据此时间计数计算出节拍时间值,用一个字节表示,将连续计算出多个节拍时间值存到多个字节的缓存单元中。
804,从缓存器中的多个节拍时间值中滤除杂波时间值;
805,将经滤波后的节拍时间值转换成节拍信号后输出;返回步骤801执行;
806,将SilenceCounter重新置0,等待下一次触发节拍检测,结束流程。
如图10所示的流程,是对上述流程步骤804的进一步说明,该流程包括步骤:
8031,判断缓存单元满标志变量BuffFullFlag是否为0,若是,执行步骤8032,若否,则执行步骤8042;
8032,判断缓存单元地址标志变量Index是否小于q(q为正整数,本实施例中取q=5,但不限于该数值),若是,执行步骤8033,若否,则执行步骤8035;
8033,将计算出的节拍时间值存储到当前地址的单元中,并将Index加1;
8034,分别读取当前缓存单元中的1~q(q=5)个节拍时间值,通过上流程步骤805输出;
8035,进一步判断Index是否小于p(p为正整数,在本实施例中取p=10,但不限于该数值),若是,执行步骤8036,若否,则执行步骤8038;
8036,将计算出的节拍时间值存储到当前地址的单元中,并将Index加1;
8037,将已存储的q(q=5)个数据去掉x对(x<q/2,x为正整数,本实施例中x=2,但不限于该数值)最大值及最小值后,取剩余节拍时间值的平均值,通过步骤805输出;
8038,进一步判断Index值是否小于N(在本发明的实施例中取N=20,但不限于该数值),若是,执行步骤8039,若否,则执行步骤8041;
8039,将计算出的节拍时间值存储到当前的单元中,并将Index加1;
8040,将已存储的p(p=10)个数据去掉y对(y<p/2,y为正整数,本实施例中y=4,但不限于该数值)最大值及最小值后,取剩余节拍时间值的平均值,通过步骤805输出;
8041,置变量BufferFullFlag的值为1,表示当前的缓存单元已存储满N个(即20个)节拍时间值;
8042,将当前的节拍时间值存储到变量Index所指地址的缓存单元中,该所指地址是N个缓存单元的第一个;
8043,将已存储的N个数据去掉z对(z<N/2,z为正整数,本实施例中z=8)最大值及最小值后,取剩余节拍时间值的平均值;
8044,判断Index是否小于N,若是,执行步骤8045,若否,则执行步骤8046;
8045,将Index加1后通过步骤805输出;
8046,置Index为0后通过步骤805输出。
在此时状态下,又有新的节拍时间值Tn+1进入时,会利用步骤8031再次判断BufferFullFlag是否还是为0,由于BufferFullFlag已被置为1,则直接进入步骤8042执行将当前的节拍时间存储到当前的变量Index所指向的地址(第一个单元),即此时新进入缓存器的节拍时间值覆盖最初进入缓存器的节拍时间值,如图11所示的0x0090单元的数据;再有新的节拍时间值Tn+2进入时,会通过Index所指地址覆盖0x0091单元的数据,......以此类推,实现FIFO方式的数据更新。当曲子的实际节拍有改变的时候,缓存单元中的数据直到新节拍值的数目占多数(即>N/2)时,就会按照新节拍信号输出,说明本方案也兼容当节拍在中途有改变的情况。
由上述的步骤中可以清楚知道,在本发明的节拍时间计算方法中根据将缓存单元中的存储的数据分成4个阶段来获得节拍时间值,其中:第1阶段是1~q(即1~5),第2阶段是(q+1)~p(即6~10),第3阶段是(p+1)~N(即11~20),第4阶段是大于N的数据窗口按FIFO方式移动阶段。当一首乐曲过了第4阶段再得到节拍时间值数据,便直接按第4阶段直接进行处理。实际上,上述4个阶段可以分为两个阶段,其中,第1至第3阶段均为初期阶段,因为采样开始转换的节拍时间值还没有达到N个,但是又不能等达到N个节拍时间值后再输出数字节拍信号,因此,在初期需要根据节拍时间值的个数积累而逐步地采取相应的滤波处理,即在相应的节拍时间值个数范围内把最大值、最小值去除(实际上是滤除前述的Tx<t和Tx>T的时间值),如果在去掉最大值、最小值后仍有足够剩余的节拍时间值,则再将剩余的节拍时间值取平均值后而得到准确的节拍时间值。当采样转换的节拍时间值达到了N个,即到第4阶段以后,就可以正常地在N个节拍时间值范围内进行上述滤波处理并输出了。这样处理的理由前已述 及,是为了兼顾节拍信号的准确性和信号输出的及时性。将缓存单元中的存储的数据分成4个阶段来获得节拍时间值,这仅仅用于说明本发明,而不用于限制本发明。
如图11所示,假定地址为0x0090~0x00**的缓存单元中存储的数据记录了的图7所示的多个相连两个节拍的时间值Tx。其中,0x00**表示第(0x0090+N)个单元的地址。
一首曲子播放,当有数字低频信号下降沿到来时,即表示有一个节拍到来,此时节拍状态变量BeatStatus被置1,计时器counter开始进行计数操作,即counter内容加1,当该数字低频信号的上升沿到来时,BeatStatus被置为0,直到下一个下降沿到来,BeatStatus的值再次被置为1时,计时器计数操作停止,便得到counter的计数值n,据此计数值计算出节拍时间值(=n×时间值/计数),用T1表示,并将它存到上述缓存单元中。缓存器被定义为一个FIFO存储器,即当其内存满了N个节拍时间值的缓存单元以后,若有第N+1个节拍时间数据再来时,将第一个已存储的节拍时间数据(地址为0x0090)移除,后面的节拍时间数据依次往前移动1个地址,新节拍数据存储在地址为0x00**的单元中,如图11图所示意的那样。
图12是在乐曲初期对计算的节拍时间值在缓存单元中分阶段处理的示意图,其中(1)为第1阶段,(2)为第2阶段,(3)为第3阶段。
本发明在于利用简单的硬件电路,对音乐的音频信号进行采样获取其中的低频信号,并将其转换成电平数字信号;通过后期的数字滤波处理就可以滤掉电平信号中一些多余的杂波,从而得到曲子精确的数字节拍信号。不需要复杂的A-D转换,也减轻了数字处理时的复杂度,在普通的8位机上就完全可以实现,从而具有提升成本效益的优势。通过本发明技术方案,可以准确地抽取一首乐曲的节拍,准确率90%以上。
当然,本发明还可有其他多种实施例,在不背离本发明精神及其实质的情况下,熟悉本领域的技术人员当可根据本发明作出各种相应的改变和变形,但这些相应的改变和变形都应属于本发明所附的权利要求的保护范围。