2017-09-20 19 views
0

長い周期の複雑な周期的なサウンドを作成しようとしています。できるだけ正確に周波数を定義したいので、ステップsampleRate*0.5/tableLenを使用しています。しかし、大きな波テーブルにはいくつか問題があります。音が歪んで高周波が失われます。長い周期の波でカスタムオシレータを作成する

〜440Hzの正弦波を伴う最小限の例です。私は長さ8192でテーブルを使用する場合、得られる正弦波は非常に認識可能である:

https://jsfiddle.net/zxqzntf0/

var gAudioCtx = new AudioContext(); 
var osc = gAudioCtx.createOscillator(); 
var tableSize = 8192; 
var real = new Float32Array(tableSize); 
var imag = new Float32Array(tableSize); 
var freq = 440; 
var step = gAudioCtx.sampleRate*0.5/tableSize; 
real[Math.floor(freq/step)] = 1; 
var wave = gAudioCtx.createPeriodicWave(real, imag, {disableNormalization: true}); 
osc.frequency.value = step; 
osc.setPeriodicWave(wave); 
osc.connect(gAudioCtx.destination); 
osc.start(); 

しかし、私は私のテーブルのサイズを大きくするとき、私は奇妙な何かを取得しています。結果はまったく正弦波ではありません!

https://jsfiddle.net/0cc75nnm/

この問題は、すべてのブラウザ(クローム、Firefoxの、エッジ)で再現するので、ブラウザのバグではないようです。しかし、私はドキュメントでこれについて何も見つかりませんでした。

を追加しました

私は、発振器の周波数が整数> = 2 Hzであるならば、私はテーブルサイズ16384と音を結果にはどのアーティファクトを持っていないことがわかった私は、それが今の私のニーズのために非常に許容可能だと思います。しかし、いつか私はもっと長い期間を作りたいかもしれません。ステップが2 Hz未満のときに音のアーティファクトを得る理由を誰かが説明してくれれば、私は彼の答えを受け入れるでしょう。

私はJavaScriptで生成する複雑な音のメロディーの例があります:あなたは間違ってあなたの定期的な波を作成している https://jsfiddle.net/h9rfzrnL/1/

答えて

2

が。周期波の配列を塗りつぶすときは、サンプルレートを1と仮定します。次に、440Hzの周波数でオシレータを使用する場合は、オシレータの周波数を440Hzに設定します。

したがって、正弦波の場合、実際の配列はすべてゼロでなければならず、虚数配列は[0,1]です。実際にコサイン・ウェーブを作成していますが、それほど問題にはなりません。

+0

範囲400-480 Hzのサイン20、レンジ800-960のサイン40などが必要です。私は440Hzのステップを持っていればできません。単一正弦波は私の問題の最小の例です。 – gammaker

+0

作成したいウェーブの具体的な例は、問題をよりよく説明するのに役立ちます。それでも基本的な考え方は、サンプルレートが1 Hzであるかのようにウェーブを設計することです。次に、オシレーターの周波数を希望の信号のベース周波数に設定します。 –

+0

いくつかの周波数範囲で分布する高調波が必要です。では、周波数400,401、...、480,800,801、...、960,1200,1201、...、1920、... ... ...、... 12800の周波数を持つオシレータをどのように作成できますか? 12801、...、15360?私はそれをすることができません、私はステップ440がある場合、私はステップ1 Hzと非常に大きなテーブルが必要です。少ないステップで良いです。 – gammaker

関連する問題