程序化audio入门
我正在寻找资源,链接等,以帮助开始以audio方式编程工作。
具体来说,我正在使用的平台公开了从资源(如MP3)中提取audio数据的API,或者将任意数据作为audio播放。 在这两种情况下,实际数据都是32位浮点数的字节数组,代表44.1 KHz的立体声。 我正在寻找的是帮助理解这些浮动代表什么,以及可以用他们来完成什么样的事情来dynamic分析或修改他们所代表的声音。
任何人都可以推荐任何网站/教程/引用来帮助grok这种事情?
正如有些人在评论中指出的那样,你想看的是PCMaudio 。
简而言之, 声音是通过空气传播的波。 为了捕捉声音,我们使用一个麦克风 ,其中包含一个膜片,当声波击中它时会振动。 这种振动被转换成电压信号,电压上升和下降。 然后这个电压变化通过模数转换器 (ADC)通过每秒采样一定次数(“ 采样速率 ” – 44KHz或44100个采样/秒)而变成数字信号,并且在当前情况下,存储为脉码调制(PCM)audio数据。
演讲者的工作方向相反; PCM信号通过数模转换器 (DAC) 转换为模拟信号,然后模拟信号进入扬声器,在此振动膜片,在空气中产生振动,产生声音。
操作audio
有许多语言库可以处理audio,但是您已经将这个问题标记为“与语言无关”,我会提及一些简单的方法(就像我所知道的那样)能够以您的首选语言操作audio。
我将以伪代码的forms呈现代码示例。
伪代码将使每个audio采样的幅度在-1到1的范围内。这将取决于您用于存储每个采样的数据types。 (我之前没有处理过32位float
,所以这可能会有所不同。)
放大
为了放大audio(因此,增加声音的音量),您需要使扬声器的振动更大,从而增加声波的大小。
为了让这个演讲者更多的移动,你必须增加每个样本的价值:
original_samples = [0, 0.5, 0, -0.5, 0] def amplify(samples): foreach s in samples: s = s * 2 amplified_samples = amplify(original_samples) // result: amplified_samples == [0, 1, 0, -1, 0]
由此产生的样本现在被放大2倍,并且在回放时,它应该比以前更响亮。
安静
当没有振动时,就没有声音。 可以通过将每个样品降至0或达到任何特定值来实现沉默,但样品之间振幅没有任何变化:
original_samples = [0, 0.5, 0, -0.5, 0] def silence(samples): foreach s in samples: s = 0 silent_samples = silence(original_samples) // result: silent_samples == [0, 0, 0, 0, 0]
播放上述应该不会导致声音,因为扬声器上的薄膜根本不动,因为样本中振幅的变化不大。
加快和减速
可以通过两种方式来实现上下的加速:(1)改变回放采样率;(2)改变采样本身。
将播放采样率从44100Hz更改为22050Hz将使播放速度降低2.这将使声音更慢,音调更低。 从一个22KHz的音源开始,以44KHz的速度播放,声音会像鸟儿鸣叫一样快速而高音。
改变样本本身(并保持恒定的回放采样率)意味着样本要么(a)被抛出,要么(b)被join。
要加快audio的播放速度 ,请丢弃样本:
original_samples = [0, 0.1, 0.2, 0.3, 0.4, 0.5] def faster(samples): new_samples = [] for i = 0 to samples.length: if i is even: new_samples.add(samples[i]) return new_samples faster_samples = faster(original_samples) // result: silent_samples == [0, 0.2, 0.4]
上述程序的结果是audio将加速2倍,类似于以44KHz在22KHz采样的audio播放。
要减慢audio的播放速度 ,请input几个样本:
original_samples = [0, 0.1, 0.2, 0.3] def slower(samples): new_samples = [] for i = 0 to samples.length: new_samples.add(samples[i]) new_samples.add(interpolate(s[i], s[i + 1])) return new_samples slower_samples = slower(original_samples) // result: silent_samples == [0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3]
在这里,增加了额外的样本,从而减慢播放速度。 在这里,我们有一个interpolation
函数,可以“猜测”如何填充多余的空间。
通过FFT进行频谱分析和声音修改
使用称为快速傅立叶变换 (FFT)的技术,幅度 – 时间域中的声音数据可被映射到频率 – 时间域以找出audio的频率分量。 这可以用来生成您可能会在您最喜爱的audio播放器上看到的频谱分析仪 。
不仅如此,因为现在你有audio的频率成分,如果你改变的数量
如果要截断某些频率,可以使用FFT将声音数据转换为频率 – 时间域,并将不需要的频率分量归零。 这被称为过滤 。
制作一个允许高于一定频率的高通滤波器可以这样进行:
data = fft(orignal_samples) for i = (data.length / 2) to data.length: data[i] = 0 new_samples = inverse_fft(data)
在上面的例子中,中途标记的所有频率都被截断。 所以,如果audio能够产生22KHz的最大频率,那么任何高于11KHz的频率都将被截去。 (对于以44KHz播放的audio,可以产生的最大理论频率是22KHz,参见奈奎斯特 – 香农(Nyquist-Shannon)采样定理 。)
如果您想要增加低频范围(类似于低音增强效果),请使用FFT转换数据的低端,并增加其大小:
data = fft(orignal_samples) for i = 0 to (data.length / 4): increase(data[i]) new_samples = inverse_fft(data)
这个例子增加了audio频率分量的低四分之一,导致低频变大。
样品处理audio有很多事情可以做。 只要继续尝试吧! 这是最令人兴奋的学习方式。
祝你好运!
看起来你想知道更多关于PCMaudio
基本上每个32位的值代表特定时间的电压值。 由于采样频率为44100Hz,每通道每秒可获得441000个32位值(* 2,因为您有立体声)
在立体声声音中,左右声道通常是交错的,因此第一个样本代表左声道,第二个样本代表右声道,依此类推。
要理解这些32位浮点数组代表你需要阅读一个好的数字audio介绍。
如果你在图书馆附近,Curtis Roads的“计算机音乐教程”可能会有帮助。 特别是第一章“数字audio概念”。 (虽然我读了这本书已经很久了)。
一旦你理解了数字audio,有许多方法来操纵它。 准备就绪后,这些链接可能会有所帮助。
KVR Audio的Dsp +插件开发论坛是一个提问的地方。 这里的post一般分为一般audioDSP和VST插件主题。
MusicDsp有很多代码片段。
科学家和工程师的数字信号处理指南是一个免费的在线教科书,深入到标准的DSP主题。 其中大部分也适用于数字audio。
我最近发布了一个类似的问题: 好的audioDSP教程 。
黄金链接当然是audioEQ食谱 ,如果你想写和sorting理解EQs,但更一般地说, musicdsp.org档案是我find的最好的audioDSP编码资源。
下面是我在Flash中合成的一个合成器(“Soundoid”)的video: http : //www.youtube.com/watch?v= O-1hHiA7y4o
你可以在这里玩: http : //www.zachernuk.com/2011/03/28/soundoid-audio-synthesizer-v0-5/