public static Matrix Noise() { int Fs = 1024 * 2; Debug.Assert(Fs == 1024 * 2); var Model = new Matrix(113); for (int i = 0; i < Model.Capacity; i++) { double[] re = new double[CBOW.DIMS], im = new double[CBOW.DIMS]; for (int j = 0; j < CBOW.DIMS; j++) { re[j] = ((global::Random.Next() & 0xFFFF) / (65536f)) * ((global::Random.Next() & 0xFFFF) / (65536f)); im[j] = Envelopes.MIDI2FREQ(j); if (((global::Random.Next() & 0xFFFF) / (65536f)) > 0.3) { re[j] = 0; } } Vector it = new Vector("𝆕", re, im); var duration = Math.Round((double)Fs / Wav._hz, 5); Debug.Assert((int)(duration * Wav._hz) == Fs); double scale = 1.6; it.Score.Re = scale * duration; for (int j = 0; j < CBOW.DIMS; j++) { RunSpeachFrequencyFilters(it, j); } Model[i] = it; } return(Model); }
static Vector CreateMidiVector(Complex[] fft) { int N = fft.Length * 2; Debug.Assert(N == 1024); double[] im = new double[128]; Vector vec = new Vector("𝅘𝅥𝅮", null, im); var duration = Math.Round( (double)N / Wav._hz, 5); Debug.Assert((int)(duration * Wav._hz) == N); vec.Score.Re = duration; vec.Score.Im = N; for (int i = 0; i < fft.Length; i++) { double h = Wav._hz / (double)N, f = i * h; double vol = fft[i].Abs(); var m = Envelopes.FREQ2MIDI(f); if (m >= 0 && m < vec.Axis.Length && vol > 1E-3) { vec.Axis[m].Re += vol; vec.Axis[m].Im += 1; } } for (int m = 0; m < vec.Axis.Length; m++) { if (vec.Axis[m].Im == 0) { vec.Axis[m].Re = 0; } else { vec.Axis[m].Re /= vec.Axis[m].Im; } vec.Axis[m].Im = Envelopes.MIDI2FREQ(m); Debug.Assert(Envelopes.FREQ2MIDI(vec.Axis[m].Im) == m); } Debug.Assert(vec.Axis[69].Im == 440); return(vec); }
static Vector MelFromFourier(Complex[] STFT) { int Fs = STFT.Length * 2; Debug.Assert(Fs == 1024 * 2); double[] re = new double[CBOW.DIMS], im = new double[CBOW.DIMS], cc = new double[CBOW.DIMS]; for (int i = 0; i < STFT.Length; i++) { double h = Wav._hz / (double)Fs, f = i * h; var m = Envelopes.FREQ2MIDI(f); Debug.Assert(m == Envelopes.FREQ2MIDI(Envelopes.MIDI2FREQ(m))); if (m >= 0 && m < CBOW.DIMS) { re[m] += STFT[i].Abs(); cc[m] += +1; } } for (int m = 0; m < CBOW.DIMS; m++) { // Normalize if (cc[m] > 0) { re[m] /= cc[m]; } im[m] = Envelopes.MIDI2FREQ(m); } Vector it = new Vector("𝆕", re, im); var duration = Math.Round((double)Fs / Wav._hz, 5); Debug.Assert((int)(duration * Wav._hz) == Fs); double scale = 1.6; it.Score.Re = scale * duration; return(it); }