0

プログラムでオーディオ ファイルを再生しています。オーディオ レンダリング コールバックで、ゲイン マルチプライヤを入力信号に適用し、それを出力バッファに追加します。私のアクションを説明するための擬似コードを次に示します。

void audioCallback(AudioOutputBuffer* ao, AudioInput* ai, int startSample, int numSamples){
    for (int i=startSample; i<numSamples+startSample; i++){
        ao[i] = ai[i]*gain;
    }
}

基本的に、データに乗数を掛けるだけです。この場合、gainGUI コールバックを介して調整されている float メンバーです。オーディオがまだ再生されている間にこの値を調整すると、スライダーを動かしたときにオーディオが柔らかくなったり大きくなったりするのが聞こえますが、小さなポップやクリックがたくさん聞こえます。

契約が何であるかはよくわかりません。私は補間について知っており、オーディオがピッチシフトされている場合はそれを行いますが、オーディオファイルの再生が完了する前にゲインがリアルタイムで調整されている場合、追加の補間または何かを行う必要があるかどうかはわかりません。

オーディオの再生が始まる前にスライダーを調整すると、ゲインが適切に設定され、クリック音は発生しません。

ここで何か不足していますか?ゲインは、入力信号の乗数以外にどのように実装されますか?

4

2 に答える 2

3

質問: 乗算演算子はどのオペランドがオーディオ信号で、どれがゲインであるかをどのように認識しますか? 答え: そうではありません。どちらもオーディオ信号であり、どちらかで聞こえるものはすべて出力で聞こえます。

フラットで不変の信号は、可聴音を生成しません。ゲインが一定である限り、独自のサウンドを導入することはありません。

急激に変化する信号は非常に聞き取りやすく、多くの高周波を含むクリック音のように聞こえます。

独自に決定したように、高周波成分を減らして可聴性を低下させる 1 つの方法は、一定の勾配を使用して、多数のサンプルにわたって変化を引き延ばすことです。ゲインを変更する時間が十分にあるアプリケーションでは、これで十分です。

もう 1 つの方法は、ゲイン信号でローパス フィルターを実行し、それを乗算への入力として使用することです。

于 2014-08-08T22:18:12.070 に答える
2

変更した分だけゲインを変更することで修正しました。たとえば、ゲイン乗数が 1.0 に設定されていて、0.8 に変更された場合、0.2 ゲインの差になります。コールバックのサンプルごとに、差 / numSamples を前のボリュームに追加して、スラーまたは段階的なゲインの変化を作成します。

于 2014-08-04T07:15:54.187 に答える