示例#1
0
        void hammingWindowToolStripMenuItemClick(object sender, EventArgs e)
        {
            window = RaisedCosineWindow.Hamming(2048);

            reset();
            hammingWindowToolStripMenuItem.Checked = true;
        }
示例#2
0
        public MfccAccord(int sampleRate, int sampleCount, double lowerHz, double upperHz, int filterCount)
        {
            this.SampleRate  = sampleRate;
            this.SampleCount = sampleCount;
            this.LowerHz     = lowerHz;
            this.UpperHz     = upperHz;
            this.FilterCount = filterCount;

            // 事前に計算しておけるもの
            this._windowFunc    = RaisedCosineWindow.Hamming(sampleCount);
            this._melFilterbank = CreateMelFilterbank(sampleRate, sampleCount, lowerHz, upperHz, filterCount);
        }
示例#3
0
        public void ComplexSignalConstructor()
        {
            UnmanagedMemoryStream sourceStream      = Properties.Resources.Grand_Piano___Fazioli___major_A_middle;
            MemoryStream          destinationStream = new MemoryStream();

            // Create a decoder for the source stream
            WaveDecoder sourceDecoder = new WaveDecoder(sourceStream);

            // Decode the signal in the source stream
            Signal sourceSignal = sourceDecoder.Decode();

            int length = (int)Math.Pow(2, 12);

            RaisedCosineWindow window = RaisedCosineWindow.Hamming(length);

            Assert.AreEqual(length, window.Length);

            Signal[] windows = sourceSignal.Split(window, 1024);

            Assert.AreEqual(windows.Length, 172);

            foreach (var w in windows)
            {
                Assert.AreEqual(length, w.Length);
            }

            ComplexSignal[] complex = windows.Apply(ComplexSignal.FromSignal);

            for (int i = 0; i < complex.Length - 1; i++)
            {
                ComplexSignal c = complex[i];
                Assert.AreEqual(2, c.Channels);
                Assert.AreEqual(92, c.Duration);
                Assert.AreEqual(4096, c.Length);
                Assert.AreEqual(SampleFormat.Format128BitComplex, c.SampleFormat);
                Assert.AreEqual(44100, c.SampleRate);
                Assert.AreEqual(ComplexSignalStatus.Normal, c.Status);
            }

            complex.ForwardFourierTransform();

            for (int i = 0; i < complex.Length - 1; i++)
            {
                ComplexSignal c = complex[i];
                Assert.AreEqual(ComplexSignalStatus.FourierTransformed, c.Status);
            }
        }
示例#4
0
        public void ComplexSignalConstructor()
        {
            var          sourceStream      = SignalTest.GetSignal("a.wav");
            MemoryStream destinationStream = new MemoryStream();

            // Create a decoder for the source stream
            WaveDecoder sourceDecoder = new WaveDecoder(sourceStream);

            // Decode the signal in the source stream
            Signal sourceSignal = sourceDecoder.Decode();

            int length = (int)Math.Pow(2, 12);

            RaisedCosineWindow window = RaisedCosineWindow.Hamming(length);

            Assert.AreEqual(length, window.Length);

            Signal[] windows = sourceSignal.Split(window, 1024);

            Assert.AreEqual(windows.Length, 172);

            foreach (var w in windows)
            {
                Assert.AreEqual(length, w.Length);
            }

            ComplexSignal[] complex = windows.Apply(ComplexSignal.FromSignal);

            for (int i = 0; i < complex.Length - 1; i++)
            {
                ComplexSignal c = complex[i];
                Assert.AreEqual(2, c.Channels);
                Assert.AreEqual(93, c.Duration.TotalMilliseconds);
                Assert.AreEqual(4096, c.Length);
                Assert.AreEqual(SampleFormat.Format128BitComplex, c.SampleFormat);
                Assert.AreEqual(44100, c.SampleRate);
                Assert.AreEqual(ComplexSignalStatus.Normal, c.Status);
            }

            complex.ForwardFourierTransform();

            for (int i = 0; i < complex.Length - 1; i++)
            {
                ComplexSignal c = complex[i];
                Assert.AreEqual(ComplexSignalStatus.FourierTransformed, c.Status);
            }
        }
示例#5
0
        public void SetDirectoryPaths(string folderPath)
        {
            audioFileName = Directory.GetFiles(folderPath, "*.wav").Select(Path.GetFileName).OrderBy(r => r.Length).ToArray();

            for (int i = 0; i < audioFileName.Length; i++)
            {
                string      fileName = audioFileName[i];
                WaveDecoder sourceWD = new WaveDecoder(fileName);
                Signal      sourceS  = sourceWD.Decode();

                RaisedCosineWindow window  = RaisedCosineWindow.Hamming(1024);
                Signal[]           windows = sourceS.Split(window, 512);

                ComplexSignal[] complex = windows.Apply(ComplexSignal.FromSignal);

                complex.ForwardFourierTransform();
            }
        }
