背景技术
一般的普通波形的再现、特别是乐器声音的再现,需要该声音的各主分量(primary component)的集合。当声音被适当处理时,可以产生该声音的副本。最精确但不切实际的方法是对该声音的记录-包括它在频率、起声(attack)等上的所有变化。实际的方法需要减少再现声音所需的参数量。在波表合成的情况下,在少量音调(pitch)周期上、在八度音程(octave)的子集上记录和采样每个乐器的声音。这些采样的声音记录被存储在波表中,并且声音再现的方法包括在该表上循环再现采样的声音记录。
FM合成方法可以复制乐器的声音,因此可以用作音乐再现的合成器。与其它音乐生成方法相比,FM合成对音乐再现处理所需要的存储量最少,同时还保持可接受的乐器声音的完整性。该合成方法需要小得多的ROM和/或RAM存储器,这是因为它只需要存储查找波表的集合中的预定义波形的一小部分。另一方面,波表合成需要大得多的存储量,以便达到可接受的性能水平。FM合成需要大约24KB的乐器合成数据(包括波形表和波形成型数据)的示例情况下,波表合成器将需要至少512KB的波表存储器。这是FM合成所需存储量的21倍。
除了由乐器所产生的不同声音的幅度包络外,乐器所产生的侧音(sidetone)产生使乐器有可以相互区别的音色。由于侧音是自然存在、并且可通过对预定义波形执行调频而分析得到的效果,因此可以使用音频FM合成来模拟乐器声音。这是通过匹配FM合成波形的侧音与实际乐器侧音实现的。最基本的FM合成音频发生器使用自调制的调制器频率和调制载波频率。
图1示出该基本FM合成音频发生器100的框图。FM合成音频发生器100使用调制器102的频率来执行自调制(103)以及调制载波104的频率。 由调制器频率
与调制器信号的部分βr[[n-1]之和,计算波形波表索引φ
m[n]。然后使用波形波表索引与波形查找波表106来生成第一序列输出采样W
1[n]。将增益系数(A
m[n])施加到该输出,得到r[n],其中r[n]=A
m[n]W
1[n]。然后该信号的延迟部分βr[n-1]被反馈到调制器,以计算下一采样的调制器波表索引。反馈的量是由增益系数(β)决定的,后者表示调制器的频率偏移。在施加了载波增益系数α后,调制器信号的部分αr[n]也被反馈用来调制载波频率。载波频率
与αr[n]相加,得到波表索引φ
c[n]。使用该值与波表108来产生第二序列输出采样W
2[n]。然后施加载波增益系数(A
c[n])来获得最终的模拟乐器声音S
FM[n],其中S
FM[n]=A
c[n]W
2[n]。使用这种类型的合成只需要几个波形波表。例如,可以使用6个波形波表来再现所有的128种一般MIDI乐器和47种一般MIDI鼓。
由于小的波表带来经济上的好处,因此可以选择FM合成作为音乐再现的音频发生器。对于这种合成方法,位于查找波表中的这个较小的波形集合将需要小得多的ROM和/或RAM存储器。
在一个实现中,查找波形波表包含完整周期的所有必要波形。软件算法计算由载波和调制器频率所计算出的波表步长索引。该步长索引被累加并用来获得适当波表中的载波和调制器波形的采样。可以使用简单的卷绕算法(wrapping algorithm)(周期模运算)来再现连续的波形流。该单周期卷绕算法只要求重新产生载波和调制器波形所需的最小数量的指令周期。
在另一实现中,可以利用波形的对称性来大大减少存储器大小,这是因为只需要波形之一部分周期(例如,1/4周期或1/2周期)来生成所有波形。通过存储的周期分段,可以进一步产生复杂的波形。这要求更复杂的软件波表查找算法。该查找算法需要计算累加的波表索引的段,需要在缩短周期和完整周期上执行模算术运算,需要进行索引的移动(shift)来调节步长,并且需要使用段修正(segment modification)的波表来在段内缩放(scale)波形。
然而,当今FM合成系统使用的常规波表查找算法有几个缺点。对于上述第一种实现,由于存储完整周期的波形,因此可能需要较大的存储器件。 同样地,当需要存储更多波表时,需要较大的存储器件。大的存储器件可能占用较大的物理面积,从而增加芯片大小、成本、以及芯片的功耗。对大存储器件的存取时间也比小存储器件的要高,因此也可能出现违反定时(timingviolation)。违反定时的问题通常修复起来是很昂贵的。
对于上述利用波形周期的对称性和相似性的第二种实现,需要较小的存储器件,这是以增加指令周期使用率为代价的。这种增加是有很大影响的,并且在FM合成中被加倍,这是因为每个采样存取波表两次,一次用于调制器频率,一次用于载波频率。
因此,希望实现一种波表查找算法,可以减少存储器大小以及处理器负载。
具体实施方式
下面将提供对可适用硬件和软件的波形生成方法和系统的详细描述,它可以用硬件实现波表查找算法,从而消除了由于更复杂的算法而导致的处理周期的增加。本发明可以同时减少存储器大小、存储器存取时间和处理器指令周期使用率。
前面已经作为本发明的相关背景描述和讨论了图1。这里不需要进一步讨论。
为了获得期望的波形,首先必需选择原型波形,然后适当地对其分段和进行幅度调整。然后使用经过分段和幅度调整的原型波形来生成期望的、并且常常更复杂的波形。原型波形的选择取决于应用。例如,在音频FM合成中,原型波形可以是正弦、锯齿、斜坡或指数波。可以使用任何波形作为原型波形,只要它具有可利用的对称性。
图2A示出用2N个采样的周期指定的原型波形200,其中N是整数。然后它被分成2K个等距离的段(segment),每个段具有2N-K个采样。通过划分原型波形200,可以利用波形200的对称性,从而允许生成大量可能的输出波形。例如,假设N=11且K=2,则将有211或者2048个采样,以及22或4个段,其中每个段具有512个采样。
可以使用存储表来存储原型波形的一个或多个连续段。用于存储该信息的存储表可以是RAM或ROM。然而,可以实施其它存储数据的方法(例如,触发器)来满足特定实现的设计准则。存储表具有至少等于2M个采样的长度,其中M满足关系N-K<=M<=N。例如,假设N=11,K=2且M=10,则对于波形的一个周期将有2048个采样和4个段,其中每个段具有512个采样。在这个示例中,存储器将包含210或1024个采样。
图2B示出使用前述划分技术、由原型波形200生成的七个波形(a~g),其中K=1且M=N。这些波形仅仅是示例,并且由原型波形200还可以生成许多其它波形。
使用与图2A相同的原型波形200,通过将原型波形200划分成更多段, 其数量由K定义,更增加其复杂度。此外,加倍或减半波表的步长,可以增加或降低波形的频率。这可以通过将步长值右移位或左移位(乘以或除以2)来完成。
图2C示出可以通过将段的数量增加到8、以及将原型波形的段进行左移位或右移位生成的三种可能的波形。
图3是示出根据本发明一个实施例的建议的波形生成系统300的总的构思的框图。波形生成系统300展示了下面三个硬件器件(数字信号处理(DSP)模块302、存储接口模块304和存储器件306)之间的关系。存储器件306被设计成包含原型波形(如图2A所示的原型波形200)的一个或多个连续段。DSP模块302可以通过存储接口模块304存取存储器件306内的波形。存储接口模块304生成为了从存储器件306中读取所需的地址和其它信号。存储接口模块304还被设计成根据由DSP模块302编程的存储接口模块304内的控制寄存器(未示出),来修改输出数据,并且该修改的数据被DSP模块302读取。
要注意,该算法或方法的软件实现不仅需要周期的模算术运算,还需要用于实际存储的部分周期的模算术运算。还需要进行段的模算术运算来指示该段,并且需要定义新的表来对所有期望波形指定每段的极性。
存储接口模块304被设计成根据波表相位步长(phase step)执行周期、部分周期和段模算术运算。存取大小被缩减的波形的表和段极性的表,来产生采样输出。用软件执行所有的操作会导致使用较多的周期,因此最好使用硬件实现的存储接口。
在FM合成期间,进行调制器采样处理之后是载波采样处理。在采样处理期间,使用该方法的软件计算对每个采样的相位步长。该相位步长值和波形原型被送到存储接口硬件。在这里首先执行周期、部分周期和段模算术运算,然后施加段的极性修正(不变、求反、或者0),来产生输出采样值。
图4是示出根据本发明一个实施例的、更详细的波形生成系统400的框图。波形生成系统400包括处理器302,在该示例中它是与数据存储模块306相接的一DSP,数据存储模块306可以包括RAM、ROM或者这两者。处理器302还与存储接口模块304相接,后者包括移位逻辑器件408、多路器410、段修正矩阵表412、修正逻辑414、以及两组寄存器416和418。寄存器组416包括TableModCfgReg[0]寄存器和TableModCfgReg[1]寄存器,而寄存器组418 包括TableIndexReg[0]寄存器和TableIndexReg[1]寄存器。本实施例还实现波形波表存储模块420,它包括RAM和/或ROM,用于存储构成原型波形的部分周期(例如,1/2周期)的2M个采样。处理器302被设计成具有对数据存储模块404的直接存取,而波形波表存储模块420内的数据只能通过存储接口304存取。
在波形生成的开始,处理器302向寄存器组416内的寄存器TableModCfgReg[0]和TableModCfgReg[1]进行写入。这些寄存器416可以包含在整个波形的处理和生成中需要的信息,如用于选择一行的段修正矩阵表412的指针。当执行调制器采样处理时使用TableModCfgReg[0]寄存器。当执行载波采样处理时使用TableModCfgReg[1]寄存器。段修正矩阵表412包含Y行(Y是整数),每个要求的波形一行,段修正矩阵表412并且包含2K=X列(X是整数),原型波形的每个段是一列。例如,如果段修正矩阵表412支持6个波形,并且原型波形被分成4个段(四分部),则Y等于6,并且X等于4。因此对于这个示例,段修正矩阵表412具有6×4的尺寸。TableIndexReg[0,1]418提供的信号Col_sel确定将选择段修正矩阵表412的哪一列。段修正矩阵表412的每列包含控制位,可以使用到它原型波形的相应段的修正逻辑414。
每行矩阵包括2K个段乘法器,用于载波波形和再现调制器的完整周期。使用段修正矩阵表412的输出来修正读取的存储器输出数据。表1示出段修正矩阵表412的样本内容。当行和列被选择时,在所选行和列上的特定数字或键值将被选中并送到修正逻辑414。
01 |
01 |
11 |
11 |
01 |
11 |
00 |
00 |
01 |
00 |
01 |
00 |
... |
... |
... |
... |
01 |
01 |
01 |
01 |
表1
修正逻辑414得到段修正矩阵表412的输出,并且根据所选键值修正数据。在一个预定键值集合示例中,可以使用2位的键值,如表2所示,其中 00表示0输出,01表示不改变,而11表示求反。要注意,可以使用其它选项和/或键值来满足具体实现的设计准则。
段修正矩阵表输出 |
修正逻辑输出 |
00 |
0输出 |
01 |
不变 |
11 |
求反 |
表2
处理器302计算波表步长索引,并且将该值写入寄存器组TableIndexReg[0,1]418中的寄存器之一。由于生成FM合成波形要求调制器采样处理后面跟着载波采样处理,因此当执行调制器采样处理时使用TableIndexReg[0]寄存器,而当执行载波采样处理时使用TableIndexReg[1]寄存器。处理器302每次采样都向寄存器组418中的每个寄存器写入一次。
寄存器组TableIndexReg[0,1]418中的值可以被移位逻辑器件408移位,并且移位后的值成为用于读取波表存储器420的地址。从波表存储器420输出的数据可以被修正逻辑414修正,并且将修正后的数据值放在处理器302的输入数据总线上。
对于移位逻辑器件408,SFT_RIGHT操作基2的移位以增加或减少波形的频率。对于SFT_RIGHT=0,原始波形的频率保持不变。对于SFT_RIGHT=1,频率加倍,而对于SFT_RIGHT=-1,频率减半。根据移位逻辑器件408提供的地址,读取操作从波表存储模块420中进行读取。
处理器302的数据空间可以包括数据存储器404,用于支持与本发明无关的其它功能。处理器302具有对数据存储器404的直接存取。读取的数据通过多路器410进入处理器302的输入数据总线。当存在不止一个源可以将数据放在处理器302的输入数据总线时,需要多路器410。
要注意,尽管数据存储模块404和波表存储模块420被描绘为两个逻辑存储模块,但它们也可以被合并成物理存储器的一个连续模块。在这种情况下,需要另外的逻辑(例如,图4中未示出的译码器和多路器),以便允许处理器302在需要时对数据存储器直接存取,或者在处理器生成FM合成波形时通过存储接口304进行存取。
图5A示出图4所示的建议的波形生成系统使用四段生成的一些示例性波形。图5A(a)示出原型波形。图5A(b)示出载入图4中所示的波表存储器420中的缩减波形。图5A(c)示出特定的生成波形,其中虚椭圆线502内的数字是从段修正矩阵表412中提取的修正值,而垂直虚直线506标出段修正矩阵表412的列的变换。在随后的图中,除非另外标注,否则圈起的数字502和垂直虚直线506将具有相同的定义,因此将不再重复说明。除了图5A(c)到(h)中所示的段修正矩阵表内的修正值不同外,其SFT_RIGHT值也不同。表3表示用于生成各个波形(c)到(h)的SFT_RIGHT值。
FIG.5A |
SFT_right |
(c) |
0 |
(d) |
1 |
(e) |
0 |
(f) |
2 |
(g) |
-1 |
(h) |
-2 |
表3
图5B示出图4所示的建议的波形生成系统使用八段生成的一些示例性波形。图5B(a)示出原型波形。图5B(b)示出载入图4中所示的波表存储器420中的缩减波形。图5B(c)~(h)示出使用段修正矩阵表412(图4)的不同修正值生成的波形,修正值在每个波形中标注出,并且在下面表4中显示不同的SFT_RIGHT值。
FIG.5B |
SFT_right |
(c) |
0 |
(d) |
1 |
(e) |
0 |
表4
图6是示出根据本发明另一实施例的、更复杂的波形生成系统600的实现的详细框图。除了对存储接口模块304进行了修改以外,波形生成系统600与图4的系统400相似,其中存储接口模块304使用了地址偏移之和以及幅度偏移之和。与图4的系统400相同,系统600仍使用处理器302、数据存储模块404和波表存储模块420。在存储接口模块304内,寄存器组416和418、移位逻辑器件408、多路器410和修正逻辑414仍以相同的方式实现。存储接口模块304可以包含幅度偏移之和。本实施例的实现包括触发器和XOR逻辑门的简单比较器626,来检测到新段的变换。对于每个段的变换,存储一值,其可以是前一段的最后值或者是预定偏移。根据段修正矩阵表612中的额外控制位,每个段变换的存储值可以被加到当前段的所有值的修正逻辑414的输出上。存储接口模块304可以包含地址偏移之和。段修正矩阵表612的每列除了其它控制位外,还可以包含偏移地址。本发明可以实现其它提供偏移地址的方式(例如,单独的查找表)来满足特定实现的设计准则。然后对于特定段的所有采样,所存储的偏移地址被加到来自移位逻辑器件408的计算出的地址上,并且在对波表存储模块420的存取中使用累加的地址。由于每个段乘法器包含额外的控制位和偏移地址,因此对该设计使用不同的段修正矩阵表612。表5示出包含M=10、N=11、K=2时的偏移地址和其它控制位的新段修正矩阵表612的样本内容。结果是用可利用的频谱特性生成更复杂的波形。图7A~7C中示出了这些复杂波形的一些示例。
图 |
段1 |
段2 |
段3 |
段4 |
7A(c) |
0000000000001 |
1111111111111 |
0000000000001 |
1111111111111 |
7A(d) |
0000000000001 |
1111111111111 |
01111111111101 |
0000000000011 |
7A(e) |
0111111111111 |
1111111111101 |
0111111111111 |
1111111111101 |
表5
图7A示出图6所示的建议的波形生成系统所生成的一些示例性波形。在生成这些波形时使用了四个段。图7A(a)示出原型波形。图7A(b)示出载入波形生成系统600的波表存储器中的缩减波形。段修正矩阵表612和SFT_RIGHT以及执行波形生成时使用的偏移参数的值显示在图7A的各个波形后面。参数“Offset Sum”代表幅度偏移之和,而参数“Offset Addr”代表偏移地址。这些值和参数也在图7B和7C中显示在它们各自波形的后面,因此当讨论这些图时不再注解它们。
图7B示出图6所示的建议的波形生成系统所生成的独特唯一的波形。在生成这些波形时也使用了四个段。图7B(a)示出原型波形。图7B(b)示出载入波形生成系统的波表存储器中的缩减波形。使用该设计,可以生成如图7B(c)所示的方波。
图7C示出图6所示的建议的波形生成系统所生成的另两个波形。这里,在生成这些波形时使用了八个段。图7C(a)示出原型波形。图7C(b)示出载入波形生成系统的波表存储器中的缩减波形。图7C(c)和(d)是使用波形后面显示的值和参数生成的复杂波形。
生成这样复杂的波形本来要求指令和数据的大量增加,然而,利用修改存储接口和添加几个逻辑门,并且可以保持相同的软件操作,以生成更复杂的波形并不增加处理器302的指令周期使用率。
使用该方法,当原型波形被分成多个段时,可以产生具有较高复杂度的其它FM波形,可能可以提高乐器声音的复制。
除了前面段落中所述之外,在不背离本发明宗旨和范围的前提下,对存储接口模块304的其它修改和各种改变也是可能的,以便生成FM合成波形或任何其它类型的波形。
图8是示出根据本发明实施例的复杂波表查找算法的实现方法800的流程图。在步骤801中,DSP在采样处理前预先加载寄存器TableModCfgReg[0]和TableModCfgReg[1]的配置参数。这些寄存器是在调制器和载波采样处理期间使用的段极性修正矩阵的地址。该矩阵包括段乘法器,用于再现调制器处理和载波处理波形的周期。当在步骤804和806中执行调制器采样处理时,使用TableModCfgReg[0]寄存器。当在步骤808和810中执行载波采样处理时, 使用TableModCfgReg[1]寄存器。寄存器可以包含段修正矩阵表的行选择,选择要在整个调制器和载波采样处理中使用的波形波表。寄存器可以包含右移位操作的长度。
在步骤802中,DSP每采样后便加载一次寄存器TableIndexReg[0,1]。这些寄存器确定可以选择段修正矩阵表的哪列(参照图4和6)。由于生成FM合成波形要求调制器采样处理后面跟着执行载波采样处理,因此当执行调制器采样处理时使用TableIndexReg[0]寄存器,而当执行载波采样处理时使用TableIndexReg[1]寄存器。
由于原型波形每周期具有2N(例如,2048)个采样,因此对累加的波表索引执行模(2N-1)算术运算,以便在步骤804中进行调制器处理和步骤808中进行载波处理。该操作是处理器自动执行的,处理器将x位值写入到TableIndexRegX[N-1:0]寄存器(X=0或1)。对于N=11,模算术运算在0×7FF(或2047)的值上进行。
下面描述步骤806或810的波形处理的细节。该寄存器TableIndexRegX[N-1:N-1-K]的‘N-1’到‘N-1-K’位决定波形的段。这些位用于寻址段修正矩阵的相应列,该列提供对该段的极性。例如,对于N=11和K=2,波表索引将在值0×7FF绕回,并且表6中定义了4段(2K=4):
段 |
COL_SEL |
位地址 |
段1 段2 段3 段4 |
00 01 10 11
|
0到0x1FF 0x200到0x3FF 0x400到0x5FF 0x600到0x7FF |
表6
在步骤806或810中,TableIndexRegX[N-1:0]寄存器被向右移位(SFT_RIGHT)其值所指出的长度(或len)。SFT_RIGHT操作实现两个功能:(1)执行部分周期模(2M-1)算术运算,和(2)调整原型波形频率。模(2M-1)算术运算起到这样的作用:使波表索引围着存储器中存储的部分波形周期的全部或一部分大小绕回。例如,对于N=11和M=10,只有全部周期(2N个采样)的1/2保存在存储器中。因此,len将为N-M,或者1。对于大于1的整 数值,每次移位起到加倍原型波形的频率的作用。对于len=1,原型波形的频率仍然相同,并且右移位操作只起到围着波形的1/2周期绕回的作用。对于len=2和3,原型波形将分别在频率上加倍和四倍。得到的值用作到所存储的波形波表的地址,以从中提取采样值。
处理器从预定义的地址进行读取,根据计算出的地址从波表存储器中的读取。采样值被段修正矩阵值修正(乘以0、1或-1)以产生由处理器读取的最终采样值。
在步骤812中,处理器检查是否达到了每个块的预定数量的采样,如果没有,则处理器将通过重新开始步骤802来进行另一回合的调制器处理和载波处理,否则,处理器将退出处理。
要注意,本发明可以在码分多址(CDMA)芯片组的部件中使用。尽管本发明可以用于CDMA设计,但对于其它设计,也可以应用本发明来生成FM波形或任何其它类型的波形。
上面的描述提供了许多不同实施例或者用于实现本发明不同特征的实施例。描述了组件和处理的特定实施例以便帮助明了本发明。这些当然仅仅是实施例,而非意图限制权利要求书所述的本发明。
尽管这里将本发明说明和描述为在一个或多个特定示例中实现的,但它并不限于所示的细节,因为在不背离本发明宗旨的前提下、在权利要求书的等效范畴和范围内,可以对其进行各种修改和结构变化。因此,应当以与权利要求书所述的本发明范围一致的方式来广义地解释权利要求书。