FFT 快速卷积:如何应用 Window 来最小化噼啪声

FFT Fast Convolution: How To Apply Window to minimize crackling

我正在尝试进行快速 fft 卷积(fft blocksize=1024 个样本) 带有正弦波的耳机相关脉冲响应(L=512 样本) 音频信号。在这里您可以看到脉冲响应图:

http://fs2.directupload.net/images/150617/fc9j6cs7.png

我将 wave 音频信号拆分为块大小 M=513 的块。然后我将每个波块和 hrtf zeroppaded 到 1024 个样本,应用 fft、乘法和 ifft。下图中可以看到一个block的结果:

http://fs1.directupload.net/images/150617/bxoe9fkm.png

在此之后我在每个块上滑动了 513 个样本 时间尺度比最后一个块(Hop Size = 0)更远,并将其添加到旧块,这给出了正确的卷积输出。

在这里您可以看到(简化版)python 5 个添加输出块的代码:

# set iteration counter to 0
blocknumber = 0 
# read in audio file
_, audiodata = scipy.io.wavefile.read("filename_audio_wave")
_, hrtf_block =  scipy.io.wavefile.read("filename_hrtf_wave")
while blocknumber <5:

    # set blocksizes
    fft_blocksize = 1024
    audio_blocksize = 513
    hrtf_blocksize = 512
    binaural = np.zeros((fft_blocksize*5, ), dtype=np.int16)

    # Do zeropadding: zeropad hrtf and audio
    hrtf_block_zeropadded = np.zeros((fft_blocksize, ), dtype = 'int16')
    hrtf_block_zeropadded[0:hrtf_blocksize, ] = hrtf_block
    sp_block_sp_zeropadded = np.zeros((fft_blocksize, ), dtype = 'int16')
    sp_block_sp_zeropadded[0:sp_blocksize, ] = audiodata[blocknumber*audio_blocksize : (blocknumber+1)*audio_blocksize, ]

    # bring time domain input to to frequency domain
    hrtf_block_fft = fft(hrtf_block_zeropadded, fft_blocksize)
    audio_block_fft = fft(audio_block_zeropadded, fft_blocksize)

    binaural_block_frequency = hrtf_block_fft * audio_block_fft
    binaural_block = ifft(binaural_block_frequency, fft_blocksize).real

    # add the block to the other blocks
    slide_forward_samples = 513
    binaural[blocknumber*slide_forward_samples : blocknumber*slide_forward_samples+fft_blocksize, ] += binaural_block
    blocknumber+=1

在下一步中,我想用稍微不同的方式对每个块进行卷积 脉冲响应是什么导致了块之间的噼啪声。我发现我必须应用 window 并让卷积块重叠。我不知道该怎么做。你能给我一些建议吗?

假设我们想要达到 50% 的重叠并使用汉明 window。

非常感谢您的帮助

使用 window 和 overlap-add/save 快速卷积很少是正确的过滤方法。但如果你想尝试:

请注意,一系列 Von Hann windows,偏移其长度的一半,总和为单位增益,除了最开始或最后。

因此,将数据 window 长度从 513 更改为 512,使用 256 的偏移量(单位增益为 512 的一半),使用 Von Hann window(汉明将改变增益) , 填充超过 window 长度 512 加上脉冲响应长度的任何东西,并使用重叠 add/save 与其余部分(可能在几个输入 window 段上携带尾巴)。

513 不好,因为最接近半偏移量的整数会在所有重叠 windows.

的总增益中引起一些波动

您也可以使用 1/4 window 偏移量,这将使增益加倍,并在 post-processing 中调整此 2X 增益。等等

感谢您的帮助。 我将 hrtf 输入扩展到 513 个样本,并将 window 应用于长度为 512 个样本的正弦信号输入。 这有效。