我正在进行图像到声音的项目,并试图在SuperCollider.中实现加性合成。我想使用逆DFFT对(数百)正弦波进行求和,而不是为每个正弦波创建一个SinOsc合成器。
所有SuperCollider文档都指出,IFFT使用FFT (并由PV_*函数转换)生成的称为"FFT链“的东西:
Time-domain signal -> FFT -> [PV_* -> PV_* -> ...] -> IFFT但对于我的应用,我不需要FFT阶段,因为我已经知道我的信号是如何表示在频域。我想要的是:
Frequency-domain signal -> Manually constructed FFT chain -> IFFT“频域信号”是一系列numpy数组,表示我在Python应用程序中已经拥有的频域信号。因此,我需要将这些信息传递给SuperCollider。
据我所知,FFT链意味着某种数据流,但我不知道如何手动将数据写入其中。
我也尝试过使用静音FFT链(例如,get FTT of Silence.ar),但我也不知道如何手动设置单个频率桶。
发布于 2017-10-17 23:59:41
这里有几个选择。
.pvcollect和.pvcalc方法的ChainUGen。(例如,请参阅code文件中的代码。)理论上,您可以使用Array作为SynthDef参数,并使用它任意设置运行中的synth的大小和阶段。在实践中,我发现这是一种脆弱的方法: SC对FFT块大小很挑剔(它们受到音频设备块大小的限制);非常大的SynthDefs是有问题的;而且不管怎么说,语法都非常糟糕。FSinOsc UGen,它使用非常有效的正弦近似,或者DynKlang,它使用数组引用。
下面是一个有1000个FSinOsc实例的例子,它发出了一种安静的隆隆声;它目前正在我的i5 Macbook上使用22%的CPU (这包括任意摇摄每个振荡器):
S= Server.local;s.waitForBoot {n= 1000;~freq = Array.rand(n,20.0,60.0).midicps;~amp = Array.rand(n,1/n * 0.01,1/n * 0.5);~pan= Array.rand(n,-1.0,1.0);~sines = Array.fill(n,{ arg i;{ Pan2.ar( FSinOsc.ar(~freqi,0,~ampi),~pani) }.play;};当然,选项1的效率要高得多--看起来大约是10倍,但是简单来说,你不能超过选项3。
https://stackoverflow.com/questions/46786573
复制相似问题