コード例 #1
0
ファイル: Mel.cs プロジェクト: azret/mozart
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
ファイル: Mel.cs プロジェクト: azret/mozart
        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);
        }