2

VSTi (c++) で高速なダウンサンプリング関数を作成しようとしていますが、機能させるのに苦労しています。これが私が持っているものであり、私がやろうとしていることです。まずはローパスフィルターです。

void resetFilter()
{
     c = 1.0 / tan(3.14159265359 * 22050 / 96000.0); // 1.0 / tan(PI * filter_freq / samplerate)
     r = 2.2; // resonance factor

     a1 = 1.0 / ( 1.0 + r * c + c * c);
     a2 = 2* a1;
     a3 =a1;
     b1=2.0 * ( 1.0 - c*c) * a1;
     b2 =( 1.0 - r * c + c * c) * a1;
     in1 = 0;
     in2 = 0;
     in3 = 0;
     out1 = 0;
     out2 = 0;

}
float lowpass(float NewSample)
{
        float output = (a1 * NewSample) + (a2 * in1) + (a3 * in2) - (b1 * out1) - (b2 * out2);
        in2 = in1;
        in1 = NewSample;
        out2 = out1;
        out1 = output;

return output;
}

上記のローパス フィルターを使用した後、96000/44100=2,1769 のステップでバッファーを再生します。pp->cOffset[o] 2, 4, 6, 8, 10, 13, 15, 17, 19, 21, 23, 26, 28, 30 .. . 96kHZ バッファから。フィルターが高周波で成功したことはわかりますが、バッファーからシリーズを読み取る方法により、より深い金属音があります。

次に、それに対処するために次を追加しようとしました(笑わないでください):

if ((pp->cOffset[o]-(int)pp->cOffset[o])>=.5 && (pp->cOffset[o]-(int)pp->cOffset[o])<1)
{
 float sum1 = (readPreBuffers[0][0][pI][(VstInt32)pp->cOffset[o]]); // the pp->cOffset[o] is a float
 float sum2 = (readPreBuffers[0][0][pI][(VstInt32)pp->cOffset[o]+1]);
 float sum = ((sum1*0.8) + (sum2*1.2))/2.0;
 outputs[0][i] += (sum / 32768.0)*(pp->cVelocity[o]/127.0);
 outputs[1][i] += (sum / 32768.0)*(pp->cVelocity[o]/127.0);
}
else
read as normal..

これにより、金属音の一部が消えましたが、すべてではありませんでした.私は迷っており、それを行う方法がわかりません. 昨日より頭の毛が減った!

outputs はホストへの出力バッファーで、ホストは 44.1kHz のサンプルレートに設定されていますが、私のウェーブ サンプルは 96kHz です。

先に進む方法を見つけさせてください。

4

1 に答える 1