Я пытаюсь сделать быструю функцию понижающей дискретизации в моем 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.
Усечение, которое означает, что я получу ряд index (int) с помощью pp-> cOffset [o] 2, 4, 6, 8, 10, 13, 15, 17, 19, 21, 23, 26, 28, 30 .. из буфера 96 кГц.
Я слышу, что фильтр работал на высоких частотах, но металлический звук более глубокий из-за того, как я читаю серию из буфера.
Затем я попытался добавить следующее, чтобы справиться с этим (не смейтесь, пожалуйста):
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..
Это заставило некоторые металлические звуки исчезнуть, но не все, я потерялся и не знаю, как это сделать.
У меня сейчас на голове меньше волос, чем вчера!
output — это выходные буферы для хоста, и хост настроен на частоту дискретизации 44,1 кГц, в то время как моя волновая выборка составляет 96 кГц.
Пожалуйста, позвольте мне найти способ двигаться дальше.
Я нашел это, все более глубокий металлический звук исчез.
Я использую фильтр нижних частот, как и раньше, но теперь при чтении из отфильтрованного звукового буфера я использую следующий метод вместо того, который был в моем вопросе.
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);
Это работает, если у кого-то есть лучший метод, я буду рад его увидеть. Хотел поделиться этим, если кому-то еще это понадобится в их работе.
С уважением, Морган
Других решений пока нет …