Exemple #1
0
 public override void Init()
 {
     base.Init();
     writeIndex = 0;
     Buffering = 0;
     waveInDispose();
     waveIn = new WaveIn()
     {
         DeviceNumber = master.form.SoundList.SelectedIndex,
     };
     waveIn.DataAvailable += WaveIn_DataAvailable;
     waveIn.BufferMilliseconds = 14;
     waveIn.WaveFormat = new WaveFormat(rate, 16, 2);
     waveIn.StartRecording();
     Buffer_Low = CreateFilterBuffer();
     Buffer_Mid = CreateFilterBuffer();
     Buffer_High = CreateFilterBuffer();
     Param_Low = CreateFilterParam(FilterType.LowPass, 800, 3f);
     Param_Mid = CreateFilterParam(FilterType.BandPass, 2000, 0.1f);
     Param_High = CreateFilterParam(FilterType.HighPass, 8000, 2f);
 }
Exemple #2
0
        private void ExportLoop(ExportData data)
        {
            using (FileStream fs = new FileStream(this.textBox_saveto.Text, FileMode.Create))
            using (WaveFormatWriter wfw = new WaveFormatWriter(fs, data.SamplingRate, data.Bit * 8, 2))
            {
                const int bufferSize = 512;
                const int filterSize = 4096;

                float[] buffer = new float[bufferSize];
                double[] buffer_double = new double[filterSize];
                double[] bufferOut = new double[filterSize];

                SoundFilter filter = new SoundFilter(true, filterSize);
                var filterGenerator = new LowPassFilter()
                {
                    SamplingRate = data.SamplingRate * data.Oversampling,
                    CutoffFrequency = data.SamplingRate / 2 - ImpulseResponse.GetDelta(data.SamplingRate * data.Oversampling, filterSize)
                };
                double[] impulse = filterGenerator.Generate(filterSize / 2);

                Window.Hanning(impulse);
                filter.SetFilter(impulse);

                double bufferTime = (buffer.Length / 2.0) / (data.SamplingRate * data.Oversampling);

                var filterBuffer = new FilterBuffer<float>(filterSize, da =>
                {
                    if (data.Oversampling > 1)
                    {
                        for (int i = 0; i < filterSize; i++)
                            bufferOut[i] = da[i];

                        filter.Filtering(bufferOut);

                        for (int i = 0, j = 0; i < filterSize; i += data.Oversampling * 2)
                        {
                            buffer_double[j++] = bufferOut[i];
                            buffer_double[j++] = bufferOut[i + 1];
                        }

                        wfw.Write(buffer_double, 0, (int)Math.Min(filterSize / data.Oversampling, data.FileSize - data.Output));
                    }
                    else
                        wfw.Write(da, 0, filterSize);

                    data.Output = wfw.WrittenBytes;
                });

                while (!this.reqEnd && data.FileSize > data.Output)
                {
                    data.Connector.Sequencer.Progress(bufferTime);
                    data.Connector.Master.Read(buffer, 0, bufferSize);

                    filterBuffer.Push(buffer);

                    if (data.SequenceEnded && data.Connector.Master.ToneCount == 0)
                        this.reqEnd = true;
                }

                filterBuffer.Close();

                this.reqEnd = true;
                this.Invoke(new Action(() => button_stop_Click(null, null)));
            }
        }
Exemple #3
0
 private float BiquadFilter(FilterParam param, ref FilterBuffer buffer, float input)
 {
     float result = (param.b[0] / param.a[0]) * input
                     + (param.b[1] / param.a[0]) * buffer.input[0]
                     + (param.b[2] / param.a[0]) * buffer.input[1]
                     - (param.a[1] / param.a[0]) * buffer.output[0]
                     - (param.a[2] / param.a[0]) * buffer.output[1];
     if (float.IsNaN(result))
     {
         result = 0;
     }
     if(float.IsInfinity(result))
     {
         result = 0;
     }
     buffer.input[1] = buffer.input[0];
     buffer.input[0] = input;
     buffer.output[1] = buffer.output[0];
     buffer.output[0] = result;
     return result;
 }