Ejemplo n.º 1
0
        private SignalGeneratorResult GenerateSineWave(PcmSamples1Channel ch, int sampleRate, double freq, int amplitude)
        {
            Console.WriteLine("CreateSineWave sampleRate={0} freq={1} amp={2}", sampleRate, freq, amplitude);

            SignalGeneratorResult result = SignalGeneratorResult.Success;

            double step = 2.0 * Math.PI * (freq / sampleRate);

            Parallel.For(0, ch.NumSamples, delegate(int i) {
                int v    = (int)(amplitude * Math.Sin(step * i));
                short sv = (short)v;
                if (v < -32768)
                {
                    result = SignalGeneratorResult.LevelOver;
                    sv     = -32768;
                }
                if (32767 < v)
                {
                    result = SignalGeneratorResult.LevelOver;
                    sv     = 32767;
                }
                ch.Set16(i, sv);
            });
            return(result);
        }
Ejemplo n.º 2
0
        ////////////////////////////////////////////////////////

        public SignalGeneratorResult GenerateSignal(SignalGenerateParams s, out WavData wavData)
        {
            List <PcmSamples1Channel> samples = new List <PcmSamples1Channel>();

            int nSample           = s.seconds * s.sampleRate;
            PcmSamples1Channel ch = new PcmSamples1Channel(nSample, s.bitsPerSample);

            samples.Add(ch);

            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
            sw.Start();

            SignalGeneratorResult result = SignalGeneratorResult.Success;
            double truncFreq             = (s.sampleRate / 2) * s.truncationRatio;

            switch (s.ss)
            {
            case SignalShape.SineWave:
                result = GenerateSineWave(ch, s.sampleRate, s.freq, s.amplitude);
                break;

            case SignalShape.SquareWave:
                result = GenerateSquareWave(ch, s.sampleRate, s.freq, s.amplitude, truncFreq);
                break;

            case SignalShape.SawToothWaveDesc:
                result = GenerateSawToothWave(ch, s.sampleRate, s.freq, s.amplitude, truncFreq, false);
                break;

            case SignalShape.SawToothWaveAsc:
                result = GenerateSawToothWave(ch, s.sampleRate, s.freq, s.amplitude, truncFreq, true);
                break;

            case SignalShape.TriangleWave:
                result = GenerateTriangleWave(ch, s.sampleRate, s.freq, s.amplitude, truncFreq);
                break;

            default:
                System.Diagnostics.Debug.Assert(false);
                break;
            }

            sw.Stop();
            Console.WriteLine("{0} ms", sw.ElapsedMilliseconds);


            wavData = new WavData();
            wavData.Create(s.sampleRate, s.bitsPerSample, samples);
            return(result);
        }
Ejemplo n.º 3
0
        private SignalGeneratorResult GenerateSawToothWave(PcmSamples1Channel ch, int sampleRate, double freq, int amplitude, double truncFreq, bool bInvert)
        {
            Console.WriteLine("CreateSawToothWave sampleRate={0} freq={1} amp={2} trunc={3} invert={4}", sampleRate, freq, amplitude, truncFreq, bInvert);

            double ampWithPhase = amplitude;

            if (bInvert)
            {
                ampWithPhase = -amplitude;
            }

            SignalGeneratorResult result = SignalGeneratorResult.Success;
            double step = 2.0 * Math.PI * (freq / sampleRate);

            Parallel.For(0, ch.NumSamples, delegate(int i) {
                double v = 0.0;
                for (int h = 1; ; ++h)
                {
                    double harmonics = h;
                    if (amplitude / harmonics < 1.0)
                    {
                        break;
                    }
                    if (truncFreq <= harmonics * freq)
                    {
                        break;
                    }
                    double x = ampWithPhase / harmonics * Math.Sin((step * i * harmonics) % (2.0 * Math.PI));
                    v       += x;
                }

                short sv = (short)v;
                if (v < -32768)
                {
                    result = SignalGeneratorResult.LevelOver;
                    sv     = -32768;
                }
                if (32767 < v)
                {
                    result = SignalGeneratorResult.LevelOver;
                    sv     = 32767;
                }
                ch.Set16(i, sv);
            });

            return(result);
        }
