Python FFT快速卷积:如何应用窗口最小化裂纹

Python FFT快速卷积:如何应用窗口最小化裂纹,python,audio,signal-processing,fft,convolution,Python,Audio,Signal Processing,Fft,Convolution,我正在尝试对数据进行快速fft卷积(fft块大小=1024个样本) 具有正弦波的与头桥相关的脉冲响应(L=512个样本) 音频信号。在这里您可以看到脉冲响应图: 我将波形音频信号分成块,块大小M=513。然后我将每个波块和hrtf归零到1024个样本,应用fft、乘法和ifft。您可以在下图中看到一个块的结果: 在此之后,我将每个块513个样本滑动到 时间刻度比最后一个块(跃点大小=0)更远,并将其添加到旧块中,从而提供正确的卷积输出 在这里,您可以看到添加了5个输出块的python代码(简

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

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

在此之后,我将每个块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
#将迭代计数器设置为0
blocknumber=0
#读入音频文件
_,audiodata=scipy.io.wavefile.read(“文件名\音频\波形”)
_,hrtf_block=scipy.io.wavefile.read(“filename_hrtf_wave”)

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

请注意,Von Hann窗序列,偏移其长度的一半,总和为单位增益,但在最开始或结束时除外

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

513是不好的,因为最接近半偏移量的整数将在所有重叠窗口的总增益中引起一些波动

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

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

这篇文章写得不错!但是,由于这是一个面向编码人员的网站,添加一些代码通常会有所帮助,因为这通常更容易理解,并且比代码的文本解释更不含糊。这个问题更适合于dsp.stackexchange.com。