基于FPGA的电子琴设计与实现

基于FPGA的电子琴设计与实现,第1张

     电子琴设计原理

  乐曲都是由一连串的音符组成,按照乐曲的乐谱依次输出这些音符所对应的频率,就可以在扬声器上连续地发出各个音符的音调。为了准确地演奏出一首乐曲,仅仅让扬声器能够发出声音是远远不够的,还必须准确地控制乐曲的节奏,即每个音符的持续时间。由此可见,乐曲中每个音符的发音频率以及音符持续的时间是乐曲能够连续演奏的两个关键因素。

  乐曲的12平均率规定:每2个八度音之间的频率要相差1倍,比如简谱中的中音2与高音2。在2个八度音之间,又可分为12个半音。另外,音符A(简谱中的低音5)的频率为392Hz,音符E到F之间、B到C之间为半音,其余为全音。由此可以计算出简谱中从低音

  1至高音1之间每个音符的频率。简谱音名与频率对应关系如图2-1所示:

基于FPGA的电子琴设计与实现,基于FPGA的电子琴设计与实现,第2张

  产生各音符所需的频率使用一分频器来实现,由于各音符对应的频率多为非整数,而分频系数又不能为小数,所以必须将计算得到的分频数四舍五入取整数。若分频器时钟频率过低,则由于分频系数过小,四舍五入取整数后的误差较大;若时钟频率过高,虽然误差变小,但分频数将会变大。在实际的设计中应综合考虑这两方面的因素,在尽量减小频率误差的前提下取合适的时钟频率。实际上,只要各个音符间的相对频率关系不变,演奏出的乐曲听起来都不会走调。

  设计的音乐电子琴选取12MHZ的系统时钟频率。在数控分频器模块,首先对时钟频率进行12分频,得到1MHZ的输入频率,然后再次分频得到各音符的频率。由于数控分频器输出的波形是脉宽极窄的脉冲波,为了更好的驱动扬声器发声,在到达扬声器之前需要均衡占空比,从而生成各音符对应频率的对称方波输出。这个过程实际上进行了一次二分频,频率变为原来的二分之一即0.5MHZ。

  因此,分频系数的计算可以按照下面的方法进行。以中音1为例,对应的频率值为523Hz,它的分频系数应该为:

基于FPGA的电子琴设计与实现,基于FPGA的电子琴设计与实现,第3张

  至于其他音符,可由上式求出对应的分频系数,这样利用程序可以很轻松地得到相应的乐声。

  各音名对应的分频系数如图2-2所示:

基于FPGA的电子琴设计与实现,基于FPGA的电子琴设计与实现,第4张

  音符的持续时间须根据乐曲的速度及每个音符的节拍数来确定。因此,要控制音符的音长,就必须知道乐曲的速度和每个音符所对应的节拍数。如果将全音符的持续时间设为1s的话,那么一拍所应该持续的时间为0.25秒,则只需要提供一个4HZ的时钟频率即可产生四分音符的时长。

  至于音长的控制,在自动演奏模块,每个乐曲的音符是按地址存放的,播放乐曲时按4HZ的时钟频率依次读取简谱,每个音符持续时间为0.25秒。如果乐谱中某个音符为三拍音长,那又该如何控制呢?其实只要在3个连续地址存放该音符,这时就会发三个0.25秒的音长,即持续了三拍的时间,通过这样一个简单的 *** 作就可以控制音长了。

  2.2.1分频模块设计方法

  方法一:使用加法计数器。在计数器值小于分频系数值时,保持分频的时钟信号不变,当计数器加到分频系数值时,令分频时钟信号发生跳变,同时将零设为此时的计数器值,这样分频时钟信号就会再次发生跳变。但是这种占空比不等于50%的信号是无法驱动实验板上的扬声器发声的。

  方法二:使用减法计数器,计数器的数值由分频系数值向下递减,在减为零时跳变并重新赋值,原理与第一种类似。

  方法三:先对时钟脉冲进行分频得到1MHZ的脉冲,然后按照输入的分频系数对1MHZ的再次分频,得到所需的音符频率,最后在音调输出时再进行二分频,将脉冲展开能够直接得到占空比为50%的分频信号,将脉冲展宽,使扬声器有足够发生功率。在思索一番后,最终确定了这一个方案,相比较与以上两种实现方法,这种方法的好处在于能够直接得到占空比为50%的分频信号。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2624609.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-11
下一篇 2022-08-11

发表评论

登录后才能评论

评论列表(0条)

保存