当前位置: 首页 > 知识库问答 >
问题:

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

戎俊
2023-03-14

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

在此之后,我将每个块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

在下一步中,我想用一个轻微不同的脉冲响应来卷积每个块,这导致块之间的爆裂噪声。我发现我必须应用一个窗口,让卷积块重叠。我不知道具体怎么做。你能给我一些建议吗?

    null

非常感谢你的帮助

共有1个答案

轩辕成天
2023-03-14

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

请注意,冯汉窗口序列,偏移其长度的一半,与单位增益相加,除了在最开始或结束。

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

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

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

 类似资料:
  • 对于用大内核(筛选器)卷积大图像来说速度慢得不切实际。将一个1024x1024的图像与一个相同大小的内核进行卷积需要几分钟的时间。为了进行比较,立即返回结果。 我找到了和。 然而,我并不清楚如何使用这些函数执行简单的图像过滤。 如何使用FFT与TensorFlow实现快速二维图像滤波?

  • 有没有人知道关于Mayer FFT实现的任何事情(而不需要我花很多时间研究代码)? 我正在尝试执行一个卷积,而ifft似乎产生了我所谓的“镜像”输出。换句话说,我的内核+信号长度被限制为N/2,并且任何占据N=0....N/2的内容都被镜像到N=N...N/2左右。在负频率下,它看起来有点像我所期望的FFT...除了在负时间下,它就像一面镜子。 下面是我的卷积代码: 我曾经尝试用这个mayer F

  • 问题内容: 我需要将注意力集中在指定的窗口上,而我头上看到的唯一方法是将其前面的所有窗口最小化,直到找到正确的窗口为止。 我该怎么做? Windows 7,没有特定的工具包…。 每种类型的窗口,例如,firefox和控制台命令 问题答案: 您需要通过窗口枚举并匹配窗口标题才能获得所需的窗口。下面的代码搜索标题为“ firefox”的窗口并设置焦点: 为了最小化窗口,下面的行:

  • 我是Javafx新手,我正在从事Javafx项目。我想最小化javafx窗口。我使用初级阶段。initStyle(舞台风格。未装饰)。我还想将clickevent添加到fxml中的imageview中。

  • 问题内容: 在我的Java应用程序中,我有一个JFrame窗口,如何从Java程序中最小化它? 问题答案: 最小化 用还原

  • 问题内容: 我有一个具名的,不需要让用户调整其大小。当然,我可以在每次用户尝试时重新调整它的大小,但是有什么办法不让用户将窗口打开到全屏或拉伸窗口呢? 问题答案: 编辑/更新: Xcode 10.2•Swift 5 NSWindow具有一个称为styleMask的属性,该属性使您可以控制用户可以使用哪种控件。如果不想让用户调整窗口大小,则必须使用mutating方法删除样式掩码.resizable