Как разделить результаты БПФ на произвольное количество полос частот с использованием логарифмической шкалы - PullRequest
0 голосов
/ 14 марта 2019

Я использую код из учебника, чтобы сделать БПФ в 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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...