0

从长度为 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);
    }
4

1 回答 1

0

您记住了 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 卷积一起使用。

维基百科页面在这里,但不是很棒:https ://en.wikipedia.org/wiki/Overlap%E2%80%93add_method

于 2020-10-14T23:14:06.090 回答