使用GLSL进行频率调制?

时间:2012-07-31 15:32:34

标签: audio glsl signal-processing

1。上下文

我正在使用GLSL绘制给定频率的波形的幅度,如下所示:

GLSL plot

显示如上所述的简单波形是一项微不足道的任务,只需使用正确的方程式(GLSL摘录代码可用here)。我现在要做的是在两个波形之间显示频率调制的结果。


2。研究

经过一番研究后,我发现了两种可能的方法来实现这一目标:

  1. 使用类似dsp的方法,据我所知,使用相位累加器(参见first answer here)与查找表结合使用处理信号处理时的建议方法。作为一名GLSL初学者,我理解这对于GLSL着色器来说是不可能的,因为它们不能在多个GPU周期内存储和增加变量。

  2. 使用纯数学方法,这涉及像Chowning simple fm formula这样的方程式。 FM formula http://img577.imageshack.us/img577/4820/fmformula.png
    该公式在某些情况下效果很好(cosine wave modulating another cosinecosine modulating a sawtooth),但我无法找到适用于所有情况的一般公式(当锯齿波调制时一个余弦我期待the carrier frequency to be modulated by sawtooth amplitude,但我得到的只是显然没有调制的载波。


  3. 3。问题

    • 解决这个问题的最佳方法是什么?
    • GLSL是否可以采用类似dsp的方法?
    • 如果没有,是否有任何一般FM调整方程足以完成所有工作?

    考虑到我在这里涉及的所有学科(音频dsp,计算机科学,gpu编程,数学)缺乏技能,如果我在这里缺少一些非常简单的东西,我不会感到惊讶。请耐心等待。

1 个答案:

答案 0 :(得分:3)

你是对的,相位累加器通常类似dsp的方法不适合GPU上的并行计算;因此,“纯数学”方法可能是最好的选择。

Chowning的简单FM公式对更一般的频率调制函数的推广在Wikipedia page for Frequency Modulation(该页面上的第一个等式)上给出。关键点在于cos函数的参数是阶段,正如维基百科上的等式所示,它是频率的时间积分。在FM中,频率通常是载波加调制:例如,使用Chowning的简单正弦FM公式,频率作为时间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,而不是。{/ p>