谈论音效

目录
感谢你们的辛勤工作。
我是系统开发部的松山。
我突然意识到,虽然音频滤波器有很多种,但我只用过混响,所以我决定
去了解一下其他滤波器(效果)。
音频滤波器
首先,我们来看看有哪些筛选器可用。
官方文档在此。
低通滤波器
它是一种低通滤波器,可以滤除高频声音,
因此当您在墙壁或扬声器背面等障碍物后面时,声音会被衰减。
高通滤波器
与低通滤波器相反,这种滤波器会滤除低频。
从物理角度来说,高频信号应该先被衰减,所以廉价耳机无法重现低频时就会
发出噼啪声。
回声滤波器
这是回声。它会重复同一个声音,但音量会减弱。
就像在卡拉OK包厢里唱歌有回声一样。
如果你增加间隔时间,听起来可能就像回声。
失真滤波器
无论音量大小,它都会让声音变大。
由于质量差,它会使声音失真,听起来像有噼啪声。
混响滤波器
就我个人而言,这是我最常用的滤波器。
它能营造出封闭空间(例如大厅或地下通道)的混响效果,
也能模拟麦克风收音的效果。它的
参数可配置性最强,但作为业余爱好者,我觉得自己无法全部调整。
合唱滤波器
这是一个类似合唱效果的滤波器,可以将调制后的声音混合在一起。
我用一个采样试了一下,但效果不太好。
如果有人知道怎么用,请告诉我……
要求
和往常一样,我们将在 Unity 中创建一个示例并进行测试。①
为音频监听器设置各种滤波器
② 使用复选框打开/关闭每个滤波器
③ 使用滑块指定低通和高通滤波器的频率
④ 实现播放背景音乐、音效和铃声
⑤ 显示类似音频频谱的内容
看起来是这样的。
每个滤波器的参数都处于默认状态。
我们只需要创建一个播放音频的用户界面。
音频频谱的移动方式只要合理即可。
在音频监听器上设置过滤器
主摄像头组件自带音频监听器,因此请将每个滤镜添加到其下方。
除低通/高通滤镜外,所有滤镜均可通过复选框切换,因此默认情况下保持关闭状态。

每个过滤器都可以通过复选框打开/关闭。
使用 UI.Toggle 创建。(像这样↓)

准备触发方法,
// 切换过滤器 public void OnClickToggleFilter(int no) { switch ((FilterNo)no) { case FilterNo.Chorus: fltChorus.enabled = tglChorus.isOn; break; case FilterNo.Distortion: fltDistortion.enabled = tglDistortion.isOn; break; case FilterNo.Echo: fltEcho.enabled = tglEcho.isOn; break; case FilterNo.Reverv: fltReverb.enabled = tglReverv.isOn; break; } }
只需在 OnValueChanged 中设置即可。

低通滤波器和高通滤波器都有滑块可以指定频率。
低通滤波器和高通滤波器可以通过滑块进行设置,
音量和音调也可以进行调节。

滑块的 j 反射看起来像这样。
① 设置事件监听器
// 低音通道 sldLoPass.onValueChanged.AddListener((value) => { setLoPass(value); });
② 设置过滤器的值
// 低通滤波器设置 private void setLoPass(float val) { var loPassHz = ExpHz(val); fltLoPass.cutoffFrequency = loPassHz; txtLoPass.text = string.Format("{0:#}", loPassHz); }
* ExpHz 将 0.0 到 1.0 到 10 到 22000 Hz 的值进行转换。
float ExpHz(float logHz) { var t = Mathf.Log(LowHz) - Mathf.Log(HighHz); return Mathf.Exp(logHz * t) * 10f; }
允许您分别播放背景音乐、音效和铃声。
使用 UI.Button 播放声音。

设置一个事件监听器来切换播放/停止。
使用 AudioSource.Play()、Stop()。
// BGM播放/停止 btnBgmPlay.onClick.AddListener(() => { if (!bgmSource.isPlaying) bgmSource.Play(); else bgmSource.Stop(); });
显示类似音频频谱的内容。
最后,我们来展示波形数据。
这就是标题图片中显示的波形。
在 AudioListener 中使用GetSpectrumData()
我以此为参考进行实现。(谢谢)
我想看看在真实的智能手机上进行声音频谱分析的结果。
GetSpectrumData() 获取的音频样本被分成 512 个频段,用于 UI 显示。
AudioListener.GetSpectrumData(spectrumData, 0, FFTWindow.Hanning); var outputF = AudioSettings.outputSampleRate; // 初始化所有频段 for (int i=0; i <bins.Length; i++) { bins[i] = 0f; } var logMaxF = Mathf.Log(graphMaxFrequency); // 上のbinの周波数のlog var logMinF = Mathf.Log(graphMinFrequency); var logRange = logMaxF - logMinF; if (logRange <= 0f) { logRange = 8f; } // まず周波数分類 for (int i=0; i<spectrumData.Length; i++) { var f = outputF * 0.5f * (float)i / (float)spectrumData.Length; if (f == 0f) { f = float.Epsilon; } // 対数を取ってどのビンに入るか確定 float binValue = (float)bins.Length * (Mathf.Log(f) - logMinF) / logRange; int binIndex = Mathf.FloorToInt(binValue); if ((binIndex > = 0) && (binIndex < bins.Length)) { // 将数据添加到该 bin bins[binIndex] += spectrumData[i]; } }
创建一个基础预制件,用于显示在每个区块中。
它是一个 UI.Image 对象,宽度为 3,高度为 0。
将这些预制件从屏幕左侧开始排列,并根据其数值大小设置高度。
// 反映在条形图中 for(int i=0; i
现在播放音频时,波形数据应该看起来类似。
概括
我试遍了所有音频滤波器。
合唱效果不太好(哭)
。不出所料,除了混响和低通滤波器之外,其他滤波器似乎很难把握使用时机。Unity
也音频混音器,如果你想要更精细的设置,可以试试它。
说实话,我觉得这不适合新手……
好了,今天就到这里吧。
这次我会再次上传到 Git。
希望它能有所帮助。Unity
示例
此外,我们还使用了来自以下来源的音频数据:
OtoLogic 和
Otonomori
最后
我是系统开发服务网站“SEKARAKU Lab”的成员。Beyond
提供从服务器设计、搭建到运维的一站式服务,如果您在服务器端开发方面遇到任何问题,欢迎随时联系我们。SEKARAKU
Lab: [https://sekarakulab.beyondjapan.com/](https://sekarakulab.beyondjapan.com/)
谢谢。
1