【问题标题】:Normalizing audio signal标准化音频信号
【发布时间】:2013-09-19 11:10:33
【问题描述】:

我想使用specgram 可靠地将录制的音频(通过麦克风)和处理的音频(WAV 文件)转换为 Python 中相同的离散化表示。

我的流程如下:

  1. 获取原始样本(从文件中读取或从麦克风流中读取)
  2. 执行一些标准化 (???)
  3. 使用加窗执行 FFT 以生成频谱图(用幅度峰值绘制频率与时间的关系图)
  4. 离散化音频中的峰值,然后记住

基本上,当我进入最后一个离散化过程时,我希望尽可能可靠地在同一首歌曲的频率/时间/幅度空间中达到相同的值。

我的问题是我如何解释录制的和 WAV 读取的音频中不同的音量(即样本的幅度)?

我的规范化选项(也许?):

  • 在 FFT 之前将窗口中的所有样本除以平均值
  • Detrend FFT 前窗口中的所有样本
  • 在 FFT 之前将窗口中的所有样本除以最大幅度样本值(对噪声和异常值敏感)
  • 将频谱图中的所有幅度除以平均值

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

【问题讨论】:

  • 由于噪声可能永远不会具有最高幅度,因此您可以 1) 在 FFT 之前将每个样本除以其各自的最大幅度; 2) 然后在 FFT 之前乘以目标公共幅度; 3)在归一化样本中进行FFT
  • 我不确定我是否理解这个问题,但如果您只关心频谱图中的峰值位置,则无需对幅度进行归一化。
  • @SaulloCastro:什么是“目标共同幅度”?
  • @BjornRoche:我的理解是频谱图表示信号的幅度(与音量相关)作为窗口和频率时间的函数。如果这种想法是正确的,那么将幅度归一化以考虑不同的音量标量倍数是否有意义?
  • @lollercoaster 目标共同幅度我的意思是您希望在最后拥有的共同幅度,共同音量...

标签: python audio numpy matplotlib signal-processing


【解决方案1】:

WAV 文件的频谱和录制的音频永远不会具有完全相同的形状,因为来自麦克风源的音频数据在传输到您的计算机时会受到额外的干扰。这些干扰可以被抵消,但这可能比你想做的工作更多。

就归一化而言,我建议缩放麦克风信号的频谱,使其能量与 WAV 文件的频谱相匹配(其中“能量”是 FFT 系数的平方幅度之和)。

现在,您提到您希望信号的频谱图尽可能相似。由于频谱图是信号频谱随时间变化的图,因此您可能希望尝试在每个时间间隔重新归一化,而不是在整个录音中仅归一化一次。

【讨论】:

  • 到您的第三点,是的,我对每个窗口间隔进行标准化,而不是整个记录。到您的第二点:按比例,您的意思是将频谱周期图除以系数的绝对值的平方和?不过,这必须在 FFT 之后完成,我怀疑这是个好建议……
  • 我同意光谱不会相同,但只要显着峰相同,就可以了
  • @lollercoaster 让我试着澄清我的第二点......假设你有两个音频信号,a 和 b。如果你对这些信号进行 FFT,你会得到它们的光谱,A 和 B。现在假设你想要缩放 A,使其与 B 的“大小”相同。因为我将使用信号能量作为“大小”的度量我想找到一个常数系数,使得 sum(abs(c*A)**2) = sum(abs(B)**2),其中 c 是常数系数。
  • 好吧,我的问题是信号能量是否等同于音量,以及为什么我在 FFT 之前不归一化
  • 是的,信号能量等于音量。至于在进行 FFT 之前进行归一化,是的,您完全可以。实际上,操作是等价的。您可以计算音频样本的平方绝对值之和,也可以计算 FFT 系数的平方绝对值之和。根据 Parseval 定理,它们是等价的。 en.wikipedia.org/wiki/Parseval's_theorem
猜你喜欢
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
  • 2016-03-28
相关资源
最近更新 更多