是否可以在 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;
}
我一直在制作一款音乐游戏,我在其中使用 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;
}