Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Audio 使用GLSL的频率调制? 1.上下文_Audio_Glsl_Signal Processing - Fatal编程技术网

Audio 使用GLSL的频率调制? 1.上下文

Audio 使用GLSL的频率调制? 1.上下文,audio,glsl,signal-processing,Audio,Glsl,Signal Processing,我用它来绘制给定频率下波形的振幅,如下所示: 显示像上面那样的简单波形是一项简单的任务,只需使用正确的方程(GLSL摘录代码可用)。我现在要做的是显示两个波形之间频率调制的结果 2.研究 经过一些研究,我发现了两种可能的方法来实现这一点: 使用类似dsp的方法,据我所知,使用相位累加器(请参阅)结合查找表是处理信号处理时的建议方法。作为一名GLSL初学者,我知道这在GLSL着色器中是不可能的,因为它们不能跨多个GPU周期存储和增加变量 使用纯数学方法,这涉及像Chowning这样的方程。

我用它来绘制给定频率下波形的振幅,如下所示:

显示像上面那样的简单波形是一项简单的任务,只需使用正确的方程(GLSL摘录代码可用)。我现在要做的是显示两个波形之间频率调制的结果


2.研究 经过一些研究,我发现了两种可能的方法来实现这一点:

  • 使用类似dsp的方法,据我所知,使用相位累加器(请参阅)结合查找表是处理信号处理时的建议方法。作为一名GLSL初学者,我知道这在GLSL着色器中是不可能的,因为它们不能跨多个GPU周期存储和增加变量

  • 使用纯数学方法,这涉及像Chowning这样的方程。
    这个公式在某些情况下非常有效(或者),但我无法找到一个在所有情况下都有效的通用公式(当锯齿波调制余弦时,我希望如此,但我得到的只是载波显然未调制)


  • 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任务。