音频信号归一化

4
我希望能够可靠地使用specgram在Python中将录制的音频(通过麦克风)和处理后的音频(WAV文件)转换为相同的离散表示。我的流程如下:
  1. 获取原始样本(从文件读取或从麦克风流式传输)
  2. 进行一些归一化(???)
  3. 使用窗口执行FFT以生成声谱图(在频率和时间上绘制振幅峰值)
  4. 将音频中的峰值离散化,然后记忆
基本上,当我到达最后的离散化过程时,我希望尽可能可靠地在相同的歌曲的频率/时间/振幅空间中获得相同的值。
我的问题是如何解决录制和WAV读取音频中音量(即样本的振幅)不同的情况?
我的归一化选项(也许?):
  • 在进行FFT之前,将窗口中的所有样本除以平均值
  • 去趋势化 在进行FFT之前,对窗口中的所有样本进行处理
  • 在进行FFT之前,将窗口中的所有样本除以最大幅度样本值(对噪声和异常值敏感)
  • 将频谱图中的所有幅度除以平均值

我应该如何解决这个问题?我几乎没有信号处理知识或经验。


由于噪声可能永远不会达到最高振幅,因此您可以在FFT之前执行以下操作来处理:1)将每个样本除以其相应的最大振幅;2)然后在FFT之前乘以目标公共振幅;3)在归一化样本中执行FFT。 - Saullo G. P. Castro
我不确定我理解这个问题,但如果你只关心频谱图中的峰值位置,那么就没有必要归一化振幅。 - Bjorn Roche
@SaulloCastro:什么是“目标共振幅度”? - lollercoaster
@BjornRoche:我的理解是,频谱图表示窗口时间和频率的信号振幅(与音量相关)。如果这种想法是正确的,那么规范化振幅以考虑不同音量的标量倍数是否有意义? - lollercoaster
@lollercoaster,通过目标公共振幅,我指的是您希望在最终达到的公共音量。 - Saullo G. P. Castro
显示剩余5条评论
1个回答

4
WAV文件和录制的音频的频谱永远不会完全相同,因为从麦克风源获取的音频数据在传输到计算机时会受到额外的干扰。这些干扰可以被均衡掉,但这可能比你想做的更多工作。
至于归一化,我建议缩放麦克风信号的频谱,使其能量与WAV文件的频谱相匹配(其中“能量”是FFT系数的平方幅值之和)。
现在,你提到希望信号的频谱图尽可能相似。由于频谱图是一个信号随时间变化的频谱绘图,因此你可能需要尝试在每个时间间隔重新归一化,而不仅仅是在整个音频录制过程中进行归一化。

对于您的第三点,是的,我会在每个窗口间隔上进行归一化处理,而不是整个录音。对于您的第二点:您所说的缩放是指将频谱周期图除以系数绝对值平方的和吗?这必须在FFT之后完成,但我对此表示怀疑,因为这可能不是一个好建议... - lollercoaster
我同意光谱不会完全相同,但只要显著峰值相同,那就可以了。 - lollercoaster
@lollercoaster 让我试着澄清我的第二点...假设你有两个音频信号,a 和 b。如果你对这些信号进行 FFT 处理,你将得到它们的频谱 A 和 B。现在假设你想要缩放 A,使其与 B 的“大小”相同。由于我将使用信号能量作为“大小”的度量标准,因此我想找到一个常数系数,使得 sum(abs(c*A)**2) = sum(abs(B)**2),其中 c 是常数系数。 - David Wurtz
好的,我的问题是信号能量是否等同于音量,以及为什么我在FFT之前不进行归一化。 - lollercoaster
1
是的,信号能量等同于音量。关于在进行FFT之前进行归一化,是的,你完全可以这样做。实际上,这些操作是等效的。您可以计算音频样本的平方绝对值之和,也可以计算FFT系数的平方绝对值之和。根据Parseval定理,它们是等价的。http://en.wikipedia.org/wiki/Parseval's_theorem - David Wurtz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接