audio - 使用 GLSL 进行频率调制?

标签 audio glsl signal-processing

1. 背景

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

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

2. 研究

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

  • 使用类似 dsp 的方法 ,据我所知,使用相位累加器(参见 first answer here )与查找表是在处理信号时建议的方法。作为 GLSL 初学者,我明白这对于 GLSL 着色器是不可能的,因为它们无法跨多个 GPU 周期存储和递增变量。
  • 使用纯数学方法 ,这涉及像 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. 问题
  • 解决此问题的最佳方法是什么?
  • GLSL 是否可以使用类似 dsp 的方法?
  • 如果没有,是否有足够灵活的通用 FM 方程来完成所有工作?

  • 考虑到我在此处涉及的所有学科(音频 DSP、计算机科学、GPU 编程、数学)方面缺乏技能,如果我在这里遗漏了一些非常简单的东西,我不会感到惊讶。请耐心等待。

    最佳答案

    你是对的,相位累加器的通常类似 dsp 的方法不太适合 GPU 上的并行计算;因此,“纯数学”方法可能是最好的选择。
    Wikipedia page for Frequency Modulation(该页的第一个方程)上给出了 Chowning 的简单 FM 公式对更一般频率调制函数的推广。关键点是 cos 函数的参数是相位,正如维基百科上的方程所示,它是频率的时间积分。在 FM 中,频率通常是一个载波加上一个调制:例如,对于简单正弦 FM 的 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 。)

    关于audio - 使用 GLSL 进行频率调制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11743715/

    相关文章:

    android - GLSL ES 3.0 - 在顶点和 fragment 着色器中统一,以及最大顶点/fragment 统一向量

    c - 使用 soxr 和 libsndfile 重新采样 PCM 文件数据会崩溃

    python - 如何使用 Python 对原始信号应用 FFT

    java - Android MediaPlayer无法正确播放音频

    java - 将混音器更改为在java中输出声音

    c++ - OpenGL 顶点着色器在 Linux 上速度很快,但在 Windows 上非常慢

    python - 逆小波变换[/xpost信号处理]

    actionscript-3 - AS3 : ByteArray sound data loop smoothing issue

    android - 将音频传输到 Doorbird 设备

    android - OpenGL es 2.0 和 16 位 channel