gpt4 book ai didi

signal-processing - 了解重叠和添加过滤

转载 作者:行者123 更新时间:2023-12-03 22:44:22 25 4
gpt4 key购买 nike

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

enter image description here

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

  • 那个程序有什么问题吗?在阅读了很多不同的论文和书籍之后,我已经非常不确定哪种方法是正确的。

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

    我创建了一个信号,它由三个余弦波组成
    Input Signal

    我在时域中使用了这个过滤函数进行过滤。 (它是对称的,因为它应用于 FFT 的整个输出,这对于实际输入信号也是对称的)
    Filter Time Domain

    IFFT 的输出如下所示: 可以看出,低频比中频衰减得更多。
    Output Signal

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

    输出信号重叠和相加:
    Output Signal overlap and add

    输出信号重叠并保存:
    output signal overlap and save

    使用带汉宁窗的 STFT 输出信号:
    output signal using STFT with Hanning window

    可以看出,重叠添加/保存过程与 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];
    }

    }

    }

    根据以下建议,我尝试了以下操作:

    IFFTed 我的过滤器。这看起来像这样:
    enter image description here

    将后半部分设置为零:
    enter image description here

    对信号进行 FFT 并将其幅度与旧滤波器(蓝色)进行比较:
    enter image description here

    在尝试重叠并添加此过滤器后,结果显然变得更糟而不是更好。为了确保我的 FFT 正常工作,我尝试对滤波器进行 IFFT 和 FFT,而不将后半部分设置为零。结果与原始过滤器相同。所以问题不应该是FFTing。我想这更像是对重叠和添加方法的一些一般性理解。但是我还是想不通是怎么回事...

    最佳答案

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

    关于signal-processing - 了解重叠和添加过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5117839/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com