// 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; } }
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); }
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); }