public static void LinearSmoothing(double[] input, double width, int fs, int fftSize, double[] output) { var boundary = (int)(width * fftSize / fs) + 1; // These parameters are set by the other function. var mirroringSpectrum = new double[fftSize / 2 + boundary * 2 + 1]; var mirroringSegment = new double[fftSize / 2 + boundary * 2 + 1]; var frequencyAxis = new double[fftSize / 2 + 1]; SetParametersForLinearSmoothing(boundary, fftSize, fs, width, input, mirroringSpectrum, mirroringSegment, frequencyAxis); var lowLevels = new double[fftSize / 2 + 1]; var highLevels = new double[fftSize / 2 + 1]; var originOfMirroringAxis = -(boundary - 0.5) * fs / fftSize; var discreteFrequencyInterval = (double)fs / fftSize; MatlabFunctions.Interp1Q(originOfMirroringAxis, discreteFrequencyInterval, mirroringSegment.SubSequence(0, fftSize / 2 + boundary * 2 + 1), frequencyAxis.SubSequence(0, fftSize / 2 + 1), lowLevels); for (int i = 0, limit = fftSize / 2; i <= limit; i++) { frequencyAxis[i] += width; } MatlabFunctions.Interp1Q(originOfMirroringAxis, discreteFrequencyInterval, mirroringSegment.SubSequence(0, fftSize / 2 + boundary * 2 + 1), frequencyAxis.SubSequence(0, fftSize / 2 + 1), highLevels); for (int i = 0, limit = fftSize / 2; i <= limit; i++) { output[i] = (highLevels[i] - lowLevels[i]) / width; } }
public static void DCCorrection(double[] input, double f0, int fs, int fftSize, double[] output) { var upperLimit = 2 + (int)(f0 * fftSize / fs); var lowFrequencyReplica = new double[upperLimit]; var lowFrequencyAxis = Enumerable.Range(0, upperLimit).Select((i) => (double)i * fs / fftSize).ToArray(); var upperLimitReplica = upperLimit - 1; MatlabFunctions.Interp1Q(f0 - lowFrequencyAxis[0], -(double)fs / fftSize, input.SubSequence(0, upperLimit + 1), lowFrequencyAxis.SubSequence(0, upperLimitReplica), lowFrequencyReplica); for (var i = 0; i < upperLimitReplica; i++) { output[i] = input[i] + lowFrequencyReplica[i]; } }