Я использую код из учебника, чтобы сделать БПФ в Unity и суммировать результат в частотных диапазонах.Учебник работает с использованием 8 полос.Я пытаюсь адаптировать его для использования 32, 64 или 128 полос.
Я думаю, что мне нужно сделать, это создать окна выборки для полос, используя логарифмическую шкалу, которая помещается в 512, чтобы заменить эту строку int windowSize = (int)Mathf.Pow(2, i) * 2;
, но понятия не имею, как это сделать.
Полный код для класса FFT:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(AudioSource))]
public class AudioPeer : MonoBehaviour
{
AudioSource _audioSource;
public static float[] _samples = new float[2048];
public static float[] _freqBand = new float[10];
public static float[] _bandBuffer = new float[10];
float[] _bufferDecrease = new float[10];
// Start is called before the first frame update
void Start()
{
_audioSource = GetComponent<AudioSource>();
}
void Update()
{
GetSpectrumAudioSource();
makeFrequencyBands();
BandBuffer();
}
void BandBuffer()
{
for (int i = 0; i < _freqBand.Length; ++i)
{
if (_freqBand[i] > _bandBuffer[i])
{
_bandBuffer[i] = _freqBand[i];
_bufferDecrease[i] = 0.005f;
}
if (_freqBand[i] < _bandBuffer[i])
{
_bandBuffer[i] -= _bufferDecrease[i];
_bufferDecrease[i] *= 1.3f;
}
}
}
void GetSpectrumAudioSource()
{
_audioSource.GetSpectrumData(_samples, 0, FFTWindow.Blackman);
}
void makeFrequencyBands()
{
int currentBin = 0;
for (int i = 0; i < 10; i++)
{
float average = 0;
int windowSize = (int)Mathf.Pow(2, i) * 2;
print(currentBin);
for (int j = 0; j < windowSize; j++)
{
average += _samples[currentBin] * (currentBin + 1);
currentBin++;
}
average /= windowSize;
_freqBand[i] = average * 10;
}
}
}