使用Web音频API使用傅立叶变换
钥匙要点
- > Web Audio API允许JavaScript程序员使用声音处理和合成,包括使用自定义振荡器和傅立叶变换来在浏览器中创建独特的声音效果。 >
- 傅立叶变换是一种数学工具,用于将复杂的信号分解为增量频率的离散正弦曲线,使其非常适合逼真的声音生成。此方法由音频压缩标准(例如MP3。>)使用 Web音频API中的自定义振荡器可以使用傅立叶变换来生成波形。此功能允许合成复杂的音调,例如警察警报器或独特的号角声。 Web音频API中使用傅立叶变换和自定义振荡器的声音合成比使用音频样品更灵活,从而使开发人员能够完全自动化自定义效果并合成复杂的音调。
- > Web音频振荡器 Web音频API允许您撰写音频元素以产生声音的图。振荡器就是这样的元素 - 一种生成纯音频信号的声源。您可以设置其频率及其类型,可以是正弦,方形,锯齿或三角形,但是,正如我们将要看到的那样,还有一个强大的自定义类型。 首先,让我们尝试一个标准振荡器。我们只是将其频率设置为440 Hz,音乐家将其识别为A4音符,我们包括一个类型的选择器,让您听到正弦,方形,锯齿和三角形波形之间的区别。
- 请参阅codepen上的seb molines(@clafou)的笔网络音频振荡器。 自定义振荡器可让您定义自己的波形代替这些内置类型,但有一个扭曲:它们使用傅立叶变换来生成此波形。这使它们非常适合现实的声音。
傅立叶以示例
转换 傅立叶变换是音频压缩标准(例如MP3)使用的数学工具,以及许多其他应用程序。逆傅里叶变换将信号分解为其组成频率,就像人耳的过程一样,振动以感知单个音调。 在高水平上,傅立叶会转化一个事实,即可以将复杂的信号分解为增量频率的离散正弦曲线。它使用系数表工作,每种都应用于基本频率的倍数。桌子越大,近似越近。感兴趣? Wikipedia页面值得一看,并包括动画,以帮助将信号的分解为离散的正弦曲线。 但是,让我们没有深入研究理论,而是通过解构简单的连续声音来付诸实践:空气号。合成一个喇叭
在本文中,我们将使用警察警报器和号角的录音。此处显示了使用开源音频编辑器Audacity创建的喇叭声的光谱仪。
The real parameter represents an array of cosine terms (traditionally the A terms). In audio terminology, the first element (index 0) is the DC-offset of the periodic waveform and is usually set to zero. The second element (index 1) represents the fundamental frequency. The third element represents the first overtone, and so on.
<span>var audioContext = new AudioContext(); </span><span>var osc = audioContext.createOscillator(); </span> <span>var real = new Float32Array([0,0.4,0.4,1,1,1,0.3,0.7,0.6,0.5,0.9,0.8]); </span> <span>var imag = new Float32Array(real.length); </span><span>var hornTable = audioContext.createPeriodicWave(real, imag); </span> osc <span>= audioContext.createOscillator(); </span>osc<span>.setPeriodicWave(hornTable); </span>osc<span>.frequency.value = 160; </span>osc<span>.connect(audioContext.destination); </span>osc<span>.start(0);</span>
并不是完全舒缓的声音,而是非常接近录制的声音。当然,声音综合远远超出了单独的频谱,特别是信封是音色同样重要的方面。 从信号数据到傅立叶表 像我们刚刚一样手工创建傅立叶系数是很不寻常的(很少有声音像我们的喇叭声一样简单,它仅由谐波部分组成,即F的倍数)。通常,通过将真实信号数据馈入逆FFT(快速傅立叶变换)算法来计算傅立叶表。 您可以在铬存储库中找到用于选择声音的傅立叶系数,其中包括下面播放的器官声音:
请参阅codepen上的seb molines(@clafou)的笔自定义振荡器:器官 DSP.JS开源库可让您从自己的示例数据中计算此类傅立叶系数。现在,我们将证明这一点以产生特定的波形。
低频振荡器:警察警报音美国警察警报器在低频和高频之间振荡。通过连接两个振荡器,我们可以使用Web音频API实现这一目标。第一个(低频振荡器或LFO)调节第二个产生可听见声波的第二个频率。 与以前一样,为了解构真实的东西,我们从同一录音中拍摄了警察警报声的光谱仪。
现在,我们看到一个鲨鱼鳍状波形,代表了警笛的节奏调制。标准振荡器仅支持正弦,方形,锯齿和三角形波形,因此我们不能依靠这些波形来模仿这种特定的波形。但是我们可以再次创建一个自定义振荡器。 首先,我们需要代表所需曲线的值数组。以下功能会产生这样的值,我们将其塞入一个名为Sharkfinvalues的数组中。请参阅codepen上的seb molines(@clafou)的警笛调制的笔波形函数。
接下来,我们使用dsp.js从此信号数据中计算傅立叶系数。我们获得了真实和图像阵列,然后使用这些阵列来初始化LFO。The real parameter represents an array of cosine terms (traditionally the A terms). In audio terminology, the first element (index 0) is the DC-offset of the periodic waveform and is usually set to zero. The second element (index 1) represents the fundamental frequency. The third element represents the first overtone, and so on.
<span>var audioContext = new AudioContext(); </span><span>var osc = audioContext.createOscillator(); </span> <span>var real = new Float32Array([0,0.4,0.4,1,1,1,0.3,0.7,0.6,0.5,0.9,0.8]); </span> <span>var imag = new Float32Array(real.length); </span><span>var hornTable = audioContext.createPeriodicWave(real, imag); </span> osc <span>= audioContext.createOscillator(); </span>osc<span>.setPeriodicWave(hornTable); </span>osc<span>.frequency.value = 160; </span>osc<span>.connect(audioContext.destination); </span>osc<span>.start(0);</span>
请参阅Codepen上的Seb Molines(@clafou)的笔警笛。
对于更多的现实主义,我们还可以将自定义波形应用于第二个振荡器,正如我们用喇叭声所显示的那样。结论
借助其使用傅立叶变换,自定义振荡器为Web音频开发人员提供了一种简单的方法来综合复杂的音调并完全自动化自定义效果,例如我们已经证明的警笛波形。 声音合成比使用音频样品更灵活。例如,在此警笛效果上很容易添加更多效果,就像我在此移动应用程序中添加多普勒变化所做的那样。 “我可以使用”规格表明,除IE外,Web Audio API享有广泛的浏览器支持。并非所有浏览器都具有最新的W3C标准,但是可以帮助编写跨浏览器代码。 Android L将在WebView中添加Web Audio API支持,iOS自6版以来一直在做。现在是开始实验的好时机!>关于使用Web音频API
使用傅立叶变换的常见问题(常见问题解答)Web音频API是什么,它如何工作?
> Web Audio API是用于处理和合成Web应用程序中音频的高级JavaScript API。它允许开发人员选择音频源,为音频添加效果,创建音频可视化,应用空间效果(例如平移)等等。它通过创建音频上下文来起作用,可以从中创建各种音频节点并将其连接在一起以形成音频路由图。每个节点都执行特定的音频函数,例如产生声音,更改音量或应用音频效果。
>傅立叶变换如何在Web音频API中的工作?
> Web Audio API中的fftSize属性是什么? Web音频API中的fftSize属性用于设置快速傅立叶变换(FFT)的大小以确定频域。它是两个值的功率,它决定执行傅立叶变换时将使用的样品数量。值越高,频率箱就越多,频率数据的详细信息就越详细。但是,较高的值还意味着需要更多的计算能力。>如何使用Web Audio API来创建音频可视化?然后使用该数据创建视觉表示。这通常是使用AnalySernode接口完成的,该接口提供实时频率和时间域分析信息。然后,这些数据可用于创建可视化,例如波形图或频谱图。创建可视化的特定方法将取决于您要创建的可视化类型以及用于创建图形的库或工具。如何使用Web音频API应用于音频Web Audio API提供了多种节点,可用于在音频上应用效果。其中包括用于变化体积的增益表,用于应用各种滤波器效果的Biquadfilternode,用于应用卷积效应(例如混响)等的探路表等。可以从音频上下文创建这些节点,然后在音频路由图中连接以将期望的效果应用于音频。
Web Audio API? Web音频API通常用于Web应用程序中的各种目的。其中包括播放和控制音频,在游戏中添加声音效果,创建音频可视化,在虚拟现实应用程序中应用空间效果,等等。它提供了一种强大而灵活的方式,可以在Web应用程序中使用音频。 Web Audio API API的某些限制是什么?强大而灵活,它确实有一些局限性。例如,它需要一个支持API的现代浏览器,用于更高级的音频处理任务可能很复杂。此外,由于它是高级API,因此与低级API相比,它可能无法提供某些应用所需的控制级别。 >有许多资源可用于了解有关Web音频API的更多信息。 Mozilla开发人员网络(MDN)提供了有关API的全面文档,包括指南和教程。在Codecademy,Udemy和Coursera等网站上也有许多在线教程和课程。此外,还有几本关于该主题的书籍,例如Boris Smus的“ Web Audio API”。>如何使用Web Audio API控制音频的播放?这包括启动和停止音频,调整播放率并寻求音频不同部分的能力。这通常是使用AudioBufferSourcenode接口完成的,该接口代表由内存音频数据组成的音频源。
我可以使用Web Audio API记录音频吗?是的,可以使用Web音频API记录音频,尽管这不是其主要目的。这通常是使用MediaStreamAudioSourCenode接口完成的,该接口代表由媒体流组成的音频源(例如来自麦克风或其他音频输入设备)。
>我如何了解有关Web Audio API的更多信息? 🎜>
以上是使用Web音频API使用傅立叶变换的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

Python和JavaScript开发者的薪资没有绝对的高低,具体取决于技能和行业需求。1.Python在数据科学和机器学习领域可能薪资更高。2.JavaScript在前端和全栈开发中需求大,薪资也可观。3.影响因素包括经验、地理位置、公司规模和特定技能。

学习JavaScript不难,但有挑战。1)理解基础概念如变量、数据类型、函数等。2)掌握异步编程,通过事件循环实现。3)使用DOM操作和Promise处理异步请求。4)避免常见错误,使用调试技巧。5)优化性能,遵循最佳实践。

实现视差滚动和元素动画效果的探讨本文将探讨如何实现类似资生堂官网(https://www.shiseido.co.jp/sb/wonderland/)中�...

如何在JavaScript中将具有相同ID的数组元素合并到一个对象中?在处理数据时,我们常常会遇到需要将具有相同ID�...

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

深入探讨console.log输出差异的根源本文将分析一段代码中console.log函数输出结果的差异,并解释其背后的原因。�...
