コード例 #1
0
ファイル: ChromaTest.cs プロジェクト: gaborp/AcoustID.NET
        public void TestNormalB()
        {
            FeatureVectorBuffer buffer = new FeatureVectorBuffer();
            Chroma chroma = new Chroma(10, 510, 256, 1000, buffer);
            FFTFrame frame = new FFTFrame(128);
            frame.Data[64] = 1.0; // 250 Hz
            chroma.Consume(frame);
            Assert.AreEqual(12, buffer.features.Length);
            double[] expected_features = {
		        0.0, 0.0, 1.0, 0.0, 0.0, 0.0,
		        0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
	        };
            for (int i = 0; i < 12; i++)
            {
                Assert.AreEqual(expected_features[i], buffer.features[i], 0.0001);
            }
        }
コード例 #2
0
ファイル: ChromaTest.cs プロジェクト: gaborp/AcoustID.NET
        public void TestInterpolatedB()
        {
            FeatureVectorBuffer buffer = new FeatureVectorBuffer();
            Chroma chroma = new Chroma(10, 510, 256, 1000, buffer);
            chroma.Interpolate = true;
            FFTFrame frame = new FFTFrame(128);
            frame.Data[64] = 1.0;
            chroma.Consume(frame);
            Assert.AreEqual(12, buffer.features.Length);
            double[] expected_features = {
		        0.0, 0.286905, 0.713095, 0.0, 0.0, 0.0,
		        0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
	        };
            for (int i = 0; i < 12; i++)
            {
                Assert.AreEqual(expected_features[i], buffer.features[i], 0.0001);
            }
        }
コード例 #3
0
 public void Consume(FFTFrame frame)
 {
     for (int i = 0; i < NumBands(); i++)
     {
         int    first       = FirstIndex(i);
         int    last        = LastIndex(i);
         double numerator   = 0.0;
         double denominator = 0.0;
         for (int j = first; j < last; j++)
         {
             double s = frame.Energy(j);
             numerator   += j * s;
             denominator += s;
         }
         m_features[i] = denominator / (last - first);
     }
     m_consumer.Consume(m_features);
 }
コード例 #4
0
ファイル: Spectrum.cs プロジェクト: gaborp/AcoustID.NET
 public void Consume(FFTFrame frame)
 {
     for (int i = 0; i < NumBands(); i++)
     {
         int first = FirstIndex(i);
         int last = LastIndex(i);
         double numerator = 0.0;
         double denominator = 0.0;
         for (int j = first; j < last; j++)
         {
             double s = frame.Energy(j);
             numerator += j * s;
             denominator += s;
         }
         m_features[i] = denominator / (last - first);
     }
     m_consumer.Consume(m_features);
 }
コード例 #5
0
ファイル: Chroma.cs プロジェクト: gfdittmer/AcoustID.NET
        public void Consume(FFTFrame frame)
        {
            // TODO: do we really need to create a new instance here
            m_features = new double[NUM_BANDS];

            // Yes, we do. See ChromaFilter: m_buffer[i][] would reference
            // the same array for all i.

            //for (int i = 0; i < m_features.Length; i++)
            //{
            //    m_features[i] = 0.0;
            //}

            for (int i = m_min_index; i < m_max_index; i++)
            {
                int    note   = m_notes[i];
                double energy = frame.Energy(i);
                if (m_interpolate)
                {
                    int    note2 = note;
                    double a     = 1.0;
                    if (m_notes_frac[i] < 0.5)
                    {
                        note2 = (note + NUM_BANDS - 1) % NUM_BANDS;
                        a     = 0.5 + m_notes_frac[i];
                    }
                    if (m_notes_frac[i] > 0.5)
                    {
                        note2 = (note + 1) % NUM_BANDS;
                        a     = 1.5 - m_notes_frac[i];
                    }
                    m_features[note]  += energy * a;
                    m_features[note2] += energy * (1.0 - a);
                }
                else
                {
                    m_features[note] += energy;
                }
            }
            m_consumer.Consume(m_features);
        }
