文章目录

  • 前言
  • LFO 算法
    • LFO 基本实现
    • 向其他波形变换
  • 总结
  • 参考

前言

LFO 即 “Low Frequency Oscillator” 低频振荡器,它可以按照各类波形(例如锯齿波、三角波、Sine 波等)进行震动。

名副其实,LFO 的振荡频率通常都低于 20HZ,低于人类听觉范围。那么,为什么我们想要一个听不到的振荡器?在音效处理中,我们使用 LFO 来控制音效算法中的某些参数,为听到的声音赋予生命和动感,例如 Vibrator、Flanger 和 Chorus 等。

LFO 算法

LFO 基本实现

LFO 的设计和实现都很简单,它通常有两个重要的变量:

  • modulo 计数器,它从 0 开始计数到 1.0,一旦到达或者超过 1.0,它会反转为 0。
  • inc 增量,modulo 计算器每次都会加上 inc 来增加。inc 增量的值与振荡器频率相关,具体的计算我们后面会细说。

伪代码如下:

for(int i = 0; i < N; ++i)
{modulo += inc;if(modulo > 1.0f)modulo = 0.0f;
}

那么 inc 应该如何计算呢?这与采样率LFO 频率有关。举个例子,例如 LFO 频率为 5 时,表示 1秒钟内,LFO 将会振荡来回 5 次。当采样率为 44100 时,意味着 1s 一共有 44100 个采样点,44100 个采样点里一共包含 5 个周期,因此每个周期包含 44100 / 5 = 8820 个点,而这 8820 个点表示的范围是 [0, 1],因此每个点的增量 inc = 1/8820 = 5/44100

float lfo_hz = 5;
float sample_rate = 44100;
inc = lfo_hz / sample_rate

向其他波形变换

上面提到实现中,我们得到了范围 [0, 1] 的波形。由于音频数据采样点数值范围都在 [-1, 1] 内,因此需要进行变换,让其值范围变换到 [-1,1]。这个过程也叫 单极转双极

那么 [0, 1] 如何变换到 [-1, 1] 的锯齿波呢?十分简单:

saw = 2*module + 1;

那么三角波呢?基于锯齿波,我们可以这么做:

tra = 2*fabs(saw) - 1;

sine 波呢?我们这么做:

angle = 2 * M_PI * module;
sine = std::sin(angle);

然而,C/C++ 的 sin 是一个相当复杂的函数,LFO 或许不需要这么精确的值,因此我们希望用一种近似的方法来实现 sine 波,这种实现方式你可以在网络上找到:

double parabolicSine(double angle) {constexpr double B = 4.0 / M_PI;constexpr double C = -4.0 / (M_PI * M_PI);constexpr double P = 0.225;double y = B * angle + C * angle * fabs(angle);y = P * (y * fabs(y) - y) + y;return y;
}angle = 2 * M_PI * module;
sine = parabolicSine(angle);

总结

介绍了 LFO 的作用以及 C/C++ 实现,完整的实现可以参考 Libaa - LFO。


参考

  • What is a LFO and how to use it
  • Libaa - LFO

