Example #1
0
    // Update is called once per frame
    void Update()
    {
        for (int i = 1024, j = 0; i < fakeSize; i++, j++)
        {
            lastsamples[j] = lastsamples[i];
        }
        for (int i = 0, j = fakeSize - 1024; j < fakeSize; i++, j++)
        {
            lastsamples[j] = samples[i];
        }


        MasterInput.RetrieveWaveform(FilterType.Bypass, samples);

        for (int i = 0; i < lastsamples.Length; i++)
        {
            freq[i] = new Complex(lastsamples[i], 0);
        }
        for (int i = 0; i < samples.Length; i++)
        {
            freq[lastsamples.Length + i] = new Complex(samples[i], 0);
        }

        for (int i = 0; i < samples.Length; i++)
        {
            Debug.DrawLine(new Vector3(i, 0), new Vector3(i, samples[i] * 20), Color.cyan);
        }

        FFT.CalculateFFT(freq, false);

        for (int i = 0; i < freq.Length / 2; i++) // plot only the first half
        {
            // multiply the magnitude of each value by 2
            Debug.DrawLine(new Vector3(i, 200), new Vector3(i, 200 + (float)freq[i].magnitude * 200), Color.white);
        }

        List <FreqData> maximas = new List <FreqData>();

        for (int i = imin; i < imax; i++)
        {
            if (freq[i].magnitude > noteThreshold)
            {
                if (freq[i].magnitude > freq[i - 1].magnitude && freq[i].magnitude > freq[i + 1].magnitude)
                {
                    FreqData temp = new FreqData();
                    temp.location = i;
                    temp.mag      = freq[i].magnitude;
                    maximas.Add(temp);
                }
            }
        }

        if (maximas.Count > 0)
        {
            maximas.Sort((s1, s2) => s1.mag.CompareTo(s2.mag));
            float    maxFreq = maximas[0].location * freqStep;
            int      closest = (int)FreqToNumber(maxFreq);
            float    closestFreq = NumberToFreq(closest);
            ColorHSV colorA = Colors[closest % 12], colorB;
            if (maxFreq - closestFreq > 0)
            {
                colorB = Colors[(closest + 1) % 12];
            }
            else
            {
                colorB = Colors[(closest - 1) % 12];
            }

            var   mainModule = objectToColorChange.main;
            Color x = ColorHSV.Lerp(colorA, colorB, Mathf.Abs(maxFreq - closestFreq) / maxFreq).ToColor();
            mainModule.startColor = x;
        }
    }
Example #2
0
        protected override double[][] TrainWeights()
        {
            var dim      = DataDim;
            var cnt      = DataCount;
            var alp      = Alpha;
            var classes  = Classes;
            var cTotals  = new double[classes.Length];
            var idfFreqs = new int[dim];
            var weights  = new double[classes.Length][];

            foreach (var cls in classes)
            {
                weights[cls.Value] = new double[dim];
            }
            var freqDatas = new FreqData[dim][];

            for (int i = 0; i < dim; i++)
            {
                freqDatas[i] = new FreqData[cnt];
            }

            // TF transform
            int idx = -1;

            foreach (var doc in TrainingSample)
            {
                var  text = doc.Key;
                var  cls  = doc.Value;
                bool isEmpty;
                var  data = ExtractFeatureVector(text, out isEmpty);
                if (isEmpty)
                {
                    continue;
                }

                idx++;

                m_TFWeightingScheme.Reset();

                for (int i = 0; i < dim; i++)
                {
                    var f  = data[i];
                    var tf = m_TFWeightingScheme.GetFrequency(data, i);
                    freqDatas[i][idx] = new FreqData(tf, cls);

                    if (f > 0)
                    {
                        idfFreqs[i] += 1;
                    }
                }
            }

            cnt = idx + 1;

            // IDF transform
            var idfWeights = IDFWeightingScheme.GetWeights(dim, idfFreqs);

            for (var i = 0; i < dim; i++)
            {
                var idf      = idfWeights[i];
                var freqData = freqDatas[i];

                for (var j = 0; j < cnt; j++)
                {
                    var fData  = freqData[j];
                    var fValue = fData.Value * idf;
                    var cls    = fData.Class;

                    weights[cls.Value][i] += fValue;
                    cTotals[cls.Value]    += fValue;
                }
            }

            // calculate weights
            foreach (var cls in classes)
            {
                var ws = weights[cls.Value];
                var t  = cTotals[cls.Value];
                if (UseSmoothing)
                {
                    t += alp * dim;
                }

                for (int i = 0; i < dim; i++)
                {
                    var w = ws[i];
                    if (UseSmoothing)
                    {
                        w += alp;
                    }

                    ws[i] = Math.Log(w / t);
                }
            }

            return(weights);
        }
