audio - 音频卷积输出比输入长,当将数据反馈到固定长度的流时,如何解决此问题?

标签 audio signal-processing sdl convolution audioeffect

从长度为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/

相关文章:

android - Android打开和关闭声音应用

java - Android中的开/关音乐

windows - SDL.dll 在 Windows 10 上丢失,即使它位于游戏文件夹中

c++ - Curiosity : Background C++ windows. SFML/SDL类型和Qt(GUI)类型的区别

php - 将音频文件从各种格式转换为mp3和ogg

ios - 近似于iOS中的airplay,蓝牙和相关技术的音频延迟

python - 使用 Pytorch 实现 FFT

matlab - 使用MATLAB检测钢琴音符

iphone - iPhone/ios视频​​图像处理工具和资源

c++ - SDL2 平滑时间点之间的纹理( Sprite )动画功能