LFO 低频振荡器简介及其 C/C++ 实现
文章目录
- 前言
- 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++ 实现相关推荐
- 【音效处理】Vibrato 简介
系列文章目录 Delay Line 简介及其 C/C++ 实现 LFO 低频振荡器简介及其 C/C++ 实现 [音效处理]Delay/Echo 简介 文章目录 系列文章目录 一.Vibrato 是什么 ...
- 【音效处理】Delay/Echo 简介
系列文章目录 Delay Line 简介及其 C/C++ 实现 LFO 低频振荡器简介及其 C/C++ 实现 文章目录 系列文章目录 一.Delay 是什么 二.Delay 原理 2.1 The Ba ...
- 【音效处理】Compressor 压缩器算法简介
系列文章目录 Delay Line 简介及其 C/C++ 实现 LFO 低频振荡器简介及其 C/C++ 实现 [音效处理]Delay/Echo 算法简介 [音效处理]Vibrato 算法简介 [音效处 ...
- 【音频处理】Loudness Normalization 响度均衡算法简介
系列文章目录 Delay Line 简介及其 C/C++ 实现 LFO 低频振荡器简介及其 C/C++ 实现 [音效处理]Delay/Echo 算法简介 [音效处理]Vibrato 算法简介 [音效处 ...
- 【音频处理】Channel Vocoder 算法简介
系列文章目录 Delay Line 简介及其 C/C++ 实现 LFO 低频振荡器简介及其 C/C++ 实现 [音效处理]Delay/Echo 算法简介 [音效处理]Vibrato 算法简介 [音效处 ...
- caffe ssd 测试demo,检测单张图片
原 SSD: Single Shot MultiBox Detector 检测单张图片 2016年10月29日 16:39:05 阅读数:19930 标签: python ssd ssd-detect ...
- k6前级效果器怎么用_P18:调制类效果器的那些事儿(Modulation)
前言:在说Delay的时候接触到了调制模块,实际上,很多独立效果器的内核也都是调制模块.在读具体的内容之前,不妨先听一下本章的配套视频,感受感受调制类的效果再说. 混音中的调制设备https://ww ...
- FL Studio教程之Wasp XT合成器功能介绍
本文将采用图文结合的方式给FL Studio中的Wasp XT合成器的相关功能,感兴趣的朋友可以一起来交流哦. 从喷涌的岩浆到神秘的宇宙航行,Wasp都能提供相应的背景声,Wasp XT是一个3振荡器 ...
- 滤波器m矩阵 awr 不一样_不容错过的乐器盛会!克瑞凡音与您相约2020上海乐展!...
不容错过的乐器盛会 MUSIC CHINA 2020 中国(上海)国际乐器展览会 强势来袭! 克瑞凡音&悦随行在W5馆等您! 01现场活动 02 观展时间 10月28日-10月30日 9:30 ...
最新文章
- apache 安装后默认主页无法打开_CAD教程:CAD软件打开图纸后钢筋符号无法读取的解决办法...
- 说说消息队列RocketMQ版ConsumeTimeout的含义是什么
- 2020 安恒七月赛
- bootstrap File Input 多文件上传插件使用记录(二)删除原文件
- 跟踪异常–第5部分–使用Spring进行计划
- 【实践案例】Databricks 数据洞察在美的暖通与楼宇的应用实践
- 使用iText来生成PDF
- 自由缩放属性-resize(禁止textarea的自由缩放尺寸功能)
- 拓端tecdat|R语言对BRFSS数据探索回归数据分析
- 8-BIT OPTIMIZERS VIA BLOCK-WISE QUANTIZATION--通过块级量化的8位优化器
- 通过ajax获取对象后动态插入文本框
- 用c语言实现下载文件
- C# richTextBox的换行分页打印
- 每日英语:Etiquette Catches On in China, Even in Government
- Android 11 wifi adb 连接错误 “Unable to start pairing client.“
- 塑源码是什么_朔源码燕窝就没有问题货吗?朔源码和非朔源码燕窝该如何选择?...
- 第七阶段 -- 网页编程基础:【HTML】
- 《制造杀人犯/Making A Murder》中的疑点和感想
- 2012网易校园招聘笔试题
- Adobe BrowserLab开放注册并发布升级
热门文章
- 【洛谷 P7299】 【并查集】 Dance Mooves S
- 头骨在ZBrush该怎样才能雕刻
- 如何在Unity编辑器中添加你自己的工具
- 【Web】CSS实现鼠标悬停实现显示与隐藏 特效
- lpop 原子_深圳大学张文静教授团队ACS Nano:单原子铂修饰的二硫化钒催化剂提高电催化析氢性能...
- 什么是uni-app呀?
- 关于ios XCode hangs at Attaching to (app name)
- 转:浅谈Radius协议 -来自CSDN:http://blog.csdn.net/wangpengqi/article/details/17097221
- 编写程序实现以下功能:计算1~n之间的素数并输出
- 如何不改一行代码,让Hippy启动速度提升50%?