Audio 使用GLSL的频率调制? 1.上下文
我用它来绘制给定频率下波形的振幅,如下所示: 显示像上面那样的简单波形是一项简单的任务,只需使用正确的方程(GLSL摘录代码可用)。我现在要做的是显示两个波形之间频率调制的结果Audio 使用GLSL的频率调制? 1.上下文,audio,glsl,signal-processing,Audio,Glsl,Signal Processing,我用它来绘制给定频率下波形的振幅,如下所示: 显示像上面那样的简单波形是一项简单的任务,只需使用正确的方程(GLSL摘录代码可用)。我现在要做的是显示两个波形之间频率调制的结果 2.研究 经过一些研究,我发现了两种可能的方法来实现这一点: 使用类似dsp的方法,据我所知,使用相位累加器(请参阅)结合查找表是处理信号处理时的建议方法。作为一名GLSL初学者,我知道这在GLSL着色器中是不可能的,因为它们不能跨多个GPU周期存储和增加变量 使用纯数学方法,这涉及像Chowning这样的方程。
2.研究 经过一些研究,我发现了两种可能的方法来实现这一点:
这个公式在某些情况下非常有效(或者),但我无法找到一个在所有情况下都有效的通用公式(当锯齿波调制余弦时,我希望如此,但我得到的只是载波显然未调制)
3.问题
- 解决这个问题的最佳方法是什么李>
- GLSL是否可以采用类似dsp的方法李>
- 如果没有,是否有足够灵活的通用FM方程式来完成所有工作
考虑到我在这里涉及的所有学科(音频dsp、计算机科学、gpu编程、数学)都缺乏技能,如果我在这里遗漏了一些非常简单的东西,我不会感到惊讶。请耐心等待。你是对的,通常的类似dsp的相位累加器方法不太适合GPU上的并行计算;因此,“纯数学”方法可能是最好的选择 将Chowning的简单调频公式推广到更一般的调频函数,见(该页上的第一个等式)。关键的一点是cos函数的参数是相位,正如维基百科上的等式所示,相位是频率的时间积分。在调频中,频率通常是载波加调制:例如,根据Chowning的简单正弦调频公式,频率作为时间的函数
t
为
f(t) = f_c - M * f_m * sin(f_m * t)
其中,f_c
是载波频率,M
是调制量,f_M
是调制频率。这与阶段相结合
p(t) = f_c * t + M * cos(f_m * t)
对应于你问题中方程的相位
要用锯齿波调制余弦,f(t)
将是锯齿波(加上载波频率),因此要求p(t)
需要求锯齿波的时间积分。这相对简单(它应该是一个分段二次函数),但是math.stackexchange的人员应该能够在您遇到困难时提供帮助
(注意:我在这里用时间
t
,但这也可以是空间,x
。我建议从CPU实现开始。有了CPU实现后,将其移植到GPU应该相当简单。您可能会更好地使用CUDA、ATIStream或OpenCL而不是GLSL,除非您只想看到波形的样子。GLSL的设计并没有真正考虑GPGPU任务。