2008-12-14 79 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主題。其中大部分也適用於數字音頻。