private void autoToolStripMenuItem_Click(object sender, EventArgs e) { if (_signal == null) { return; } _filteredSignal = _filter.ApplyTo(_signal); signalAfterFilteringPanel.Signal = _filteredSignal; spectrogramAfterFilteringPanel.Spectrogram = _stft.Spectrogram(_filteredSignal); }
/// <summary> /// Method implements tube distortion effect /// </summary> /// <param name="signal"></param> /// <param name="filteringOptions"></param> /// <returns></returns> public DiscreteSignal ApplyTo(DiscreteSignal signal, FilteringOptions filteringOptions = FilteringOptions.Auto) { var maxAmp = signal.Samples.Max(s => Math.Abs(s)); if (Math.Abs(maxAmp) < 1e-10) { return(signal.Copy()); } IEnumerable <float> tempZ; if (Math.Abs(Q) < 1e-10) { tempZ = signal.Samples.Select(s => { var q = Gain * s / maxAmp; return(Math.Abs(q - Q) < 1e-10 ? 1.0f / Dist : (float)(q / (1 - Math.Exp(-Dist * q)))); }); } else { tempZ = signal.Samples.Select(s => { var q = Gain * s / maxAmp; return(Math.Abs(q - Q) < 1e-10 ? (float)(1.0 / Dist + Q / (1 - Math.Exp(Dist * Q))) : (float)((q - Q) / (1 - Math.Exp(-Dist * (q - Q))) + Q / (1 - Math.Exp(Dist * Q)))); }); } var maxZ = tempZ.Max(z => Math.Abs(z)); var tempY = tempZ.Zip(signal.Samples, (z, x) => Mix * z * maxAmp / maxZ + (1 - Mix) * x); var maxY = tempY.Max(y => Math.Abs(y)); var output = tempY.Select(y => y * maxAmp / maxY); return(_outputFilter.ApplyTo(new DiscreteSignal(signal.SamplingRate, output))); }