2012-08-24 86 views
2

我想知道音頻單元在緩衝區中的期望值。現在,當我在幅度爲0.5的單個頻率上計算正弦波樣本時,一切正常。音頻單元樣本值範圍

但是當我想要同時播放幾個頻率時,例如同時播放5個頻率,我將這些樣本合計起來,樣本值就會變得更高,並且聲音不再清晰。

所以我想知道我的最大樣本值可以在我開始變得骯髒的聲音之前。

+0

你可以對它們進行標準化,而不是直接添加它們,你可以爲每個樣本執行一個均值。 –

+0

關於如何完成的任何示例? – networkprofile

+0

如果在你的代碼中你正在做'out [i] = a [i] + b [i] + c [i]',那麼現在你應該'out [i] =(a [i] + b [i] + C [1])/ 3'。 –

回答

6

在OS X

樣本值通常內[-1.0...1.0),其中所述最大和最小對應於0 dBFS的。但是,您應該準備好處理更大的樣本值。

許多使用浮點渲染/混合圖表的人習慣於在不考慮超過0 dBFS的情況下工作。只有當它們輸出到硬件或音頻文件時,它們才能驗證信號不超過0 dBFS。

如果你只有一個合成器,合計5個正弦,每個都在-6 dBFS,在正常情況下,即使你超過[-1 ... 1),也不應該剪切信號,因爲你正在使用浮動點數代表你的信號。

也有少數例外情況:

  • 你使用不使用浮點混頻器不同尋常的AU主機(我想不出一個被積極開發的)
  • 或不使產量下降它擊中DAC之前
  • 或沒帶下來之前它被保存到一個文件中(雖然錄音文件可在浮點保存太)輸出
  • 組件某處信號路徑不處理在浮點或支持浮點輸入秒。這對於專用硬件處理器來說很常見,但現在很多第三方插件都處於浮點處理狀態。

我會典型地通過發送一個明顯的剪輯信號來證明/反駁。當然,選擇使用ints進行處理的信號處理器/發生器可以(並且應該)留出大量的空間來避免削波(因爲處理器不太可能使用小於32位的任何處理來處理音頻)。

在iOS

因爲浮點處理是在iOS設備慢得多,所述法服AudioUnitSampleType被指定爲Q7.24固定點。

對這種格式的解釋can be found here。另請參閱與此主題相關的帖子。

因爲這不是浮點數,所以您必須更加小心您的增益階段以避免內部削波。

另請注意,可以在iOS上配置32位float圖表。在這種情況下,您應該避免在處理器的輸出處超出[-1.0...1.0),因爲很可能您的輸出將比以後更快地轉換爲非浮點表示(與OS X相比),除非您直接控制在處理鏈下游的適當點進行增益分級,並適當調整這些點的幅度。

+0

通過在達到DAC之前將輸出降低到什麼程度意味着什麼。這與振幅有什麼關係?我只是將我的樣本總和發送到緩衝區。我的代碼基於此示例:http://cocoawithlove.com/2010/10/ios-tone-generator-introduction-to.html – networkprofile

+0

@Sled該文章是關於iOS上的AudioUnits - 與桌面完全不同的世界,原始/通用/開放的AudioUnit。將不得不更新答案。我的答案是關於OS X上的AU. – justin

+0

對不起,我應該提到這是一個iOS應用程序,但並不認爲這很重要。 – networkprofile