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); }
//////////////////////////////////////////////////////// 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); }
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); }
//////////////////////////////////////////////////////// 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; }
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"); }
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"); }
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; }