【问题标题】:How to use numpy with portaudio to extract bass, mid treble如何使用带有 portaudio 的 numpy 提取低音、中高音
【发布时间】:2010-12-20 02:57:39
【问题描述】:

在这个例子中How to extract frequency information from an input audio stream (using PortAudio)? 我对 portaudio 和 numpy 很好奇...

我对 fft 不是 100% 确定,我怎样才能传递一个 numpy 块并取回从 -1.0 到 1.0 的三个值(低音、中音和高音)?

我不介意这只是针对一个频道,因为我可以理解其中的音频部分,当我看到它们时,它是浮现在我面前的数学 :)

【问题讨论】:

  • 您希望 -1 到 1.0 是什么意思?您使用哪些频率范围来定义低音、中音和高音?

标签: python audio numpy fft portaudio


【解决方案1】:

实际上,您不会使用傅里叶变换来执行此操作。

在低音、中音和高音中分割任何音频信号通常使用滤波器来完成。 filter 是一种衰减某些频率范围的信号处理设备。滤波器可以数字或电子方式构建。例如,它们用于扬声器的音频分频系统。

要获得低频低音部分,您需要使用低通滤波器。低通滤波器滤除高频。它们也被称为“高切”过滤器。
要获得中频中间部分,您将使用带通滤波器。带通滤波器滤除低频和高频。它们也被称为“钟形过滤器”。
要获得高频高音部分,您将使用高通滤波器。高通滤波器滤除任何低频。它们也被称为“低切”滤波器。

其实你也可以只使用高通和低通滤波器。如果从原始信号中减去两个滤波信号,则结果将是带通滤波信号。这样可以为您节省一个过滤器。

每个过滤器都有一个阈值频率。阈值频率是一个特殊的频率,滤波器应该从该频率开始过滤。根据滤波器阶数,信号将衰减 6 dB/oct(一阶)、12 dB/oct(二阶)、18 dB/oct(三阶)等。对于您的应用,二阶设计是可能没问题。
请注意,过滤器通常会以某些方式干扰您的信号,并且阶数越高,它的声音就越大。顺便说一句,这是纯粹的物理现象,适用于包括傅立叶变换在内的所有信号处理。

使用这三个滤波器(可以)等效于仅使用三个光谱点进行傅里叶变换。

【讨论】:

    【解决方案2】:

    Fourier Transform,在您指向的 SO 问题的选定答案中提到,为您提供“频谱”——大量值给出了每个频率范围/频率片中的声音强度(表示为,例如,以赫兹为单位)。

    如您所愿,如何将(比如说)一千个强度(例如,每 10 赫兹频谱片一个)转换为三个数字,这当然是一个非常具有启发性的问题——例如,您可以决定哪些频率范围对应于“低音”和“高音”,中间的所有内容都是“中”,并计算每个的平均强度。对于它的价值,我相信“低音”的常见约定是高达 250Hz,对于“高音”6KHz 及以上(介于两者之间的是“中音”),cfr 例如this page -- 但这是一个相当随意的约定,所以,“选择你的毒药”!-)

    一旦你有了 relative 水平,你会想要将它们相互标准化并适当地缩放它们以位于你想要的范围内(大概是对数尺度,因为这就是人类听觉的工作方式;-)。

    【讨论】:

    • 选择频率是个好点,现在使用三个相同大小的范围就足够了。为了速度,我宁愿能够从 numpy 取回 3 个切片,而不是使用 python 来转换频谱。因为这是用于图形的,所以这可能就足够了,如果不是,我以后可以弄乱频率。主要的优先级是性能,而不是在纯 python 中做太多的处理。
    猜你喜欢
    • 2013-03-05
    • 1970-01-01
    • 2019-05-21
    • 2010-09-20
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 2011-05-01
    • 2019-07-30
    相关资源
    最近更新 更多