Пример #1
0
        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);
        }
Пример #2
0
        /// <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]);
            }
        }
Пример #3
0
        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();
        }