文本阅读:
9.7示例237
9.7.4相位声码器时间弯曲器
相位声码器通常指这样一种通用技术:把(复值的)频道幅度变成由(实值的)模和相位进动速率("频率")构成的数据对,然后返回,如图9.11(章节9.5)描述的那样。在示例107.phase.vocoder.pd(图9.18)中,我们使用这种技术来完成特定的目的:以实时控制的方式对一个录好的声音进行时间拉伸和/或时间压缩。也就是说,我们可以在任意时刻实时地控制我们所听到的被录制声音的位置。这里使用了2个新对象:
【Irshift~:(根据其创建参数)向左或向右平移一个块。如果这个参数是正的,则输出的每个块都是输入被向右平移该数量的距离所得到的结果,如果需要的话会在左端填充若干个0。若这个参数为负则向左平移,并会在右端填充0。
La8_rsqrt~:快速计算出平方根的倒数的近似值。输出为输入的平方根的倒数,精度达到1/256,它比全精度的平方根倒数的计算量小很多。
这个过程由一个子音色pdread-windows开始,它输出2个块的汉宁加窗的录制声音,
"前"一块的读取位置比"后"一块超前1/4个窗长。所示的窗使用了子音色的2个输出,用来管理每个频道自身输出的幅度和相位变化。
顶部的2个tabreceive~对象调用了前一个块中被送往底部rifft~对象的复幅度,相当于章节9.5讨论中的S【m-1,k】。这个音色总体上是计算出S【m,k】,然后计算出其汉宁加窗的傅里叶反变换作为输出。
在对S【m-1,k】归一化以后,其复共辄(经过归一化的相反数)被乘以"后"窗T【k】的加窗傅里叶变换,得到乘积R【k】(第230页)。接下来,根据参数"lock(锁定)"的值,刚计算出的R【k】会有条件地被锁相版本R【k】替代。这是通过Irshift~对象完成的,如果"lock"
为1,则其输出被加到R【k】上,否则,"lock"若是0,则不加到R【k】上。所得结果随后被归一化,并乘以"前""窗(T【k】)的汉宁加窗傅里叶变换,得出S【m,k】。
Pd所带的示例中还有傅里叶分析/重合成的3种其他应用,它们未在这里示出。首先,示例108.pvoc.reverb.pd展示了如何制作这样一个相位声码器:它的输出如混响器一样循环,只不过当输入比已经在循环的声音更强时,用输入替换各个频道。所得结果是一个比使用延时线的经典方法所产生的声音更内聚的混响效果。
示例109.sheep.from.goats.pd演示的是一种(不完美的)技术,它基于一个汉宁加窗正弦的相位相干性,逐个频道地从有噪声的声音中分离出具有音高的信号。如果3个相邻频道彼此的相位接近相差t弧度,则可以判别它们同属于一个正弦峰。属于正弦峰的频道用0替换,从而提取出信号中的噪声部分,或是把所有其他部分用0替代而提取出正弦部分。