2008-12-14 76 views
34

我正在寻找资源,链接等,以帮助您开始以编程方式使用音频进行工作。编程音频入门

具体来说,我正在使用的平台公开API以从资源(如MP3)中提取音频数据,或者将任意数据作为音频播放。在这两种情况下,实际数据都是32位浮点数的字节数组,代表44.1 KHz立体声。我正在寻找的是帮助理解浮体代表什么,以及他们可以用什么样的方式来动态分析或修改他们所代表的声音。

任何人都可以推荐任何网站/教程/参考来帮助grok这种事情?

+0

PCM音频:HTTP://en.wikipedia .org/wiki/Pulse-code_modulation – some 2008-12-14 05:37:19

+0

基本上每个32位值代表特定时间的电压电平。由于采样频率为44100Hz,因此每个通道每秒可获得441000个32位值(* 2,因为您有立体声) – some 2008-12-14 05:41:57

回答

95

正如有些人在评论中指出的,你想看到的是PCM audio

简而言之,sound是一种在空中传播的波。为了捕捉声音,我们使用一个microphone,它包含一个膜片,当声波击中它时会振动。这种振动被转换成电压信号,电压上升和下降。这个电压变化然后由analog-to-digital converter(ADC)通过每秒取样若干次(“sampling rate”--44KHz或44,100个采样/秒)而变成数字信号,并且在当前情况下,被存储为一种脉码调制(PCM)音频数据。

A speaker作品相反; PCM信号通过digital-to-analog converter(DAC)转换为模拟信号,然后模拟信号传送到扬声器,在那里振动膜片,在空气中产生振动并产生声音。

操作音频

有许多图书馆在那里的许多语言,你可以操纵音频,但是你标记这个问题为“语言无关”,我会提一些简单的方法(就像我所知道的那样!),你可以用你喜欢的语言来操作音频。

我将以伪代码的形式呈现代码示例。

伪码将使每个音频采样的幅度在-1到1的范围内。这将取决于您用于存储每个采样的数据类型。 (I还没有处理的32位前float S,所以这可能是不同的。)

扩增

为了放大音频,(因此,增加了声音的音量)你将要使扬声器的振动更大,以便增加声波的大小。

为了使该扬声器多运动,你就必须增加每个样本的值:

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)中加入。

为了加快的音频的重放,抛出样品:

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] 

上述程序的结果是,音频将通过2倍,类似于播放,在44千赫在22千赫采样的音频加快。

放缓的音频播放,丢几个样品中:

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

使用称为Fast Fourier transform(FFT)技术,在幅度 - 时间域中的声音数据可以被映射到频率 - 时间域,以确定的频率分量的音频。这可用于生成您可能会在您最喜爱的音频播放器上看到的spectrum analyzers

不仅如此,因为现在你有声音的频率成分,如果你改变的

量如果你想切断某些频率,可以使用FFT的声音数据变换成频率 - 时间域,并将不需要的频率分量归零。这被称为filtering

制备high-pass filter,这允许频率高于一定的频率可以这样进行:

data = fft(orignal_samples) 

for i = (data.length/2) to data.length: 
    data[i] = 0 

new_samples = inverse_fft(data) 

在上述例子中,在中途标记所有频率是截止。因此,如果音频可以产生22 KHz作为最大频率,那么11 KHz以上的任何频率都将被截取。 (对于以44 KHz播放的音频,可以产生的最大理论频率为22 KHz,请参阅Nyquist–Shannon sampling theorem。)

如果您想要做一些类似于提高低频范围(类似于低音增强效果) ,取FFT变换数据的下端并增加其大小:

data = fft(orignal_samples) 

for i = 0 to (data.length/4): 
    increase(data[i]) 

new_samples = inverse_fft(data) 

此示例的音频的频率分量的下四分之一增加,导致低的频率变得更响亮。


有很多事情可以对样品进行处理音频。只要继续尝试吧!这是最令人兴奋的学习方式。

祝你好运!

4

看起来像你想知道更多关于PCM audio

基本上每32位值代表在指定的时间上的电压电平。 由于采样频率为44100Hz,每通道每秒可获得441000个32位值(* 2,因为您有立体声)

对于立体声,左右声道通常是交错的,因此第一个采样代表左声道,第二个权利,等等。

3

要理解那些32位浮点数组代表你需要阅读一个好的数字音频介绍。

如果你在图书馆附近Curtis Roads的“计算机音乐教程”可能会有帮助。特别是第一章“数字音频概念”。 (尽管我阅读了这本书已经很长时间了)。

一旦您对数字音频有所了解,可以通过多种方式来操作它。准备就绪后,这些链接可能会有所帮助。

Dsp + Plugin Development forum at KVR Audio是一个提问的地方。这里的帖子一般分为一般音频DSP和VST插件主题。

MusicDsp有很多代码片段。

The Scientist and Engineer's Guide to Digital Signal Processing 是一个免费的在线教科书,深入到标准的DSP主题。其中大部分也适用于数字音频。