private void button2_Click(object sender, EventArgs e) { bool normalized = false; Crossover crossover = Crossover.createThreeWayCrossover(Int32.Parse(txtLowerFreq.Text), Int32.Parse(txtUpperFreq.Text), Int32.Parse(txtLowerTrans.Text), Int32.Parse(txtUpperTrans.Text), 44100, normalized, false, 10.0); RawFileReader rdr = new RawFileReader(lblFileName.Text, 16, 44100, 2); ConvertBitsPerSample bps = new ConvertBitsPerSample(rdr, 24); CrossoverThreeWayFilter filter = new CrossoverThreeWayFilter(bps, crossover); measureErrorDB(filter, crossover.wooferFilterKernel.Length); }
/// <summary> /// An attempt at a quick method to display the distortion introduced by running /// the input file through the digital crossover. Prints results in the debug /// console. Ideally we want any numerical errors to be less than 120dB, a /// level that will be inaudible. /// </summary> private void measureErrorDB(CrossoverThreeWayFilter filter, int kernelLength) { double[] filterData = new double[1024 * 10 * 6]; double[] fileData = new double[1024 * 10 * 2]; double[] filterSum = new double[1024 * 10 * 2]; Dictionary <Int32, Int32> dict = new Dictionary <Int32, Int32>(); RawFileReader rdr2 = new RawFileReader(lblFileName.Text, 16, 44100, 2); ConvertBitsPerSample bps2 = new ConvertBitsPerSample(rdr2, 24); filter.read(filterData, 0, (kernelLength / 2) * 6); while (true) { int nReadFilter = filter.read(filterData, 0, filterData.Length); if (nReadFilter == 0) { break; } int nReadFile = bps2.read(fileData, 0, fileData.Length); if (nReadFile * 3 != nReadFilter) { break; } //throw new Exception("" + (nReadFile * 3) + "!=" + nReadFilter); for (int i = 0; i < nReadFilter; i += 6) { filterSum[i / 3] = filterData[i] + filterData[i + 2] + filterData[i + 4]; filterSum[i / 3 + 1] = filterData[i + 1] + filterData[i + 3] + filterData[i + 5]; } for (int i = 0; i < fileData.Length; i++) { int error = (int)Math.Round(Math.Log10(Math.Abs(filterSum[i] - fileData[i]) / fileData[i]) * 20.0); if (dict.ContainsKey(error)) { dict[error]++; } else { dict.Add(error, 1); } } } Console.Out.WriteLine("Max noise: " + dict.Keys.Max() + " dB"); List <Int32> keys = new List <int>(dict.Keys); keys.Sort(); foreach (int k in keys) { Console.Out.WriteLine("" + k + " dB: " + dict[k]); } }
private void btnPlay_Click(object sender, EventArgs e) { IAudioFilter waveRdr; // For the purposes of testing we process .raw files as // containing 16-bit stereo PCM data at 44.1KHz. This is much // like a .wav file but without the header. if (lblFileName.Text.EndsWith(".raw")) { waveRdr = new RawFileReader(lblFileName.Text, 16, 44100, 2); } else { IWaveSource inputFile = CodecFactory.Instance.GetCodec(lblFileName.Text); waveRdr = new WaveSourceReader(inputFile); } // Convert to 24 bit samples (if needed) ConvertBitsPerSample bpsConvert = new ConvertBitsPerSample(waveRdr, 24); // Create a crossover and catch any errors in case the frequency parameters // are not valid Crossover crossover; try { crossover = Crossover.createThreeWayCrossover(Int32.Parse(txtLowerFreq.Text), Int32.Parse(txtUpperFreq.Text), Int32.Parse(txtLowerTrans.Text), Int32.Parse(txtUpperTrans.Text), waveRdr.SampleRate, true, false, 10.0); } catch (Exception ex) { MessageBox.Show(this, "Error building crossover: " + ex.Message); return; } // Start creating filters... CrossoverThreeWayFilter filter = new CrossoverThreeWayFilter(bpsConvert, crossover); sampleTap = new SampleTap(filter, SAMPLE_LEN); int crossoverIdx = 1; if (rdoPlayWoofer.Checked) { crossoverIdx = 0; } else if (rdoPlayMidrange.Checked) { crossoverIdx = 1; } else if (rdoPlayTweeter.Checked) { crossoverIdx = 2; } channelSelectFilter = new SelectCrossover(sampleTap, crossoverIdx); volumeControlFilter = new VolumeControl(channelSelectFilter); // Only needed for playback through Windows lastFilterStep = new ConvertBitsPerSample(volumeControlFilter, 16); // Done creating filters... tbarFilePosition.Value = 0; // Max in seconds tbarFilePosition.Maximum = (int)(lastFilterStep.Length / lastFilterStep.SampleRate / lastFilterStep.NumberOfChannels); tbarFilePosition.Enabled = true; // Playback through Windows IWaveSource finalWaveSource = new FilterToWaveSource(lastFilterStep); //_soundOut = new WasapiOut(); soundOutDevice = new WaveOut(); soundOutDevice.Initialize(finalWaveSource); soundOutDevice.Play(); tmrUpdateViz.Start(); }