2014-03-02 43 views
1

我有一個帶有PCM原始音頻數據的int16_t[]緩衝區,我想將一些效果(如回聲,混響,增益...)加入其中。如何在C++中爲PCM緩衝音頻添加聲音效果

我認爲SoX或類似的東西可以爲我做伎倆,但SoX只適用於支持添加聲音效果的文件和其他類似的庫,似乎只在聲音播放時纔會添加效果。所以我的問題是,我想將這些效果應用到我的緩衝區而不用播放它們。

我從來沒有使用過音頻,但閱讀有關PCM數據我已經瞭解到,例如,我可以應用增益乘以每個樣本值。但是我正在尋找任何庫或相對簡單的算法,我可以直接在緩衝區中使用,以獲得應用的聲音效果。

如果您知道要尋找什麼,我確定有很多解決方案可以解決我的問題,但這是我第一次使用音頻「處理」,而且我迷路了,正如您所看到的。

回答

1

您的int16_t[]緩衝區包含一系列樣本。它們代表瞬時的幅度水平。把它們想象成在相應的時刻適用於揚聲器的電壓。它們是帶符號的數字,範圍爲(-32767,32767),恆定的零流意味着沉默,例如常量-32000的流也意味着沉默,但它最終會燒壞你的揚聲器線圈。在陣列中表示時間,並且每個採樣的值代表電壓

如果你想混合兩個採樣流,例如應用啁啾聲,你可以得到一個帶有啁啾聲的採樣流(記錄一個鳥類或其他東西)然後你可以通過樣本添加兩個聲音樣本

你可以通過採取原始聲音緩衝區,降低其音量(可能通過將所有樣本除以一個常數)來實現超俗的混響效果,並將其添加回原始流,但將樣本移動十分之一排名第二的價值。

這些是音頻處理的基礎知識。事情確實非常複雜。這個領域被稱爲「數字信號處理」,並且有很多這方面的書籍。

+0

感謝您的回覆。 我一直在玩緩衝區,並能獲得增益,哇音和回聲效果,但現在我正在閱讀有關聲碼器,它變得複雜。你知道我可以使用的任何C/C++庫嗎? – BeLi

+0

開放源碼音頻信號處理的網絡搜索出現了不少候選人。例如, http://essentia.upf.edu/ –

1

對於人人都喜歡我,有興趣學習有關使用C音頻處理DSP ++,我想分享我的一些研究成果和觀點,也許你節省一些時間:)

嘗試一些DSP庫後,終於我找到了Synthesis ToolKit in C++ (STK),這是一個開源庫,提供簡單明瞭的界面和易於理解的代碼,您可以深入瞭解各種基本的DSP算法。

因此,我建議任何剛開始並且沒有以前經驗的人都去看看這個圖書館。

0

您可以通過黑客入侵音頻緩衝區並試圖通過簡單的數學運算來實現增益和閾值等效果,或者使用適當的DSP算法進行修正。如果你希望做到這一點,我會推薦使用Speex庫。它是開源的,並經過很好的測試。 www(點)speex(點)org。代碼應該儘可能在MSVC或linux上編譯。這是使用適當的DSP技術獲得良好音頻代碼的最快方式。你的代碼看起來像..請閱讀AEC的例子。

st = speex_echo_state_init(NN, TAIL); 
den = speex_preprocess_state_init(NN, sampleRate); 
speex_echo_ctl(st, SPEEX_ECHO_SET_SAMPLING_RATE, &sampleRate); 
speex_preprocess_ctl(den, SPEEX_PREPROCESS_SET_ECHO_STATE, st); 

您需要設置狀態,代碼testecho包括這些。