我正在用 C++ 编写一个 VST DSP 插件。
我正在“filterbank”中创建一系列带通滤波器。我在头文件(包括函数)中实现了一个过滤器类,并在 .cpp 中正确构建了构造函数/析构函数。
我可以将值传递给方法并返回它们。但是,问题在于在函数的缓冲区中存储数据。似乎每次调用函数方法时,缓冲区中存储的值都会被重置(或者,一开始就没有正确存储)。因此,传回的内容并不“完整”。
任何建议都非常感谢!
nb 这篇文章已经更新了新代码:
这是课程:
class aFilterL
{
朋友班 Beat_to_Midi;
公共:aFilterL();~aFilterL();
float fOut1_l;
float filterOut1_l;
float Out_1_l;
float Out_2_l;
float* buffer_Out_1_l;
float* buffer_Out_2_l;
虚拟浮点 aFilterMethodL (float a0, float a1, float a2, float b1, float b2, float inputL, float prevInput1L, float prevInput2L) {
Out_1_l = buffer_Out_1_l[0];
Out_2_l = buffer_Out_2_l[0];
filterOut1_l = (a0 * inputL) + (a1 * prevInput1L) + (a2 * prevInput2L) - (b1 * Out_1_l) - (b2 * Out_2_l) + 1.0E-25;
fOut1_l = filterOut1_l;
buffer_Out_2_l[0] = buffer_Out_1_l[0];
buffer_Out_1_l[0] = fOut1_l;
return fOut1_l;
}
};
类aFilterR {
朋友班 Beat_to_Midi;
公共:aFilterR();~aFilterR();
float fOut1_r;
float filterOut1_r;
float Out_1_r;
float Out_2_r;
float* buffer_Out_1_r;
float* buffer_Out_2_r;
虚拟浮动aFilterMethodR(浮动a0,浮动a1,浮动a2,浮动b1,浮动b2,浮动输入R,浮动prevInput1R,浮动prevInput2R){
Out_1_r = buffer_Out_1_r[0];
Out_2_r = buffer_Out_2_r[0];
filterOut1_r = (a0 * inputR) + (a1 * prevInput1R) + (a2 * prevInput2R) - (b1 * Out_1_r) - (b2 * Out_2_r) + 1.0E-25;
fOut1_r = filterOut1_r;
buffer_Out_2_r[0] = buffer_Out_1_r[0];
buffer_Out_1_r[0] = fOut1_r;
return fOut1_r;
} };
然后在 cpp 中构造/销毁,如下所示:
aFilterL::aFilterL()
{ fOut1_l = 0.f; filterOut1_l = 0.f;
Out_1_l = 0.f;
Out_2_l = 0.f;
buffer_Out_1_l = new float [1];
buffer_Out_2_l = new float [1];
buffer_Out_1_l[0] = 0.f;
buffer_Out_2_l[0] = 0.f;
}
aFilterL::~aFilterL() {
if (buffer_Out_1_l)
delete[] buffer_Out_1_l;
if (buffer_Out_2_l)
delete[] buffer_Out_2_l;
}
aFilterR::aFilterR() { fOut1_r = 0.f;
filterOut1_r = 0.f;
Out_1_r = 0.f;
Out_2_r = 0.f;
buffer_Out_1_r = new float [1];
buffer_Out_2_r = new float [1];
buffer_Out_1_r[0] = 0.f;
buffer_Out_2_r[0] = 0.f;
}
aFilterR::~aFilterR() {
if (buffer_Out_1_r)
delete[] buffer_Out_1_r;
if (buffer_Out_2_r)
delete [] buffer_Out_2_r;
}
最后在 processReplaceing 函数中实现为:
void myPlugin::processReplacing (float** 输入,float** 输出,VstInt32 sampleFrames) {
float* in1 = inputs[0];
float* in2 = inputs[1];
float* out1 = outputs[0];
float* out2 = outputs[1];
aFilterL *my_aFilter1L = new aFilterL;
aFilterR *my_aFilter1R = new aFilterR;
while (--sampleFrames >= 0) {
// 过滤输入
In_1_l = buffer_In_1_l[0];
In_1_r = 缓冲区_In_1_r[0];
In_2_l = buffer_In_2_l[0];
In_2_r = 缓冲区_In_2_r[0];
// 在管理中过滤
buffer_In_2_l[0] = buffer_In_1_l[0];
buffer_In_2_r[0] = buffer_In_1_r[0];
buffer_In_1_l[0] = *in1;
buffer_In_1_r[0] = *in2;
// 发送到函数进行处理
返回L = my_aFilter1L->aFilterMethodL(0.000171f, 0.0f, -0.000171f, -1.999911f, 0.999943f, *in1, In_1_l, In_2_l);
返回R = my_aFilter1R->aFilterMethodR(0.000171f, 0.0f, -0.000171f, -1.999911f, 0.999943f, *in2, In_1_r, In_2_r);
// 将过滤器输出发送到 out
*out1 = 返回L;
*out2 = 返回R;
*在1++;
*in2++;
*出1++;
*out2++; }}