コード例 #6
0
ファイル: Chroma.cs プロジェクト: gaborp/AcoustID.NET
        public void Consume(FFTFrame frame)
        {
            // TODO: do we really need to create a new instance here
            m_features = new double[NUM_BANDS];

            // Yes, we do. See ChromaFilter: m_buffer[i][] would reference
            // the same array for all i.

            //for (int i = 0; i < m_features.Length; i++)
            //{
            //    m_features[i] = 0.0;
            //}

            for (int i = m_min_index; i < m_max_index; i++)
            {
                int note = m_notes[i];
                double energy = frame.Energy(i);
                if (m_interpolate)
                {
                    int note2 = note;
                    double a = 1.0;
                    if (m_notes_frac[i] < 0.5)
                    {
                        note2 = (note + NUM_BANDS - 1) % NUM_BANDS;
                        a = 0.5 + m_notes_frac[i];
                    }
                    if (m_notes_frac[i] > 0.5)
                    {
                        note2 = (note + 1) % NUM_BANDS;
                        a = 1.5 - m_notes_frac[i];
                    }
                    m_features[note] += energy * a;
                    m_features[note2] += energy * (1.0 - a);
                }
                else
                {
                    m_features[note] += energy;
                }
            }
            m_consumer.Consume(m_features);
        }
コード例 #7
0
        public FFT(int frame_size, int overlap, IFFTFrameConsumer consumer, IFFTService fftService)
        {
            m_window        = new double[frame_size];
            m_buffer_offset = 0;
            m_buffer        = new short[frame_size];
            m_frame         = new FFTFrame(frame_size);
            m_frame_size    = frame_size;
            m_increment     = frame_size - overlap;
            m_consumer      = consumer;

            Helper.PrepareHammingWindow(ref m_window, 0, frame_size);
            for (int i = 0; i < frame_size; i++)
            {
                m_window[i] /= short.MaxValue;
            }

            m_lib = fftService;
            m_lib.Initialize(frame_size, m_window);

            m_input = new short[frame_size];
        }
コード例 #8
0
ファイル: FFT.cs プロジェクト: gaborp/AcoustID.NET
        public FFT(int frame_size, int overlap, IFFTFrameConsumer consumer, IFFTService fftService)
        {
            m_window = new double[frame_size];
            m_buffer_offset = 0;
            m_buffer = new short[frame_size];
            m_frame = new FFTFrame(frame_size);
            m_frame_size = frame_size;
            m_increment = frame_size - overlap;
            m_consumer = consumer;

            Helper.PrepareHammingWindow(ref m_window, 0, frame_size);
            for (int i = 0; i < frame_size; i++)
            {
                m_window[i] /= short.MaxValue;
            }

            m_lib = fftService;
            m_lib.Initialize(frame_size, m_window);

            m_input = new short[frame_size];
        }
コード例 #9
0
 public void Consume(FFTFrame frame)
 {
     for (int i = 0; i < NumBands(); i++)
     {
         int    first       = FirstIndex(i);
         int    last        = LastIndex(i);
         double numerator   = 0.0;
         double denominator = 0.0;
         for (int j = first; j < last; j++)
         {
             double s = frame.Energy(j);
             numerator   += j * s;
             denominator += s;
         }
         double centroid = numerator / denominator;
         if (Double.IsNaN(centroid))
         {
             centroid = (first + last) / 2.0; // handle NaN
         }
         m_features[i] = (centroid - first) / (last - first);
     }
     m_consumer.Consume(m_features);
 }
コード例 #10
0
 public void Consume(FFTFrame frame)
 {
     for (int i = 0; i < NumBands(); i++)
     {
         int first = FirstIndex(i);
         int last = LastIndex(i);
         double numerator = 0.0;
         double denominator = 0.0;
         for (int j = first; j < last; j++)
         {
             double s = frame.Energy(j);
             numerator += j * s;
             denominator += s;
         }
         double centroid = numerator / denominator;
         if (Double.IsNaN(centroid))
         {
             centroid = (first + last) / 2.0; // handle NaN
         }
         m_features[i] = (centroid - first) / (last - first);
     }
     m_consumer.Consume(m_features);
 }