音频卷积输出比输入长,在将数据反馈到固定长度的流时如何解决这个问题?
Audio Convolution output is longer than input, how can i get around this when feeding data back to a stream of fixed length?
从长度为 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);
}
您记住了 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]
这被称为“overlap-add”卷积方法。它通常与块中的 FFT 卷积一起使用。
维基百科页面在这里,但不是很棒:https://en.wikipedia.org/wiki/Overlap%E2%80%93add_method
从长度为 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);
}
您记住了 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]
这被称为“overlap-add”卷积方法。它通常与块中的 FFT 卷积一起使用。
维基百科页面在这里,但不是很棒:https://en.wikipedia.org/wiki/Overlap%E2%80%93add_method