我正在尝试在我的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得到index(int)系列。 ..来自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..
这使得一些金属声音消失但并非全部,我迷失了,不知道该怎么做。 我现在的头发比昨天少了!
输出是主机的输出缓冲器,主机设置为44.1kHz采样率,而我的波形采样为96kHz。
请让我找到继续前进的方法。
答案 0 :(得分:0)
我发现它,所有更深层的金属声都消失了。
我正在使用低通滤波器,但是现在从滤波后的声音缓冲区读取时,我使用的方法不是我的问题中的方法..
float deciI2 = (pp->cOffset[o]-(int)pp->cOffset[o]);
float deciI1 = 1 - deciI2;
float sum1 = (readPreBuffers[0][0][pI][(VstInt32)pp->cOffset[o]]);
float sum2 = (readPreBuffers[0][0][pI][(VstInt32)pp->cOffset[o]+1]);
float sum = ((sum1*deciI1) + (sum2*deciI2))/2.0;
outputs[0][i] += (sum / 32768.0)*(pp->cVelocity[o]/127.0);
outputs[1][i] += (sum / 32768.0)*(pp->cVelocity[o]/127.0);
这是有效的,如果有人有更好的方法,我会很高兴看到它。如果其他人在他们的工作中需要它,他们愿意分享这个。
问候,摩根