Ejemplo n.º 4
0
        private SignalGeneratorResult GenerateTriangleWave(PcmSamples1Channel ch, int sampleRate, double freq, double amplitude, double truncFreq)
        {
            Console.WriteLine("CreateTriangleWave sampleRate={0} freq={1} amp={2} trunc={3}", sampleRate, freq, amplitude, truncFreq);

            SignalGeneratorResult result = SignalGeneratorResult.Success;
            double step = 2.0 * Math.PI * (freq / sampleRate);

            Parallel.For(0, ch.NumSamples, delegate(int i) {
                double v = 0.0;
                for (int h = 1; ; ++h)
                {
                    double harmonics = 2 * h - 1;
                    if (amplitude / harmonics / harmonics < 1.0)
                    {
                        break;
                    }
                    if (truncFreq <= harmonics * freq)
                    {
                        break;
                    }
                    double x = amplitude / harmonics / harmonics * Math.Sin((step * i * harmonics) % (2.0 * Math.PI));
                    if ((h & 1) == 0)
                    {
                        // hが偶数のときは-1倍する
                        x = -x;
                    }
                    v += x;
                }

                short sv = (short)v;
                if (v < -32768)
                {
                    result = SignalGeneratorResult.LevelOver;
                    sv     = -32768;
                }
                if (32767 < v)
                {
                    result = SignalGeneratorResult.LevelOver;
                    sv     = 32767;
                }
                ch.Set16(i, sv);
            });

            return(result);
        }
        ////////////////////////////////////////////////////////
        public SignalGeneratorResult GenerateSignal(SignalGenerateParams s, out WavData wavData)
        {
            List<PcmSamples1Channel> samples = new List<PcmSamples1Channel>();

            int nSample = s.seconds * s.sampleRate;
            PcmSamples1Channel ch = new PcmSamples1Channel(nSample, s.bitsPerSample);
            samples.Add(ch);

            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
            sw.Start();

            SignalGeneratorResult result = SignalGeneratorResult.Success;
            double truncFreq = (s.sampleRate / 2) * s.truncationRatio;

            switch (s.ss) {
            case SignalShape.SineWave:
                result = GenerateSineWave(ch, s.sampleRate, s.freq, s.amplitude);
                break;
            case SignalShape.SquareWave:
                result = GenerateSquareWave(ch, s.sampleRate, s.freq, s.amplitude, truncFreq);
                break;
            case SignalShape.SawToothWaveDesc:
                result = GenerateSawToothWave(ch, s.sampleRate, s.freq, s.amplitude, truncFreq, false);
                break;
            case SignalShape.SawToothWaveAsc:
                result = GenerateSawToothWave(ch, s.sampleRate, s.freq, s.amplitude, truncFreq, true);
                break;
            case SignalShape.TriangleWave:
                result = GenerateTriangleWave(ch, s.sampleRate, s.freq, s.amplitude, truncFreq);
                break;
            default:
                System.Diagnostics.Debug.Assert(false);
                break;
            }

            sw.Stop();
            Console.WriteLine("{0} ms", sw.ElapsedMilliseconds);

            wavData = new WavData();
            wavData.Create(s.sampleRate, s.bitsPerSample, samples);
            return result;
        }
Ejemplo n.º 6
0
        private void DoWork(object o, DoWorkEventArgs args)
        {
            Console.WriteLine("DoWork started\n");

            int count = 0;
            while (!asio.Run()) {
                ++count;
                Console.WriteLine("\nForm1.DoWork() count={0} m_seconds={1}", count, m_seconds);
                int percent = 100 * count / m_seconds;
                if (100 < percent) {
                    percent = 100;
                }

            }
            int[] recordedData = asio.RecordedDataGet(m_inputChannelNum, m_seconds * SAMPLE_RATE);
            PcmSamples1Channel ch0 = new PcmSamples1Channel(m_seconds * SAMPLE_RATE, 16);
            int max = 0;
            int min = 0;
            for (int i = 0; i < recordedData.Length; ++i) {
                if (max < recordedData[i]) {
                    max = recordedData[i];
                }
                if (recordedData[i] < min) {
                    min = recordedData[i];
                }
            }
            Console.WriteLine("max={0} min={1}", max, min);

            if (max < -min) {
                max = -min;
            }
            double mag = 32767.0 / max;
            Console.WriteLine("mag={0}", mag);

            for (int i = 0; i < recordedData.Length; ++i) {
                ch0.Set16(i, (short)(recordedData[i] * mag));
            }

            List<PcmSamples1Channel> chList = new List<PcmSamples1Channel>();
            chList.Add(ch0);

            WavData wd = new WavData();
            wd.Create(SAMPLE_RATE, 16, chList);
            using (BinaryWriter bw = new BinaryWriter(File.Open(m_writeFilePath, FileMode.Create))) {
                wd.Write(bw);
            }

            args.Result = 0;
            Console.WriteLine("DoWork end\n");
        }
