2017-03-25 61 views
2

我有一個小型的網絡應用程序,基於一個人的個人聽力圖(http://howdeaf.com)對耳聾模型。從本質上講,這是不言而喻:如何使用JavaScript網絡音頻只扭曲特定的頻率範圍?

source -> 2-ch splitter -> 6 inline frequency separators -> merge node -> destination -> 6 inline frequency separators ->

頻率分離器使用此代碼創建:

for (let i = 0; i < bandSplit.length; i++) { 
    for (let j in sides) { 
     var side = sides[j]; 
     let filterNode = context.createBiquadFilter(); 
     filterNode.frequency.value = bandSplit[i]; 
     if (i === 0) 
      filterNode.type = 'lowshelf'; 
     else if (i === bandSplit.length - 1) 
      filterNode.type = 'highshelf'; 
     else 
      filterNode.type = 'peaking'; 
     filterNode.gain.value = 0.0; 

     this.eqNodes[side].push(filterNode); 

     if (i > 0) 
      this.eqNodes[side][i - 1].connect(this.eqNodes[side][i]); 
    } 
} 

我調整在每個12個頻率分離節點的增益,這是一個非常整潔的模擬。

我想單獨使用不同的曲線值向這12個雙二階濾波器節點中的每一個添加失真(使用createWaveShaper()),但我沒有任何成功扭曲個別頻率。我創建的任何失真節點都會影響該頻道的整個音頻輸出。

有沒有辦法在個別基礎上對這些頻率選擇節點應用失真?

+0

你把WaveShaper節點放在哪裏? –

+0

@RaymondToy我試圖將WaveShaper連接到每個雙分支節點,但這顯然是錯誤的;它形成了所有通過的聲音,而不僅僅是雙二階濾波器的目標頻率。然後我重新安排他們並行而不是系列,源 - >分離器 - > [biquad - >波形整形器] - >合併 - >目的地([這些] 12,每個通道6),但沒有工作 –

回答

0

除了兩個濾鏡之外,其他所有濾鏡的增益均爲0,它們基本上可以讓所有內容都通過。因此,無論您應用哪種波形,都可以應用到整個頻段。 (例如,請參閱http://googlechrome.github.io/web-audio-samples/samples/audio/mag-phase.html以獲得響應圖。)

考慮使用不同種類的濾波器,如帶通濾波器。這可能不適合您的應用程序,但至少這些過濾器不會讓所有頻率都通過。

+0

我我不是一個音頻工程師,所以我確信我做錯了什麼。起初,我想獨立調整每個頻率範圍的增益。我的設置實現了這一點,但可能會受到阻礙。你有更清潔的方法嗎?第二個目標是再次獨立地爲每個頻率範圍添加失真。一組平行的帶通濾波器是否允許這樣做? –

+0

是的,一組平行的帶通濾波器可以達到這一點。您必須仔細選擇帶寬和中心頻率,以便結果基本平坦。不知道這是多麼容易。然後你可以在每個輸出上應用這個失真。但是,這些濾波器並不完美,所以頻率會有一些重疊,所以一些失真會溢出到其他頻段。 –

+0

我對「Q值」進行了解讀,並查看了一對夫婦圖,所以我想我明白了「重疊」的含義,我認爲這是最小的和可接受的(如果這些圖是準確的,而且我的問題已經完成對)。我會測試它併發布結果代碼,如果它工作。謝謝你的提示。 –

相關問題