Пример #1
0
        public LogarithmicSpectrum(float[] data, int bands, float minFrequency = -1, float maxFrequency = -1)
        {
            int dataReferenceCount = (data.Length - 1) * 2;

            int fromIndex = minFrequency < 0 ? 0 : FrequencyHelper.GetIndexOfFrequency(minFrequency, dataReferenceCount).Clamp(0, data.Length - 1 - bands); // -bands since we need at least enough data to get our bands
            int toIndex   = maxFrequency < 0 ? data.Length - 1 : FrequencyHelper.GetIndexOfFrequency(maxFrequency, dataReferenceCount).Clamp(fromIndex, data.Length - 1);

            int usableSourceData = Math.Max(bands, (toIndex - fromIndex) + 1);

            Bands = new Band[bands];

            double ratio       = Math.Pow(usableSourceData, 1.0 / bands);
            double calculation = 1;

            int index = fromIndex;

            for (int i = 0; i < Bands.Length; i++)
            {
                calculation *= ratio;
                int count = Math.Max(1, ((int)calculation) - index);

                float[] bandData = new float[count];
                Array.Copy(data, index, bandData, 0, count);
                Bands[i] = new Band(FrequencyHelper.GetFrequencyOfIndex(index, dataReferenceCount),
                                    FrequencyHelper.GetFrequencyOfIndex(index + count, dataReferenceCount),
                                    bandData);

                index += count;
            }
        }
Пример #2
0
        public LinearSpectrum(float[] data, int bands, float minFrequency = -1, float maxFrequency = -1)
        {
            int dataReferenceCount = (data.Length - 1) * 2;

            int fromIndex = minFrequency < 0 ? 0 : FrequencyHelper.GetIndexOfFrequency(minFrequency, dataReferenceCount).Clamp(0, data.Length - 1 - bands); // -bands since we need at least enough data to get our bands
            int toIndex   = maxFrequency < 0 ? data.Length - 1 : FrequencyHelper.GetIndexOfFrequency(maxFrequency, dataReferenceCount).Clamp(fromIndex, data.Length - 1);

            int usableSourceData = Math.Max(bands, (toIndex - fromIndex) + 1);

            Bands = new Band[bands];

            double frequenciesPerBand = (double)usableSourceData / bands;
            double frequencyCounter   = 0;

            int index = fromIndex;

            for (int i = 0; i < Bands.Length; i++)
            {
                frequencyCounter += frequenciesPerBand;
                int count = (int)frequencyCounter;

                float[] bandData = new float[count];
                Array.Copy(data, index, bandData, 0, count);
                Bands[i] = new Band(FrequencyHelper.GetFrequencyOfIndex(index, dataReferenceCount),
                                    FrequencyHelper.GetFrequencyOfIndex(index + count, dataReferenceCount),
                                    bandData);

                index            += count;
                frequencyCounter -= count;
            }
        }
Пример #3
0
        public GammaSpectrum(float[] data, int bands, float gamma = 2, float minFrequency = -1, float maxFrequency = -1)
        {
            int dataReferenceCount = (data.Length - 1) * 2;

            int fromIndex = minFrequency < 0 ? 0 : FrequencyHelper.GetIndexOfFrequency(minFrequency, dataReferenceCount).Clamp(0, data.Length - 1 - bands); // -bands since we need at least enough data to get our bands
            int toIndex   = maxFrequency < 0 ? data.Length - 1 : FrequencyHelper.GetIndexOfFrequency(maxFrequency, dataReferenceCount).Clamp(fromIndex, data.Length - 1);

            int usableSourceData = Math.Max(bands, (toIndex - fromIndex) + 1);

            Bands = new Band[bands];

            int index = fromIndex;

            for (int i = 0; i < Bands.Length; i++)
            {
                int count = Math.Max(1, (((int)(Math.Pow((i + 1f) / Bands.Length, gamma) * usableSourceData))) - index);

                float[] bandData = new float[count];
                Array.Copy(data, index, bandData, 0, count);
                Bands[i] = new Band(FrequencyHelper.GetFrequencyOfIndex(index, dataReferenceCount),
                                    FrequencyHelper.GetFrequencyOfIndex(index + count, dataReferenceCount),
                                    bandData);

                index += count;
            }
        }