Ejemplo n.º 7
0
        private void DoWork(object o, DoWorkEventArgs args)
        {
            Console.WriteLine("DoWork started\n");

            int count = 0;

            while (!asio.Run())
            {
                ++count;
                Console.WriteLine("\nForm1.DoWork() count={0} m_seconds={1}", count, m_seconds);
                int percent = 100 * count / m_seconds;
                if (100 < percent)
                {
                    percent = 100;
                }
            }
            int[] recordedData     = asio.RecordedDataGet(m_inputChannelNum, m_seconds * SAMPLE_RATE);
            PcmSamples1Channel ch0 = new PcmSamples1Channel(m_seconds * SAMPLE_RATE, 16);
            int max = 0;
            int min = 0;

            for (int i = 0; i < recordedData.Length; ++i)
            {
                if (max < recordedData[i])
                {
                    max = recordedData[i];
                }
                if (recordedData[i] < min)
                {
                    min = recordedData[i];
                }
            }
            Console.WriteLine("max={0} min={1}", max, min);

            if (max < -min)
            {
                max = -min;
            }
            double mag = 32767.0 / max;

            Console.WriteLine("mag={0}", mag);

            for (int i = 0; i < recordedData.Length; ++i)
            {
                ch0.Set16(i, (short)(recordedData[i] * mag));
            }

            List <PcmSamples1Channel> chList = new List <PcmSamples1Channel>();

            chList.Add(ch0);

            WavData wd = new WavData();

            wd.Create(SAMPLE_RATE, 16, chList);
            using (BinaryWriter bw = new BinaryWriter(File.Open(m_writeFilePath, FileMode.Create))) {
                wd.Write(bw);
            }

            args.Result = 0;
            Console.WriteLine("DoWork end\n");
        }
