2016-07-17 1 views
1

マイクオーディオをサンプリングしてもう一度試してみます(転送用)。しかし、プロセスの後、オーディオは少し壊れています(シャッターをかける)。あなたがマイクを持っている場合は、それを自分で試すことができます。ダウンサンプリングとアップサンプリング後のオーディオシャッターリング

FIDDLE:https://jsfiddle.net/q4yjfxqv/10/(21.07.16更新)

あなたがより高いfrequencesにシャッターを聞きます。

私は同様にliniar、立方晶とランチョス形態hereような他の補間方法を試しただけアレイ

function newDownSample(data) { 
    var retBuffer = []; 
    for(var i=0;i<data.length;i++) { 
    if(i%2==0) 
    retBuffer.push(data[i]) 
    } 
    return retBuffer; 
}; 

とアップサンプル(liniar)

function newUpSample(data) { 
    var retBuffer = []; 
    for(var i=0;i<data.length;i++) { 
    retBuffer.push(data[i]) 
    if(i<data.length-1) 
     retBuffer.push((data[i]+data[i+1])/2); 
    else 
     retBuffer.push(data[i]); 
    } 
    return retBuffer; 
}; 

の半分を除去することにより、ダウンサンプリング...シャッター効果は同じです。

シャッターは常にチャンクから外れています。この例では、チャンクサイズを1024から4096に変更することでこれを聞くことができます(これはあまり発生しません)。

なぜですか?誰もがこれをexmplainすることができます解決する方法?

ヒントありがとう:

答えて

0

補間のためのあなたのコードの問題は、あなたが知っていないということであり、次のブロックの最初のサンプルであり、したがって、現在のサンプルの最後のサンプルを適切に補間することができない。

これを回避するには、次のブロックの最初の補間サンプルを計算するために、1ブロックの最後のサンプルを保存する必要があります。

https://jsfiddle.net/hhb240ms/1/

usSample[0] = (lastSample + data[0])/2; 
usSample[1] = data[0]; 
for(var i=1;i<512;i++) { 
    usSample[2*i] = (data[i] + data[i-1])/2; 
    usSample[2*i+1] = data[i] 
} 
lastSample = data[data.length-1]; 
+0

非常にいい:)私は好きです! – Cracker0dks

0

私はオーディオプログラミングに関する専門家ではありません。

私は奇妙な結果(一般的なプログラミングの問題)が発生したときに、アルゴリズムのパラメータを変更して基本に戻しています。

ダウンサンプルをしないとどうなりますか?

音声は最小のエラーでも非常に敏感です。 バッファが十分に大きくない場合、または(メインスレッドを使用して)処理中にサウンドが再生されない場合はどうなりますか?

このスレッドで変調以外の処理は行っていますか? 別の(HTML5)ブラウザはどうですか? 現在、他の解決策やヒントはないと思います。

幸運にも、これが役立つことを願っています。 解決策を投稿してください。これは他のプログラマーにも役立ちます。

+0

ねえ、responesのためのおかげで...私はこれまで多くのことを試してみました。あなたはフィドルで再サンプリングを切り替えて、うまく動作していないことを確認することができます。 FirefoxとChromeが壊れている(少なくとも)...私は明日より多くのコンピュータをテストします。 – Cracker0dks

+0

これを試してみてください.https://jsfiddle.net/ck3sgan9/9/ アップスケーリングが必要ですか? あなたは常に品質を失うので、これは回避策(アップサンプリングではありません)ですが動作します。私は重いオーディオ品質の低下を聞いていません。 このフィドルは、ダウンサンプリングのみを使用します。 – Zezura

+0

よろしくお願いいたします。私はこれがどのように可能かを知りません...補間するよりも同じ値を2回使用する方が良いでしょうか? – Cracker0dks

0

実行しているOSやマシンによっては、creatScriptProcessorで指定したバッファサイズを増やすことができます。あなたが持っているサイズでは、アーティファクトが聞こえますが、サイズを16384に増やすとアーティファクトが聞こえなくなります。 (しかし、大きなバッファーサイズから期待されるように、何かが聞こえる前にかなり長い待ち時間になります)。

+0

チャンクサイズを変更した場合、シャットダウン間の期間だけが広がります – Cracker0dks

0

i =(data.length-1)の場合、データ[i + 1]の値がNULLになるため、アップサンプリングはおそらく最後のサンプルの平均をゼロにしますか?

(これは素晴らしいダウンサンプリングではありません - それは第1の帯域幅-contrainていないので - 。しかし、私はあなたがそれを知っていた期待)

+0

はい、このdata.length-1エラーは既に見つかりましたが、まだシャッターが切れています。この例では帯域幅を無くしました。なぜなら、それはその欠陥ではないからです。 – Cracker0dks

+0

本当ですか?私は私のMacBookやデスクトップ上の修正されたフィドルでオーディオの問題は聞こえません。たぶん、あなたがそれを実行しているマシンがaudioprocessイベントに追いつくことができないからでしょうか? (私はそれが奇妙だったと思いますが)あなたの動的割り当てとarray.push()は非効率です。私はhttps://jsfiddle.net/12ubug1o/でハードコードされたバージョンを書いた。同じ動作をするかどうかを確認してください。 – cwilso

+0

また、エコーキャンセルを無効にすることもできます(https://jsfiddle.net/12ubug1o/1/)。 – cwilso

関連する問題