代码之家  ›  专栏  ›  技术社区  ›  fenomas

开始使用程序化音频[关闭]

  •  35
  • fenomas  · 技术社区  · 17 年前

    我正在寻求帮助,开始以编程方式处理音频。

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

    我需要学习哪些概念才能以这种方式处理音频?

    4 回复  |  直到 8 年前
        1
  •  103
  •   Bleeding Fingers    11 年前

    正如一些人在评论中指出的那样,你想研究的是 PCM audio .

    简而言之, sound 是一种在空气中传播的波。为了捕捉这种声音,我们使用 microphone ,它包含一个薄膜,当声波撞击它时,薄膜会振动。这种振动会转化为电信号,电压会上下波动。然后,电压的这种变化通过 analog-to-digital converter (ADC)通过每秒采样一定次数(“ sampling rate “-44 KHz,即每秒44100个样本),在当前情况下,存储为脉冲编码调制(PCM)音频数据。

    A. speaker 相反地工作;PCM信号通过 digital-to-analog converter (DAC),然后模拟信号进入扬声器,在那里它会振动一个薄膜,在空气中产生振动,从而产生声音。

    操纵音频

    有很多库可以处理许多语言的音频,但是你把这个问题标记为“语言无关”,我会提到一些简单的方法(我只知道这些!),你可以用你喜欢的语言处理音频。

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

    伪码将使每个音频样本的幅度在-1到1的范围内。这将取决于您用于存储每个样本的数据类型。(我还没有处理过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)更改采样本身。

    将播放采样率从44100 Hz更改为22050 Hz将使播放速度降低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倍,类似于播放以22KHz和44KHz采样的音频。

    减速 在播放音频时,请加入一些示例:

    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)
    

    在上面的例子中,中途标记上的所有频率都被切断。因此,如果音频可以产生22KHz的最大频率,则高于11KHz的任何频率都将被切断。(对于以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)
    

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


    可以对样本做很多事情来操纵音频。继续做实验吧!这是最令人兴奋的学习方式。

        2
  •  5
  •   some    17 年前

    看来你想了解更多 PCM audio

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

    对于立体声,左声道和右声道通常是交错的,这样第一个样本代表左声道,第二个样本代表右声道,以此类推。

        3
  •  3
  •   Shannon    17 年前

    要理解这些32位浮点数组代表什么,你需要阅读一本关于数字音频的好介绍。

    如果你在图书馆附近,Curtis Roads的《计算机音乐教程》可能会很有用。具体来说,第一章“数字音频概念”。(不过我已经很久没读这本书了)。

    一旦你了解了数字音频,有很多方法可以操纵它。当你准备好了,这些链接可能会有所帮助。

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

    MusicDsp 有很多代码片段。

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

        4
  •  1
  •   Community Mohan Dere    9 年前

    我最近发布了一个类似的问题: good audio dsp tutorials .

    黄金链接当然是 The Audio EQ Cookbook ,如果你想写和理解EQ,但更一般地说 musicdsp.org archive 是我找到的音频DSP编码的最佳资源。

    这是我在Flash中共同制作的合成器(“Soundoid”)的视频: http://www.youtube.com/watch?v=O-1hHiA7y4o

    你可以在这里玩: http://www.zachernuk.com/2011/03/28/soundoid-audio-synthesizer-v0-5/

    推荐文章