LFO 低频振荡器简介及其 C/C++ 实现相关推荐

  1. 【音效处理】Vibrato 简介

    系列文章目录 Delay Line 简介及其 C/C++ 实现 LFO 低频振荡器简介及其 C/C++ 实现 [音效处理]Delay/Echo 简介 文章目录 系列文章目录 一.Vibrato 是什么 ...

  2. 【音效处理】Delay/Echo 简介

    系列文章目录 Delay Line 简介及其 C/C++ 实现 LFO 低频振荡器简介及其 C/C++ 实现 文章目录 系列文章目录 一.Delay 是什么 二.Delay 原理 2.1 The Ba ...

  3. 【音效处理】Compressor 压缩器算法简介

    系列文章目录 Delay Line 简介及其 C/C++ 实现 LFO 低频振荡器简介及其 C/C++ 实现 [音效处理]Delay/Echo 算法简介 [音效处理]Vibrato 算法简介 [音效处 ...

  4. 【音频处理】Loudness Normalization 响度均衡算法简介

    系列文章目录 Delay Line 简介及其 C/C++ 实现 LFO 低频振荡器简介及其 C/C++ 实现 [音效处理]Delay/Echo 算法简介 [音效处理]Vibrato 算法简介 [音效处 ...

  5. 【音频处理】Channel Vocoder 算法简介

    系列文章目录 Delay Line 简介及其 C/C++ 实现 LFO 低频振荡器简介及其 C/C++ 实现 [音效处理]Delay/Echo 算法简介 [音效处理]Vibrato 算法简介 [音效处 ...

  6. caffe ssd 测试demo,检测单张图片

    原 SSD: Single Shot MultiBox Detector 检测单张图片 2016年10月29日 16:39:05 阅读数:19930 标签: python ssd ssd-detect ...

  7. k6前级效果器怎么用_P18:调制类效果器的那些事儿(Modulation)

    前言:在说Delay的时候接触到了调制模块,实际上,很多独立效果器的内核也都是调制模块.在读具体的内容之前,不妨先听一下本章的配套视频,感受感受调制类的效果再说. 混音中的调制设备https://ww ...

  8. FL Studio教程之Wasp XT合成器功能介绍

    本文将采用图文结合的方式给FL Studio中的Wasp XT合成器的相关功能,感兴趣的朋友可以一起来交流哦. 从喷涌的岩浆到神秘的宇宙航行,Wasp都能提供相应的背景声,Wasp XT是一个3振荡器 ...

  9. 滤波器m矩阵 awr 不一样_不容错过的乐器盛会!克瑞凡音与您相约2020上海乐展!...

    不容错过的乐器盛会 MUSIC CHINA 2020 中国(上海)国际乐器展览会 强势来袭! 克瑞凡音&悦随行在W5馆等您! 01现场活动 02 观展时间 10月28日-10月30日 9:30 ...

最新文章

  1. apache 安装后默认主页无法打开_CAD教程:CAD软件打开图纸后钢筋符号无法读取的解决办法...
  2. 说说消息队列RocketMQ版ConsumeTimeout的含义是什么
  3. 2020 安恒七月赛
  4. bootstrap File Input 多文件上传插件使用记录(二)删除原文件
  5. 跟踪异常–第5部分–使用Spring进行计划
  6. 【实践案例】Databricks 数据洞察在美的暖通与楼宇的应用实践
  7. 使用iText来生成PDF
  8. 自由缩放属性-resize(禁止textarea的自由缩放尺寸功能)
  9. 拓端tecdat|R语言对BRFSS数据探索回归数据分析
  10. 8-BIT OPTIMIZERS VIA BLOCK-WISE QUANTIZATION--通过块级量化的8位优化器
  11. 通过ajax获取对象后动态插入文本框
  12. 用c语言实现下载文件
  13. C# richTextBox的换行分页打印
  14. 每日英语:Etiquette Catches On in China, Even in Government
  15. Android 11 wifi adb 连接错误 “Unable to start pairing client.“
  16. 塑源码是什么_朔源码燕窝就没有问题货吗?朔源码和非朔源码燕窝该如何选择?...
  17. 第七阶段 -- 网页编程基础:【HTML】
  18. 《制造杀人犯/Making A Murder》中的疑点和感想
  19. 2012网易校园招聘笔试题
  20. Adobe BrowserLab开放注册并发布升级

热门文章

  1. 【洛谷 P7299】 【并查集】 Dance Mooves S
  2. 头骨在ZBrush该怎样才能雕刻
  3. 如何在Unity编辑器中添加你自己的工具
  4. 【Web】CSS实现鼠标悬停实现显示与隐藏 特效
  5. lpop 原子_深圳大学张文静教授团队ACS Nano:单原子铂修饰的二硫化钒催化剂提高电催化析氢性能...
  6. 什么是uni-app呀?
  7. 关于ios XCode hangs at Attaching to (app name)
  8. 转:浅谈Radius协议 -来自CSDN:http://blog.csdn.net/wangpengqi/article/details/17097221
  9. 编写程序实现以下功能:计算1~n之间的素数并输出
  10. 如何不改一行代码,让Hippy启动速度提升50%?