我正在尋找資源,鏈接等,以幫助您開始以編程方式使用音頻進行工作。編程音頻入門
具體來說,我正在使用的平臺公開API以從資源(如MP3)中提取音頻數據,或者將任意數據作爲音頻播放。在這兩種情況下,實際數據都是32位浮點數的字節數組,代表44.1 KHz立體聲。我正在尋找的是幫助理解浮體代表什麼,以及他們可以用什麼樣的方式來動態分析或修改他們所代表的聲音。
任何人都可以推薦任何網站/教程/參考來幫助grok這種事情?
我正在尋找資源,鏈接等,以幫助您開始以編程方式使用音頻進行工作。編程音頻入門
具體來說,我正在使用的平臺公開API以從資源(如MP3)中提取音頻數據,或者將任意數據作爲音頻播放。在這兩種情況下,實際數據都是32位浮點數的字節數組,代表44.1 KHz立體聲。我正在尋找的是幫助理解浮體代表什麼,以及他們可以用什麼樣的方式來動態分析或修改他們所代表的聲音。
任何人都可以推薦任何網站/教程/參考來幫助grok這種事情?
正如有些人在評論中指出的,你想看到的是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)
此示例的音頻的頻率分量的下四分之一增加,導致低的頻率變得更響亮。
有很多事情可以對樣品進行處理音頻。只要繼續嘗試吧!這是最令人興奮的學習方式。
祝你好運!
看起來像你想知道更多關於PCM audio
基本上每32位值代表在指定的時間上的電壓電平。 由於採樣頻率爲44100Hz,每通道每秒可獲得441000個32位值(* 2,因爲您有立體聲)
對於立體聲,左右聲道通常是交錯的,因此第一個採樣代表左聲道,第二個權利,等等。
要理解那些32位浮點數組代表你需要閱讀一個好的數字音頻介紹。
如果你在圖書館附近Curtis Roads的「計算機音樂教程」可能會有幫助。特別是第一章「數字音頻概念」。 (儘管我閱讀了這本書已經很長時間了)。
一旦您對數字音頻有所瞭解,可以通過多種方式來操作它。準備就緒後,這些鏈接可能會有所幫助。
Dsp + Plugin Development forum at KVR Audio是一個提問的地方。這裏的帖子一般分爲一般音頻DSP和VST插件主題。
MusicDsp有很多代碼片段。
The Scientist and Engineer's Guide to Digital Signal Processing 是一個免費的在線教科書,深入到標準的DSP主題。其中大部分也適用於數字音頻。
我最近發了類似的問題:good audio dsp tutorials。
黃金鍊接當然是The Audio EQ Cookbook,如果你想寫和排序理解EQs,但更一般地說,musicdsp.org archive是我發現的音頻DSP編碼的最佳資源。
這裏有一個合成器( 「Soundoid」)在Flash我共同製作的視頻: http://www.youtube.com/watch?v=O-1hHiA7y4o
你還可以用它在這裏玩:http://www.zachernuk.com/2011/03/28/soundoid-audio-synthesizer-v0-5/
PCM音頻:HTTP://en.wikipedia .org/wiki/Pulse-code_modulation – some 2008-12-14 05:37:19
基本上每個32位值代表特定時間的電壓電平。由於採樣頻率爲44100Hz,因此每個通道每秒可獲得441000個32位值(* 2,因爲您有立體聲) – some 2008-12-14 05:41:57