FFT快速卷积:如何应用窗口以最小化噼啪声

时间:2015-06-17 09:19:00

标签: python audio signal-processing fft convolution

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

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

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

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

在此之后我将每块513个样品滑到了 时间刻度比最后一个块(跳跃大小= 0)更远,并将其添加到旧块,这给出了正确的卷积输出。

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

# 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

在下一步中,我想要将每个块与稍微不同的块进行卷积 是什么导致了块之间的噼啪声。我发现我必须应用一个窗口并让卷积块重叠。我没有得到如何做到这一点。你能给我一些建议吗?

让我们考虑一下我们希望达到50%的重叠并使用汉明窗口。

  • 每个块现在需要包含前一个块的50%样本吗?
  • 我在哪里申请窗户?我是否必须在fft之前应用它 音频信号块上的卷积(窗口大小:513个样本)或打开 ifft输出(windowsize 1024:samples)?
  • 我需要多少样品来滑动fft输出信号 50%重叠的时间表?

非常感谢你的帮助

2 个答案:

答案 0 :(得分:1)

使用具有重叠 - 添加/保存快速卷积的窗口很少是正确的过滤方式。但是如果你想尝试:

请注意,除了最开始或结束时,一系列Von Hann窗口(偏移其长度的一半)总和为单位增益。

因此将数据窗口长度从513更改为512,使用256的偏移(单位增益的512的一半),使用Von Hann窗口(汉明将改变增益),填充窗口长度为512的任何内容加上脉冲响应长度,并使用重叠添加/保存与剩余部分(可能在多个输入窗口段上携带尾部)。

513不好,因为最接近半偏移的整数会在所有重叠窗口的总和增益中产生一些纹波。

您还可以使用1/4窗口偏移,这将使增益加倍,并在后处理中调整此2倍增益。等

答案 1 :(得分:0)

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