2013-08-27 46 views
1

好的,所以我有一個小程序,用戶可以控制音頻信號的輸出頻率並播放歌曲(理論上:))。輸出音頻(Windows Audio API) - 低頻安靜

我自己在代碼中生成正弦波,通過計算它在44100Hz採樣時在一個波形的單個週期內需要多少個點。像這樣:

for (int k = 0; k < points_sine_wave; k++) 
     { 
      // Generate sine wave 
      sineWave[k] = pow(2.0,10) * (sin(2*3.14159*f*td*k + old_angle) + 1); 

     } 

td是delta t(常數),f是頻率,k只是一個指數。爲了確保頻率改變時正弦波的連續性,我使用old_angle來保存以記憶從哪個角度恢復。我檢查了這裏產生的波形,它工作(正弦波保持連續,但會改變頻率)。 +1是爲了使一切正面。

現在,根據我放入該pow(2.0,x)的內容,我可能無法聽到低頻。看起來在2^7,我可以聽到一切都很好(100Hz是感興趣的東西),但如果我去2^6或2^5,我再也聽不到低頻了。

我通過Audacity觀察了我的輸出,並注意到高頻分量總是佔據整個垂直範圍(-1至1),而低頻分量則介於-0.4至0.4之間。

這是爲什麼?我寫入緩衝區的信號都是相同的最大幅度(在Matlab中檢查 - 如果您願意,可以發佈此信息)。

格式設置爲PCM,位數爲32,有效位數也爲32(雖然32似乎是一切)。

回答

1

最可能的答案是您正在播放聲音的揚聲器不善於再現低波長的聲音。臺式電腦揚聲器,例如,經常won't produce sounds below 50Hz。如果你有低音炮或者非常高品質的揚聲器,當然,你會做得更好。

另一種可能是當然,什麼是錯與你產生正弦波的......但總的來說,如果你在放大接近足以看出單個樣本,這將是在Audacity中顯而易見。也就是說,如果視覺看起來像一個合適的正弦波,那麼它很可能是一個正確的正弦波。 (如果不是,例如,如果有任何突然的不連續性,您會在播放音頻時聽到非常明顯的噪音!)

最後一點:假設您的PCM格式使用帶符號的採樣值,我懷疑你如果保持正弦波垂直居中在X軸上,會更好;即具有相同數量的正值和負值。如果將所有值保持爲正值,則您的揚聲器將播放帶有DC偏移的音頻,這對於various reasons可能很差(或至少次優)。

+0

我敢打賭最後一個問題。 Audacity沒有顯示直流偏移的事實意味着它必須通過一些濾波器,可能是D/A - A/D轉換。放下'+ 1'。 「32位似乎是一切」是另一個同樣問題的指標。 32位PCM具有31位幅度,因爲符號需要一位。忽略這一點,你有一個討厭的溢出,可能包裝到負值。如果你要跟正弦曲線變爲1.9十億到2.0到2.1到-2.1,回到2.1,你有一個非常討厭的響亮的點擊。 – MSalters

+0

謝謝,我認爲你是正確的對DC偏移,我給它。我刪除了「+1」,現在它可以工作! – Mewa

0

您有31位可能的幅度,並使用2^7或2^6作爲實際幅度?有很多隻能做24位的聲卡。實際上,16位並不算太壞。