Beispiel #1
0
        public static void Example2() //================[ Basic DFT + Windowing Example ]================
        {
            // Same Input Signal as Example 1
            double amplitude = 1.0; double frequency = 20000;
            UInt32 length       = 1000;
            double samplingRate = 100000;

            double[] inputSignal = DSP.Generate.ToneSampling(amplitude, frequency, samplingRate, length);

            // Apply window to the Input Data & calculate Scale Factor
            double[] wCoefs       = DSP.Window.Coefficients(DSP.Window.Type.Hamming, length);
            double[] wInputData   = DSP.Math.Multiply(inputSignal, wCoefs);
            double   wScaleFactor = DSP.Window.ScaleFactor.Signal(wCoefs);

            // Instantiate & Initialize a new DFT
            DSPLib.DFT dft = new DSPLib.DFT();
            dft.Inicializar(length);

            // Call the DFT and get the scaled spectrum back
            Complex[] cSpectrum = dft.Executar(wInputData);

            // Convert the complex spectrum to note: Magnitude Format
            double[] lmSpectrum = DSP.ConvertComplex.ToMagnitude(cSpectrum);

            // Properly scale the spectrum for the added window
            lmSpectrum = DSP.Math.Multiply(lmSpectrum, wScaleFactor);

            // For plotting on an XY Scatter plot generate the X Axis frequency Span
            double[] freqSpan = dft.FrequencySpan(samplingRate);

            // At this point a XY Scatter plot can be generated from,
            // X axis => freqSpan
            // Y axis => lmSpectrum
        }
Beispiel #2
0
        public static void Example9() //================[ Basic DFT Phase Test ]================
        {
            // Generate a Phase Ramp between two signals
            double[] resultPhase = new double[360];

            // Instantiate & Initialize a new DFT
            DSPLib.DFT dft = new DSPLib.DFT();
            dft.Inicializar(2048);

            for (Int32 phase = 0; phase < 360; phase++)
            {
                double[] inputSignalRef   = DSP.Generate.ToneCycles(7.0, 128, 2048);
                double[] inputSignalPhase = DSP.Generate.ToneCycles(7.0, 128, 2048, phaseDeg: phase);

                // Call the DFT and get the scaled spectrum back of a reference and a phase shifted signal.
                Complex[] cSpectrumRef   = dft.Executar(inputSignalRef);
                Complex[] cSpectrumPhase = dft.Executar(inputSignalPhase);

                // Magnitude Format - Just as a test point
                //double[] lmSpectrumTest = DSPLib.DSP.ConvertComplex.ToMagnitude(cSpectrumRef);
                //double[] lmSpectrumTestPhase = DSPLib.DSP.ConvertComplex.ToMagnitude(cSpectrumPhase);

                // Extract the phase of bin 128
                double[] resultArrayRef   = DSP.ConvertComplex.ToPhaseDegrees(cSpectrumRef);
                double[] resultArrayPhase = DSP.ConvertComplex.ToPhaseDegrees(cSpectrumPhase);
                resultPhase[phase] = resultArrayPhase[128] - resultArrayRef[128];
            }

            // resultPhase has a linear phase incrementing signal at this point.
            // Use UnwrapPhase() to remove phase jumps in output data.
        }