Ejemplo n.º 8
0
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            int    sampleDelay;
            double w1w2VolumeRatio;

            if (!SampleDelay(wavRead1, wavRead2, out sampleDelay, out w1w2VolumeRatio))
            {
                e.Result     = false;
                resultString = rm.GetString("TwoWavFilesTooDifferent");
                return;
            }

            int numSamples = wavRead1.NumSamples - 2 * Math.Abs(sampleDelay);

            if (wavRead2.NumSamples < wavRead1.NumSamples)
            {
                numSamples = wavRead2.NumSamples - 2 * Math.Abs(sampleDelay);
            }

            List <PcmSamples1Channel> samples1 = new List <PcmSamples1Channel>();

            for (int i = 0; i < wavRead1.NumChannels; ++i)
            {
                PcmSamples1Channel ps = new PcmSamples1Channel(numSamples, wavRead1.BitsPerSample);
                samples1.Add(ps);
            }
            List <PcmSamples1Channel> samples2 = new List <PcmSamples1Channel>();

            for (int i = 0; i < wavRead2.NumChannels; ++i)
            {
                PcmSamples1Channel ps = new PcmSamples1Channel(numSamples, wavRead2.BitsPerSample);
                samples2.Add(ps);
            }

            long   acc          = 0;
            int    maxDiff      = 0;
            int    maxDiffPos   = 0;
            double maxDiffRatio = 0;

            if (0 <= sampleDelay)
            {
                for (int ch = 0; ch < wavRead1.NumChannels; ++ch)
                {
                    PcmSamples1Channel ps1 = samples1[ch];
                    PcmSamples1Channel ps2 = samples2[ch];
                    for (int sample = 0; sample < numSamples; ++sample)
                    {
                        int diff = (int)(wavRead1.Sample16Get(ch, sample)
                                         - wavRead2.Sample16Get(ch, sample + sampleDelay));

                        int absDiff = Math.Abs(diff);
                        acc += absDiff;
                        if (maxDiff < absDiff)
                        {
                            maxDiff      = absDiff;
                            maxDiffRatio = (double)wavRead1.Sample16Get(ch, sample) /
                                           wavRead2.Sample16Get(ch, sample + sampleDelay);
                            maxDiffPos = sample;
                        }

                        ps1.Set16(sample, wavRead1.Sample16Get(ch, sample));
                        ps2.Set16(sample, wavRead2.Sample16Get(ch, sample + sampleDelay));
                    }
                }
            }
            else
            {
                // sampleDelay < 0
                for (int ch = 0; ch < wavRead1.NumChannels; ++ch)
                {
                    PcmSamples1Channel ps1 = samples1[ch];
                    PcmSamples1Channel ps2 = samples2[ch];
                    for (int sample = 0; sample < numSamples; ++sample)
                    {
                        int diff = (int)(wavRead1.Sample16Get(ch, sample - sampleDelay)
                                         - wavRead2.Sample16Get(ch, sample));

                        int absDiff = Math.Abs(diff);
                        acc += absDiff;
                        if (maxDiff < absDiff)
                        {
                            maxDiff      = absDiff;
                            maxDiffRatio = (double)wavRead1.Sample16Get(ch, sample) /
                                           wavRead2.Sample16Get(ch, sample + sampleDelay);
                            maxDiffPos = sample;
                        }

                        ps1.Set16(sample, wavRead1.Sample16Get(ch, sample - sampleDelay));
                        ps2.Set16(sample, wavRead2.Sample16Get(ch, sample));
                    }
                }
            }

            if (0 == acc)
            {
                e.Result     = false;
                resultString = rm.GetString("TwoWavFilesAreExactlyTheSame");
                return;
            }

            if (0 < maxDiff)
            {
                int maxMagnitude = 32767 / maxDiff;
                resultString = string.Format(rm.GetString("DiffStatistics"),
                                             (double)acc / numSamples, maxDiff, maxDiffPos, (double)maxDiffPos / wavRead1.SampleRate, 20.0 * System.Math.Log10(maxDiffRatio));
                Console.WriteLine(resultString);
            }

            if (!SaveWav(wavRead1.SampleRate, wavRead1.BitsPerSample, samples1, ReadFilePathToWriteFilePath(textBoxWavFile1.Text)))
            {
                e.Result = false;
                return;
            }
            if (!SaveWav(wavRead2.SampleRate, wavRead2.BitsPerSample, samples2, ReadFilePathToWriteFilePath(textBoxWavFile2.Text)))
            {
                e.Result = false;
                return;
            }
            e.Result = true;
        }
        private SignalGeneratorResult GenerateSawToothWave(PcmSamples1Channel ch, int sampleRate, double freq, int amplitude, double truncFreq, bool bInvert)
        {
            Console.WriteLine("CreateSawToothWave sampleRate={0} freq={1} amp={2} trunc={3} invert={4}", sampleRate, freq, amplitude, truncFreq, bInvert);

            double ampWithPhase = amplitude;
            if (bInvert) {
                ampWithPhase = -amplitude;
            }

            SignalGeneratorResult result = SignalGeneratorResult.Success;
            double step = 2.0 * Math.PI * (freq / sampleRate);
            Parallel.For(0, ch.NumSamples, delegate(int i) {
                double v = 0.0;
                for (int h = 1; ; ++h) {
                    double harmonics = h;
                    if (amplitude / harmonics < 1.0) {
                        break;
                    }
                    if (truncFreq <= harmonics * freq) {
                        break;
                    }
                    double x = ampWithPhase / harmonics * Math.Sin((step * i * harmonics) % (2.0 * Math.PI));
                    v += x;
                }

                short sv = (short)v;
                if (v < -32768) {
                    result = SignalGeneratorResult.LevelOver;
                    sv = -32768;
                }
                if (32767 < v) {
                    result = SignalGeneratorResult.LevelOver;
                    sv = 32767;
                }
                ch.Set16(i, sv);
            });

            return result;
        }
        private SignalGeneratorResult GenerateTriangleWave(PcmSamples1Channel ch, int sampleRate, double freq, double amplitude, double truncFreq)
        {
            Console.WriteLine("CreateTriangleWave sampleRate={0} freq={1} amp={2} trunc={3}", sampleRate, freq, amplitude, truncFreq);

            SignalGeneratorResult result = SignalGeneratorResult.Success;
            double step = 2.0 * Math.PI * (freq / sampleRate);

            Parallel.For(0, ch.NumSamples, delegate(int i) {
                double v = 0.0;
                for (int h = 1; ; ++h) {
                    double harmonics = 2 * h - 1;
                    if (amplitude / harmonics / harmonics < 1.0) {
                        break;
                    }
                    if (truncFreq <= harmonics * freq) {
                        break;
                    }
                    double x = amplitude / harmonics / harmonics * Math.Sin((step * i * harmonics) % (2.0 * Math.PI));
                    if ((h & 1) == 0) {
                        // hが偶数のときは-1倍する
                        x = -x;
                    }
                    v += x;
                }

                short sv = (short)v;
                if (v < -32768) {
                    result = SignalGeneratorResult.LevelOver;
                    sv = -32768;
                }
                if (32767 < v) {
                    result = SignalGeneratorResult.LevelOver;
                    sv = 32767;
                }
                ch.Set16(i, sv);
            });

            return result;
        }
        private SignalGeneratorResult GenerateSineWave(PcmSamples1Channel ch, int sampleRate, double freq, int amplitude)
        {
            Console.WriteLine("CreateSineWave sampleRate={0} freq={1} amp={2}", sampleRate, freq, amplitude);

            SignalGeneratorResult result = SignalGeneratorResult.Success;

            double step = 2.0 * Math.PI * (freq / sampleRate);
            Parallel.For(0, ch.NumSamples, delegate(int i) {
                int v = (int)(amplitude * Math.Sin(step * i));
                short sv = (short)v;
                if (v < -32768) {
                    result = SignalGeneratorResult.LevelOver;
                    sv = -32768;
                }
                if (32767 < v) {
                    result = SignalGeneratorResult.LevelOver;
                    sv = 32767;
                }
                ch.Set16(i, sv);
            });
            return result;
        }