如本例所示 ,如何从输入音频流中提取频率信息(使用 PortAudio)? 我对portaudio和numpy很好奇...
我对 fft 不是 100% 确定,我怎样才能通过 numpy 一个块并取回从 -1.0 到 1.0 的三个值来表示低音、中音和高音?
我不介意这只是针对一个频道,因为我可以理解其中的音频部分,当我看着它们时,这是在我面前游泳的数学:)
在您指向的 SO 问题的选定答案中提到的傅立叶变换为您提供了“频谱” - 大量值的集合,给出了每个频率范围/频率片中的声音强度(例如,表示为赫兹)。
如您所愿,如何将(例如)一千个强度(例如,每个 10 赫兹的频谱切片一个)转换为三个数字,这当然是一个启发式问题——例如,您可以决定哪些范围频率对应于“低音”和“高音”,中间的一切都是“中”,并计算每个的平均强度。对于它的价值,我相信“低音”的常见约定是高达 250Hz,“高音”是 6KHz 及以上(中间是“中音”),参见例如这个页面- 但它是一个随意的约定,所以,“挑选你的毒药”!-)
一旦你有了相对水平,你就会想要将它们相互标准化并适当地缩放它们以位于你想要的范围内(大概是对数刻度,因为这就是人类听力的工作方式;-)。
实际上,您不会使用傅立叶变换来执行此操作。
通常使用滤波器将任何音频信号拆分为低音、中音和高音。滤波器是衰减某些频率范围的信号处理设备。滤波器可以数字或电子方式构建。例如,它们用于扬声器的音频分频系统。
要获得低频低音部分,您将使用低通滤波器。低通滤波器滤除高频。它们也被称为“高切”滤波器。
要获得中频中间部分,您将使用带通滤波器。带通滤波器滤除低频和高频。它们也被称为“钟形过滤器”。
要获得高频高音部分,您将使用高通滤波器。高通滤波器滤除任何低频。它们也被称为“低切”滤波器。
实际上,您也可以只使用高通和低通滤波器。如果从原始信号中减去两个滤波信号,则结果将是带通滤波信号。这为您节省了一个过滤器。
每个滤波器都有一个阈值频率。阈值频率是一个特殊的频率,滤波器应该从该频率开始过滤。根据滤波器阶数,信号将衰减 6 dB/oct(一阶)、12 dB/oct(二阶)、18 dB/oct(三阶)等。对于您的应用,二阶设计是可能没问题。
请注意,过滤器通常会以某些方式干扰您的信号,并且阶数越高,它的声音就越大。顺便说一句,这是纯粹的物理现象,适用于包括傅立叶变换在内的所有信号处理。
使用这三个滤波器(可以)等效于仅使用三个光谱点进行傅里叶变换。