Example #3
0
        protected override double[][] TrainWeights()
        {
            var dim      = DataDim;
            var cnt      = DataCount;
            var alp      = Alpha;
            var classes  = Classes;
            var idfFreqs = new int[dim];
            var cTotals  = new double[classes.Length];
            var weights  = new double[Classes.Length][];

            foreach (var cls in Classes)
            {
                weights[cls.Value] = new double[dim];
            }
            var freqDatas = new FreqData[dim][];

            for (int i = 0; i < dim; i++)
            {
                freqDatas[i] = new FreqData[cnt];
            }

            // TF transform
            int idx = -1;

            foreach (var doc in TrainingSample)
            {
                var  text = doc.Key;
                var  cls  = doc.Value;
                bool isEmpty;
                var  data = ExtractFeatureVector(text, out isEmpty);
                if (isEmpty)
                {
                    continue;
                }
                idx++;

                TFWeightingScheme.Reset();

                for (int i = 0; i < dim; i++)
                {
                    var f  = data[i];
                    var tf = TFWeightingScheme.GetFrequency(data, i);
                    freqDatas[i][idx] = new FreqData(tf, cls);

                    if (f > 0)
                    {
                        idfFreqs[i] += 1;
                    }
                }
            }

            cnt = idx + 1;

            // IDF transform
            var idfWeights = IDFWeightingScheme.GetWeights(dim, idfFreqs);

            for (var i = 0; i < dim; i++)
            {
                var idf      = idfWeights[i];
                var freqData = freqDatas[i];

                for (var j = 0; j < cnt; j++)
                {
                    var fData = freqData[j];
                    freqData[j] = new FreqData(fData.Value * idf, fData.Class);
                }
            }

            // length norm
            for (var j = 0; j < cnt; j++)
            {
                var norm = 0.0D;
                for (var i = 0; i < dim; i++)
                {
                    var fData = freqDatas[i][j];
                    norm += (fData.Value * fData.Value);
                }
                norm = Math.Sqrt(norm);

                for (var i = 0; i < dim; i++)
                {
                    var fData = freqDatas[i][j];
                    freqDatas[i][j] = new FreqData(fData.Value / norm, fData.Class);
                }
            }

            // complements
            for (var j = 0; j < cnt; j++)
            {
                foreach (var cCls in Classes)
                {
                    var ws = weights[cCls.Value];

                    for (var i = 0; i < dim; i++)
                    {
                        var fData = freqDatas[i][j];
                        var f     = fData.Value;
                        var cls   = fData.Class;

                        if (cCls.Equals(cls))
                        {
                            break;
                        }

                        ws[i] += f;
                        cTotals[cCls.Value] += f;
                    }
                }
            }

            // take logarithm
            foreach (var cls in Classes)
            {
                var ws = weights[cls.Value];
                var t  = cTotals[cls.Value];
                if (UseSmoothing)
                {
                    t += alp * dim;
                }

                for (int i = 0; i < dim; i++)
                {
                    var w = ws[i];
                    if (UseSmoothing)
                    {
                        w += alp;
                    }

                    ws[i] = -Math.Log(w / t);
                }
            }

            // weight normalization

            foreach (var cls in Classes)
            {
                cTotals[cls.Value] = 0;
                var ws = weights[cls.Value];

                for (var i = 0; i < dim; i++)
                {
                    cTotals[cls.Value] += Math.Abs(ws[i]);
                }
            }

            foreach (var cls in Classes)
            {
                var t  = cTotals[cls.Value];
                var ws = weights[cls.Value];

                for (var i = 0; i < dim; i++)
                {
                    ws[i] = ws[i] / t;
                }
            }

            return(weights);
        }