2013-01-02 57 views
2

所以我使用NAudio從C#開始編寫合成器。我已經得到了不同的頻率,這很酷,但我注意到較高的音高比較低的音高要大得多。是,由於這種效果:每個頻率的平均響度

http://en.wikipedia.org/wiki/Equal-loudness_contour

還是我做錯事的時候,我產生正弦波?如果確實有必要,我將如何實現等響度輪廓曲線?

由於

我的代碼:

n音訊預計填充有浮點值在-1至+1來表示波形的緩衝器。

產生正弦波:

buffer[n + offset] = (float)(Amplitude * Math.Sin(angle)); 
angle = (angle + angleIncrement) % (2 * Math.PI); 

設置頻率:

public double Frequency 
{ 
    set 
    { 
     angleIncrement = 2 * Math.PI * value/sampleRate; 
    } 
    get 
    { 
     return angleIncrement * sampleRate/2/Math.PI; 
    } 
} 
+0

你的代碼看起來沒問題(只要'振幅'是恆定的)。 –

+0

「振幅」表示用戶想要彈奏音符有多大聲。現在在我的測試中是不變的。既然如此,你是否認爲我需要實現響度輪廓/ – John

+0

我已經發布了:「人耳無法像那樣工作,它非常非線性。」該圖左側的比例是對數,3dB等於係數2. –

回答

1

控制從合成基於等響度輪廓音頻的幅度可能是你想要什麼。

理論上,您需要知道揚聲器產生的絕對聲級(SPL)才能選擇合適的輪廓。實際上,當您將合成器擴展爲使用複雜波形而不是純音時,可能會遇到更大的問題,可能會使用濾波器等進行處理。等響度輪廓基於純音調,當您生成複雜信號時(即包含多個頻率),您需要一個響度模型來估計合成聲音的響度。

0

您可能想要使用A權重。這不是量化響度的最準確的方法,但它是可以的。你必須深入到聲學才能做得更好。更多here