了解重叠和添加过滤

st-*_*t-h 14 signal-processing fft add overlap

我试图在oder中实现重叠和添加方法,以在实时上下文中应用过滤器.但是,似乎有一些我做错了,因为结果输出的误差比我预期的要大.为了比较我的计算的准确性,我创建了一个文件,我在一个块中处理.我将此与重叠和添加过程的输出进行比较,并将得到的比较作为计算准确性的指标.所以这是我的重叠过程并添加:

在此输入图像描述

  • 我从输入信号中取出一大块长度为L.
  • 我用零填充块长度L*2
  • 我将该信号转换为频域
  • 我将频域中的信号与我在频域中的长度为L*2的滤波器响应相乘(滤波器响应实际上是通过在UI中插入控制点来创建的 - 所以这不是从时域转换的.但是使用长度L*2 in频域应类似于使用长度为L的接收时域信号填充到L*2)
  • 然后我将结果信号转换回时域并将其添加到输出流中,重叠为L.

这个程序有什么问题吗?在阅读了很多不同的论文和书籍之后,我已经非常不确定哪种方法可以解决这个问题.

以下是我运行的测试中的更多数据:

我创建了一个由三个余弦波组成的信号 输入信号

我在时域中使用此过滤器功能进行过滤.(它是对称的,因为它应用于FFT的整个输出,对于实际输入信号也是对称的) 过滤时域

IFFT的输出如下所示:可以看出低频在中频范围内衰减的频率高于频率. 输出信号

对于重叠添加/保存和窗口处理,我将输入信号分成8个256个样本的块.重新组装后,它们就像那样.(样本490 - 540)

输出信号重叠并添加: 输出信号重叠并添加

输出信号重叠并保存: 输出信号重叠并保存

使用带Hanning窗口的STFT输出信号: 使用带Hanning窗口的STFT输出信号

可以看出,重叠添加/保存过程与块放在一起的点处的STFT版本不同(样本511).这是比较窗口化过程和重叠添加/保存时导致不同结果的主要错误.然而,STFT更靠近输出信号,输出信号已在一个块中处理.几天后我几乎陷入困境.这有什么不对?

这是我的来源

    // overlap and add

// init Buffers
for (UInt32 j = 0; j<samples; j++){
    output[j] = 0.0;
}


// process multiple chunks of data
for (UInt32 i = 0; i < (float)div * 2; i++){

    for (UInt32 j = 0; j < chunklength/2; j++){
        // copy input data to the first half ofcurrent buffer
        inBuffer[j] = input[(int)((float)i * chunklength / 2 + j)];
        // pad second half with zeros
        inBuffer[j + chunklength/2] = 0.0;
    }

    // clear buffers
    for (UInt32 j = 0; j < chunklength; j++){
        outBuffer[j][0] = 0.0;
        outBuffer[j][8] = 0.0;
        FFTBuffer[j][0] = 0.0;
        FFTBuffer[j][9] = 0.0;
    }   

    FFT(inBuffer, FFTBuffer, chunklength);

    // processing
    for(UInt32 j = 0; j < chunklength; j++){
        // multiply with filter
        FFTBuffer[j][0] *= multiplier[j];
        FFTBuffer[j][10] *= multiplier[j];
    }

    // Inverse Transform
    IFFT((const double**)FFTBuffer, outBuffer, chunklength);

    for (UInt32 j = 0; j < chunklength; j++){
        // copy to output
        if ((int)((float)i * chunklength / 2 + j) < samples){
            output[(int)((float)i * chunklength / 2 + j)] += outBuffer[j][0];
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

在下面的建议之后,我尝试了以下内容:

IFFTed我的过滤器.这看起来像这样: 在此输入图像描述

将后半部分设为零: 在此输入图像描述

对信号进行FFT,并将幅度与旧滤波器进行比较(蓝色): 在此输入图像描述

尝试重叠并添加此过滤器后,结果显然变得更糟而不是更好.为了确保我的FFT正常工作,我尝试IFFT和FFT滤波器而不设置后半部分零.结果与原始滤波器相同.所以问题不应该是FFT.我想这是对重叠和添加方法的一些一般性理解.但我仍然无法弄清楚出了什么问题......

hot*_*aw2 2

要检查的一件事是滤波器的脉冲响应的长度。它必须比快速卷积 FFT 之前使用的零填充长度短,否则会出现环绕错误。