示例#6
0
        void Button1Click(object sender, EventArgs e)
        {
            AudioDeviceInfo info = comboBox1.SelectedItem as AudioDeviceInfo;

            if (info == null)
            {
                MessageBox.Show("No audio devices available.");
                return;
            }


            source = new AudioCaptureDevice(info.Guid);
            source.DesiredFrameSize  = 2048;
            source.SampleRate        = 22050;
            source.NewFrame         += source_NewFrame;
            source.AudioSourceError += source_AudioSourceError;

            window = RaisedCosineWindow.Hamming(source.DesiredFrameSize);

            source.Start();
        }
示例#7
0
        /// <summary>
        /// Initializes a new instance of the <see cref="MFCC" /> class.
        /// </summary>
        ///
        /// <param name="filterCount">The filter count.</param>
        /// <param name="cepstrumCount">The cepstrum count.</param>
        /// <param name="lowerFrequency">The lower frequency.</param>
        /// <param name="upperFrequency">The upper frequency.</param>
        /// <param name="alpha">The alpha.</param>
        /// <param name="samplingRate">The sampling rate.</param>
        /// <param name="frameRate">The frame rate.</param>
        /// <param name="windowLength">Length of the window.</param>
        /// <param name="numberOfBins">The number of bins.</param>
        ///
        public MelFrequencyCepstrumCoefficient(
            int filterCount       = 40,
            int cepstrumCount     = 13,
            double lowerFrequency = 133.3333,
            double upperFrequency = 6855.4976,
            double alpha          = 0.97,
            int samplingRate      = 16000,
            int frameRate         = 100,
            double windowLength   = 0.0256,
            int numberOfBins      = 512
            )
        {
            base.SupportedFormats.UnionWith(new[]
            {
                SampleFormat.Format32BitIeeeFloat
            });

            m_lowerf       = lowerFrequency;
            m_upperf       = upperFrequency;
            m_nfft         = numberOfBins;
            m_ncep         = cepstrumCount;
            m_nfilt        = filterCount;
            m_frate        = frameRate;
            m_fshift       = (float)samplingRate / frameRate;
            m_samplingRate = samplingRate;
            m_windowLength = windowLength;

            // Build Hamming window
            m_wlen = (int)(windowLength * samplingRate);
            m_win  = RaisedCosineWindow.Hamming(m_wlen);

            // Prior sample for pre-emphasis
            m_prior = 0;
            m_alpha = alpha;

            // Build mel filter matrix
            m_filters = new double[numberOfBins / 2 + 1, filterCount];

            float w_dfreq = (float)samplingRate / (float)numberOfBins;

            if (upperFrequency > samplingRate / 2)
            {
                throw new Exception("Upper frequency exceeds Nyquist");
            }

            double w_melmax = mel(upperFrequency);
            double w_melmin = mel(lowerFrequency);
            double w_dmelbw = (w_melmax - w_melmin) / (filterCount + 1);

            // Filter edges, in Hz
            double[] w_filt_edge = new double[filterCount + 2];
            for (double w_i = 0; w_i < filterCount + 2; w_i += 1.0)
            {
                w_filt_edge[(int)w_i] = w_melmin + w_dmelbw * w_i;
            }

            w_filt_edge = melinv(w_filt_edge);

            for (int w_whichfilt = 0; w_whichfilt < filterCount; w_whichfilt++)
            {
                // Filter triangles, in DFT points
                int w_leftfr   = (int)System.Math.Round(w_filt_edge[w_whichfilt] / w_dfreq);
                int w_centerfr = (int)System.Math.Round(w_filt_edge[w_whichfilt + 1] / w_dfreq);
                int w_rightfr  = (int)System.Math.Round(w_filt_edge[w_whichfilt + 2] / w_dfreq);

                // For some reason this is calculated in Hz, though I think it doesn't really matter
                double w_fwidth = (w_rightfr - w_leftfr) * w_dfreq;
                double w_height = 2.0 / w_fwidth;

                double w_leftslope = 0;
                if (w_centerfr != w_leftfr)
                {
                    w_leftslope = w_height / (w_centerfr - w_leftfr);
                }

                int w_freq = w_leftfr + 1;
                while (w_freq < w_centerfr)
                {
                    m_filters[w_freq, w_whichfilt] = (w_freq - w_leftfr) * w_leftslope;
                    w_freq = w_freq + 1;
                }

                if (w_freq == w_centerfr) // This is always true
                {
                    m_filters[w_freq, w_whichfilt] = w_height;
                    w_freq = w_freq + 1;
                }
                double w_rightslope = 0;
                if (w_centerfr != w_rightfr)
                {
                    w_rightslope = w_height / (w_centerfr - w_rightfr);
                }

                while (w_freq < w_rightfr)
                {
                    m_filters[w_freq, w_whichfilt] = (w_freq - w_rightfr) * w_rightslope;
                    w_freq = w_freq + 1;
                }
            }
            // Build DCT matrix
            m_s2dct = s2dctmat(filterCount, cepstrumCount, 1.0 / filterCount);
            m_dst   = dctmat(filterCount, cepstrumCount, System.Math.PI / filterCount);
        }