从长度为x的流中获取音频数据后,然后将数据卷积为长度为256的脉冲响应。
这使输出 vector 的长度为(x + 256-1)。
然后,将数据反馈到长度为x的流中时,将有255个过冲样本,然后导致弹出和单击。
有没有解决的办法?我不是100%关于如何将比原始缓冲区大的缓冲区再次合并到输出中,而又不会丢失随机样本或引起此问题。
我省去了代码中较大的irrelevent部分,这一切都可以解决,只是我需要解决的这个问题。它只是在这里,以提供对该问题的见解。
码:
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);
}
最佳答案
您会记住255个额外的样本,并将它们的值添加到下一个输出块开始处的255个样本中。
例如:
[1, 2, 1, 3] produces [2, 3, 4, 3, 2, 1] you output [2, 3, 4, 3], remember [2,1]
下一块: [3, 2, 1, 3] produces [4, 3, 4, 5, 5, 2]
you output:
[4, 3, 4 ,5]
+ [2, 1]
-----------------
[6, 4, 4, 5]
remember [5,2]
这被称为卷积的“重叠相加”方法。它通常与FFT卷积一起使用。Wikipedia页面在这里,但并不出色:https://en.wikipedia.org/wiki/Overlap%E2%80%93add_method
关于audio - 音频卷积输出比输入长,当将数据反馈到固定长度的流时,如何解决此问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64360217/