Beispiel #3
0
        public static void Example6() //================[ Basic DFT + Noise Analysis Example ]================
        {
            // Setup parameters to generate noise test signal of 5 nVrms / rt-Hz
            double amplitude = 5.0e-9;
            UInt32 length = 1000; double samplingRate = 2000;


            // Generate window & calculate Scale Factor for NOISE!
            double[] wCoefs = DSP.Window.Coefficients(DSP.Window.Type.Hamming, length);

            double wScaleFactor = DSP.Window.ScaleFactor.Noise(wCoefs, samplingRate);

            // Instantiate & Initialize a new DFT
            DSPLib.DFT dft = new DSPLib.DFT();
            dft.Inicializar(length);

            // Average the noise 'N' times
            Int32 N = 1000;

            double[] noiseSum = new double[(length / 2) + 1];
            for (Int32 i = 0; i < N; i++)
            {
                // Generate the noise signal & apply window
                double[] inputSignal = DSP.Generate.NoisePsd(amplitude, samplingRate, length);
                inputSignal = DSP.Math.Multiply(inputSignal, wCoefs);

                // DFT the noise -> Convert -> Sum
                Complex[] cSpectrum = dft.Executar(inputSignal);
                double[]  mag2      = DSP.ConvertComplex.ToMagnitudeSquared(cSpectrum);

                if (N == 0)
                {
                    noiseSum = DSP.Math.Add(noiseSum, 0);
                }
                else
                {
                    noiseSum = DSP.Math.Add(noiseSum, mag2);
                }
            }

            // Calculate Average, convert to magnitude format
            // See text for the reasons to use Mag^2 format.
            double[] averageNoise = DSP.Math.Divide(noiseSum, N);
            double[] lmSpectrum   = DSP.ConvertMagnitudeSquared.ToMagnitude(averageNoise);

            // Properly scale the spectrum for the added window
            lmSpectrum = DSP.Math.Multiply(lmSpectrum, wScaleFactor);

            // For plotting on an XY Scatter plot generate the X Axis frequency Span
            double[] freqSpan = dft.FrequencySpan(samplingRate);

            // At this point a XY Scatter plot can be generated from,
            // X axis => freqSpan
            // Y axis => lmSpectrum as a Power Spectral Density Value

            // Extra Credit - Analyze Plot Data Ignoring the first and last 20 Bins
            // Average value should be what we generated = 5.0e-9 Vrms / rt-Hz
            double averageValue = DSP.Analyze.FindMean(lmSpectrum, 20, 20);
        }
Beispiel #4
0
        public static void Example8() //================[ Basic DFT + Signal & Noise + Log Magnitude ]================
        {
            // Same Input Signal as Example 1, except amplitude is 5 Vrms.
            double amplitude = 5.0; double frequency = 20000;
            UInt32 length = 1000; double samplingRate = 100000;

            double[] inputSignal = DSP.Generate.ToneSampling(amplitude, frequency, samplingRate, length);

            // Add noise that is about 80 dBc from signal level
            // 80 dBc is about the level of noise from a 14 bit ADC
            // 1/10,000 down from full scale
            double[] inputNoise = DSP.Generate.NoiseRms(amplitude / 10000.0, length);

            // Add noise to the signal
            double[] compositeInput = DSP.Math.Add(inputSignal, inputNoise);

            // Use the BH92 type window - this is a very "Spectrum Analyzer" like window.
            // Apply window to the Input Data & calculate Scale Factor
            double[] wCoefs       = DSP.Window.Coefficients(DSP.Window.Type.BH92, length);
            double   wScaleFactor = DSP.Window.ScaleFactor.Signal(wCoefs);

            double[] wInputData = DSP.Math.Multiply(compositeInput, wCoefs);

            // Instantiate & Initialize a new DFT
            DSPLib.DFT dft = new DSPLib.DFT();
            dft.Inicializar(length);

            // Call the DFT and get the scaled spectrum back
            Complex[] cSpectrum = dft.Executar(wInputData);

            // Convert the complex spectrum to note: Magnitude Format
            double[] lmSpectrum = DSP.ConvertComplex.ToMagnitude(cSpectrum);

            // Properly scale the spectrum for the added window
            lmSpectrum = DSP.Math.Multiply(lmSpectrum, wScaleFactor);

            // Convert from linear magnitude to log magnitude format
            double[] logMagSpectrum = DSP.ConvertMagnitude.ToMagnitudeDBV(lmSpectrum);

            // For plotting on an XY Scatter plot generate the X Axis frequency Span
            double[] freqSpan = dft.FrequencySpan(samplingRate);

            // At this point a XY Scatter plot can be generated from,
            // X axis => freqSpan
            // Y axis => logMagSpectrum

            // In this example - maximum amplitude of 13.974 dBV is at bin 200 (20,000 Hz)
        }