将 Audacity Filter Curve EQ 转换为传递函数并通过 python 将其应用于信号

问题描述

首先,我对 python 很陌生。我正在尝试编写一个脚本,在其中输入录音,在内部应用 eq 并返回修改后的信号。在研究这个主题时,我发现了一些通过 python 中的传递函数处理信号的方法,但是我只发现了像低通滤波器等这样的函数,这不符合我的需求,因为我有一个特定的 eq 操作。我以大胆的方式构建了所需的滤波器曲线 eq:The needed filter curve constructed in Audacity

如果我对信号处理的有限理解是正确的,我需要将连续曲线转换为离散传递函数,然后将该传递函数应用于输入信号。但是,我不知道如何将曲线转换为传递函数。此外,由于这是我第一次使用 python,我对如何在 python 脚本中实现这个过程的知识非常有限。如果您能提供任何帮助,我将不胜感激,谢谢!

解决方法

我以为我熟悉信号处理,但我还没有听说过传递函数。根据您的要求,我怀疑您需要一个“脉冲响应”(在 FIR 滤波器的上下文中也称为滤波器内核或卷积内核)。

您首先通过要应用于音频的过滤器过滤 Dirac delta function 来创建脉冲响应。您必须在此处选择一个长度参数 N,稍后我将为您提供一个启发式方法*。

在 Audacity 中,您首先创建一个长度为 N 个样本(比如 100 个)的每样本 32 位无声单声道波形。将中间样本编辑为最大值。现在用你的均衡器过滤整个波形,结果就是你的脉冲响应(在非常低的音量下)。

导出这个脉冲响应并以某种方式将它作为浮点值数组导入python。确保缩放/分割这些值,使静音为 0,最大音量值为 1(实际值将是非常小的数字)。这样可以确保下一步不会改变信号的整体音量。

实际过滤任何冗长信号的方法是通过convolving 具有脉冲响应的信号以获得均衡信号。我希望你有一个库函数。

(您可能希望在过滤之前为信号添加 N 个静音样本,以确保不会丢失任何内容)

*) 如何选择长度 N,需要平衡两个因素。长度不能太长,因为过滤效果应该是局部的。使其等于采样率使滤波器的效果范围为 ±1 秒。使它太小会导致滤波器不准确和“泄漏”频率。用肉眼检查脉冲响应值时,请检查最外面的值(样本 0 和样本 N-1)是否足够小。对于 16 位信号,一个不错的选择是 < 1/32768 (~0.00003)。

尽管如此,除非您的滤波器通过亚音速,否则只有后一个标准很重要,因为脉冲会很短。我首先会严重高估过滤器的大小,比如 N=1000,然后寻找第一个样本(从外向中心)超过这个阈值,然后你会找到理想的 N。

[编辑] 我刚刚注意到在我的 Audacity (v2.2.1) 中,您可以指定“过滤器大小”并以绿色预览响应的外观。我在你的屏幕截图中没有看到这个选项。