首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SuperCollider中设置快速傅立叶变换链的单个桶

在SuperCollider中设置快速傅立叶变换链的单个桶
EN

Stack Overflow用户
提问于 2017-10-17 09:13:36
回答 1查看 500关注 0票数 2

我正在进行图像到声音的项目,并试图在SuperCollider.中实现加性合成。我想使用逆DFFT对(数百)正弦波进行求和,而不是为每个正弦波创建一个SinOsc合成器。

所有SuperCollider文档都指出,IFFT使用FFT (并由PV_*函数转换)生成的称为"FFT链“的东西:

代码语言:javascript
复制
Time-domain signal -> FFT -> [PV_* -> PV_* -> ...] -> IFFT

但对于我的应用,我不需要FFT阶段,因为我已经知道我的信号是如何表示在频域。我想要的是:

代码语言:javascript
复制
Frequency-domain signal -> Manually constructed FFT chain -> IFFT

“频域信号”是一系列numpy数组,表示我在Python应用程序中已经拥有的频域信号。因此,我需要将这些信息传递给SuperCollider。

据我所知,FFT链意味着某种数据流,但我不知道如何手动将数据写入其中。

我也尝试过使用静音FFT链(例如,get FTT of Silence.ar),但我也不知道如何手动设置单个频率桶。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-17 23:59:41

这里有几个选择。

  1. 使用PackFFT Ugen。这允许您使用任意大小和相位的UGens数组。下面是一个示例,希望您的目的比帮助文件中的目标更清楚: S= Server.local;s.waitForBoot {例程{n= 512;//大规模多通道控制总线~magBus = Bus.control(s,n);~phaseBus = Bus.control(s,n);s.sync;~synth ={ var mags,相位,链,snd;mags = n.collect ({ {x= In.kr(~magBus.index + i) });位相= n.collect ({ \x=i,In.kr(~phaseBus.index + i) });chain = FFT(LocalBuf(n*2),Silent.ar);chain = PackFFT(chain,n,mags,phases.flop.flatten);Out.ar(0,IFFT(chain).dup);}.play(s);s.sync;//以随机顺序提高每一个垃圾量。//最终导致宽带噪音,所以注意你的耳朵.Array.series(n).scramble.do({ arg i;i.postln;~magBus.setAt(i,-16.dbamp.rand);(0.01 + 0.2.rand).wait;});}.play;}; 请注意,这里的FFT缓冲区的大小是频带数的两倍。我相信这是正确的,但不是百分之百肯定。
  2. 使用.pvcollect.pvcalc方法的ChainUGen。(例如,请参阅code文件中的代码。)理论上,您可以使用Array作为SynthDef参数,并使用它任意设置运行中的synth的大小和阶段。在实践中,我发现这是一种脆弱的方法: SC对FFT块大小很挑剔(它们受到音频设备块大小的限制);非常大的SynthDefs是有问题的;而且不管怎么说,语法都非常糟糕。
  3. 实际上,我不会直接使用正弦波,特别是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。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46786573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档