示例#1
0
        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;
            }
        }
示例#2
0
        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];
            }
        }