我正在使用 Schroeder Manfred R 提出的无色全通滤波器来创建混响器。它由大约 8 个串联的无色全通滤波器组成,每个滤波器具有不同的延迟长度。
收益使用以下等式将所有无色全通滤波器设置为所需的混响时间:
是每个全通滤波器的延迟时间,以秒为单位,并且是整个混响器的混响时间,以秒为单位。
问题是当我将混响时间从高值设置为低值时,混响器的整体音量迅速增加。
但是,成交量不会发散;当我完成混响时间设置后,它会恢复正常。
我将混响时间设置得越快,音量的增加就越大,而如果我将混响时间设置得慢,则音量不会增加太多。
我无法确定,因为我无法准确听到发生了什么,但另一方面,当我将混响时间从低值设置为高值时,音量可能会降低。
你认为什么可能导致这个问题?另外,我想听听您对如何解决这个问题的建议。
无色全通滤波器类 (C++):
class ColorlessAPF
{
public:
// constructor
ColorlessAPF(float delay, float gain);
// common method
void apply(float* in_L, float* in_R = nullptr);
// getter
float getDelay() { return delay; }
float getGain() { return gain; }
// setter
void setGain(float value) { gain = value; }
void setSamplerate(double value);
private:
// member
double samplerate = 44'100.0;
const float delay;
float gain;
using Buffer = std::unique_ptr<RingBuffer<float>>;
Buffer buffer[2];
};
inline ColorlessAPF::ColorlessAPF(float delay, float gain) :
delay(delay),
gain(gain)
{
setSamplerate(samplerate);
}
inline void ColorlessAPF::apply(float* in_L, float* in_R)
{
const int num_loops = in_R ? 2 : 1;
for (int i = 0; i < num_loops; i++) {
float* in = i == 0 ? in_L : in_R;
float from_buffer = buffer[i].get()->getFront();
float to_buffer = *in + from_buffer * gain;
buffer[i].get()->push(to_buffer);
float output = *in * -gain + from_buffer * (1.0f - gain * gain);
*in = output;
}
}
inline void ColorlessAPF::setSamplerate(double value)
{
samplerate = value;
int buffer_size = value * delay / 1'000.0f;
buffer[0].reset(new RingBuffer<float>(buffer_size));
buffer[1].reset(new RingBuffer<float>(buffer_size));
}
/* and And how I set the reverberation time:
void setReverbTime(float value)
{
for (auto&& item : apfs) {
item.get()->setGain(-std::pow(10, (-3 * item.get()->getDelay() / 1'000) / value));
}
}
*/
