是否可以在 getAudioSpectum() 中消除音量和频谱之间的相关性?

is it possible to remove correlation between volume and spectrum in getAudioSpectum()?

我一直在制作一款音乐游戏,我在其中使用 myAudioSource.getSpectrumData() 获取频谱。但我注意到频谱直接取决于声音的音量,成正比:音量越大,频谱越大。这会带来以下问题:零音量会使游戏停止,大音量会使它过于敏感并且无法正常工作。我试图将频谱归一化,但无论如何它都是相关的,就在 [0,1] 中。用音量做一些变换?它无论如何都会关联。

有没有办法获取频谱数据或以某种方式对其进行转换,使其与音量无关?

例如,如果一首歌太大声,那么来自频谱的最大部分值将在 [0.9, 1] 中用于归一化频谱数据。如果同一首歌变小声,则为[0.1, 0.3]音程。

代码:


private AudioSource src;

private void Start()
{
     _samplesArray =  new float[64];
}

private void Update() 
{
      // Every frame get spectrum into _samplesArray with size 64
      src.GetSpectrumData(_samplesArray, 0, FFTWindow.Rectangular);
}

完全有道理:

  • 如果音量低,那么在整个频谱上您会得到较低的值/范围/峰值
  • 如果音量很高,那么您可以预期整个频谱会移动到更高的范围

您可以/必须使用例如

简单地归一化光谱
using System.Linq;

...

_samplesArray = _samplesArray.Select(s => s / src.volume).ToArray();

或者没有 Linq 可能更好理解

for(var i = 0; i < _samplesArray.Length; i++)
{
    _samplesArray[i] /= src.volume;
}