文本阅读:
7.7可变平移与分数平移159
首先,我们仅定义了当d为整数值的时间平移,因为若d为分数值,则当x【n】仅对整数的n值有定义时,x【n-d】这类表达式的值是不能确定的。为了产生分数的延时,我们必须引入某种适当的内插方案。并且,如果我们希望d随时间平滑地变化的话,简单地让其从一个整数值跳到下一个整数值并不会产生好的结果。
其次,即使我们已经实现了让延时时间平滑地改变,由变化的延时时间所引起的各种人造声也会变得容易察觉,即使变化的相对速率非常小;虽然大多数情况下你可以在30ms内让一个幅度控制在任意2个值之间完成斜变,并且不会引起什么麻烦,但是,改变一个延时让其每100个样点变化1个样点就会产生1个非常容易察觉的音高平移--当然,我们经常会刻意改变1个延时以求听出人造声,仅仅是偶然地才会让一个指定的延时时间值变化至另外一个值。
第1种情况(分数的延时)可以用一种内插方案来处理,与在波表查找中采用的方式完全一样(章节2.5)。例如,假设我们想要一个d=1.5个样点的延时。对于每个n,我们必须为x【n-1.5】估计一个值。我们可以使用标准的4点内插来做,让一个3次多项式通过4个"已知"点(0,x【n】),(1,x对n-1】),(2,x【n-2】),(3,x【n-3),然后求出该多项式在点1.5处的值。为每个n的取值都重复做这样的运算,就能得出被延时的信号。
这种4点内插方案可以用于任何不低于一个样点的延时。少于一个样点的延时无法用这种方法计算,因为为了得到所需延时我们至少需要之前最近的2个输入点。在上例中这2个点是能够获得的,但比如当延时时间为0.5个样点时,我们就需要计算x【n+1】的值,它是一个未来的点。
可以通过使用更高阶的内插方案来提高估计的准确度。不过,在质量与计算效率方面有一个折中。并且,如果我们采用更高阶的内插方案,最小可能的延时时间将增大,这在某些情况下会产生麻烦。
第2个要考虑的事情是由变化的延时线所引起的人造声--不管是你想要的还是不想要的。一般来说,延时时间的一个不连续的改变将引起输出信号中的一个不连续改变,因为这实际上是在某一点处将其打断,并令其跳至另外一个值上。如果输入是一个正弦,则结果是一个不连续的相位改变。
如果我们想让延时线在几个固定的延时时间(比如一些音符的开始处)之间偶发性地改变,那么我们可以使用4.3小节介绍的管理偶发不连续点的方法。实际上这些方法的工作方式都是通过某种途径对输出进行静音。另一方面,如果需要连续地改变延时时间--当我们正在聆听输出时--那么必须要把这些改变所引起的人造声考虑进来。
图7.17所示为一个可变延时线的输入与输出时间的关系。假设该延时线有一个固定的最大长度D。在输出的每个样点(相当于横轴上的点)处,我们输出一个来自于(可能是经过内插的)延时线输入的样点。纵轴所示为使用输入信号中的哪个样点(整数的或分数的)。