从长度为 x 的流中获取音频数据后,然后将数据与长度为 256 的脉冲响应进行卷积。这使输出向量的长度为 (x + 256 - 1)。当数据然后反馈到长度为 x 的流中时,有 255 个过冲样本,然后会导致弹出和点击。
有解决办法吗?我不是 100% 关于如何在不丢失随机样本或导致此问题的情况下再次将大于原始缓冲区的缓冲区合并到输出中。
我省略了代码中较大的不相关部分,这一切都可以解决我需要修复的这个问题。它只是在这里给出对问题的洞察力。
代码:
void ConvolveEffect(int chan, void* stream, int len, void* udata)
{
////...A bunch of settings etc
//Pointer to stream
short* p = (short*)stream; //Using short to rep 16 bit ints as the stream is in 16bits.
int length = len / sizeof(short);
//Processing buffer (float)
float* audioData[2];
audioData[0] = new float[length / 2];
audioData[1] = new float[length / 2];
//Demux to L and R
for (int i = 0; i < length; i++)
{
bool even = i % 2 == 0 ? true : false;
audioData[!even][((i - !even) / 2)] = map(p[i], -32767, 32767, -1.0, 1.0);
}
////....Convolution occurs outputting OUT
std::vector<fftconvolver::Sample> outL = Convolve(audioData[0], IRL, length / 2, 256, 128, 256, 256);
std::vector<fftconvolver::Sample> outR = Convolve(audioData[1], IRR, length / 2, 256, 128, 256, 256);
//Remux
for (int i = 0; i < length; i++)
{
bool even = i % 2 == 0 ? true : false;
p[i] = map(Out[!even][(i - !even) / 2], -1.0, 1.0, -32768, 32767);
}