在 Unity 中预处理音频频谱数据

Posted

技术标签:

【中文标题】在 Unity 中预处理音频频谱数据【英文标题】:Pre-processing Audio Spectrum Data in Unity 【发布时间】:2017-06-01 15:41:39 【问题描述】:

我正在尝试在播放歌曲之前对歌曲进行预处理并实施一些节拍检测(不是在歌曲播放时实时进行)。我的基本想法是以每秒大约 90 次的速度对频谱数据进行采样,我试图通过将 Audiosource.timeSamples 增加一个值并调用 AudioSource.GetSpectrumData() 来做到这一点。但是我提供的数组似乎总是充满了相同的值。

似乎设置 timeSamples 实际上并没有更新 AudioSource 正在使用的样本。但是,如果我正常播放歌曲并调用GetSpectrumData(),我的数组中将填充我所期望的正确数据。

当我调用 GetSpectrumData() 时,我可以做些什么来让 AudioSource 使用在 timeSamples 中设置的样本,或者我应该通过其他方式解析歌曲以获取此数据?

谢谢

这是一个代码示例(歌曲是一个 AudioSource),第二个 for 循环是感兴趣的区域:

float[][] get_spectrum_data()

    int samples = song.clip.samples;
    int sample_rate = song.clip.frequency / parse_rate;
    int arr_siz = samples / sample_rate;
    FFTWindow win = FFTWindow.Rectangular;  //which type do we want?

    float[][] spectrum = new float[arr_siz][];
    for (int i = 0; i < arr_siz; i++)
    
        spectrum[i] = new float[spec_res];
    

    for (int i = 1, j = 0; j < arr_siz; i += sample_rate, j++)
    
        song.timeSamples = i;
        song.GetSpectrumData(spectrum[j], 0, win);
    

    return spectrum;

【问题讨论】:

【参考方案1】:

我认为 AudioSource.GetSpectrumData 依赖于当前正在播放的 AudioSource。我的猜测是它是从音频线程而不是剪辑本身采样的,因为用户可能还添加了后续的音频过滤器。尝试在循环中显式播放剪辑:

for (int i = 1, j = 0; j < arr_siz; i += sample_rate, j++)

    song.Play();
    song.timeSamples = i;
    song.GetSpectrumData(spectrum[j], 0, win);

【讨论】:

以上是关于在 Unity 中预处理音频频谱数据的主要内容,如果未能解决你的问题,请参考以下文章

Python音频处理——信号,波形与频谱

在将数据输入 FFT 用于音频频谱分析仪之前,使用 python 将 wav 文件转换为 csv 文件 [关闭]

基于梅尔频谱的音频信号分类识别(Pytorch)

librosa音频处理教程

绘制音频波形和频谱图重叠

用MATLAB设计对信号进行频谱分析和滤波处理的程序