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