Пример #1
0
 //
 public static Func <ComplexDouble> Fa2c(HyperEquation h, Fabcz fa1c, ComplexDouble a, ComplexDouble c)
 {
     return(z => (
                h[2].Calc(a, 0d, c, z) +
                h[0].Calc(a, 0d, c, z) * fa1c(a + h[0].AbcShift.A, 0d, c + h[0].AbcShift.C, z)
                ) / -h[1].Calc(a, 1d, c, z));
 }
Пример #2
0
 public static double[] ComplexFilter(double iqRate, double vbw, int leadingFirstPointSamples, double bandwidth, double minSelectivity,
                                      ComplexDouble[] iqData)
 {
     double[] real, imaginary;
     ComplexDouble.DecomposeArray(iqData, out real, out imaginary);
     double[] filteredData = new double[iqData.Length];
     ComplexFilter(iqRate, vbw, leadingFirstPointSamples, bandwidth, minSelectivity, real, imaginary, filteredData, iqData.Length);
     return(filteredData);
 }
Пример #3
0
 public static ComplexDouble[] CarrierWave(int length)
 {
     ComplexDouble[] cw = new ComplexDouble[length];
     for (int i = 0; i < length; i++)
     {
         cw[i] = ComplexDouble.FromPolar(1, 0);
     }
     return(cw);
 }
Пример #4
0
        public static ComplexDouble[] normalizeIQ(ComplexDouble[] wfm)
        {
            // Calculate PAPR and Normalize IQ
            double vmax = ComplexDouble.GetMagnitudes(wfm.ToArray()).Max();

            return(ComplexDouble.ComposeArrayPolar(
                       ComplexDouble.GetMagnitudes(wfm.ToArray()).Select(v => v / vmax).ToArray(),
                       ComplexDouble.GetPhases(wfm.ToArray())));
        }
Пример #5
0
        public static Point[] Start(float[] waveform, int length)
        {
            double[] magnitudes;
            double[] phases;
            double[] dstfrom = new double[length];
            for (int i = 0; i < dstfrom.Length; i++)
            {
                dstfrom[i] = waveform[i];
            }
            //傅里叶变换
            ComplexDouble[] fftValue = Transforms.RealFft(dstfrom);
            //waveform data size
            int datasize = length;
            //number of samples for FFT data
            int fftnumofSamples = datasize / 2;

            // Get the magnitudes and phases of FFT array..
            ComplexDouble.DecomposeArrayPolar(fftValue, out magnitudes, out phases);
            double[] xwaveform = new double[fftnumofSamples];


            //            double deltaFreq = samplingRateNumericEdit.Value * scalingFactor;
            double scalingFactor = 1.0 / datasize;
            double deltaFreq     = 31250 * scalingFactor; //采样率是31250 采样间隔

            double[] subsetOfMagnitudes = new double[fftnumofSamples];
            subsetOfMagnitudes[0] = magnitudes[0] * scalingFactor;
            Point[]  resultPoints   = new Point[fftnumofSamples];
            double[] logMagnitudes  = new double[fftnumofSamples];
            double[] subsetOfPhases = new double[fftnumofSamples];
            for (int i = 1; i < fftnumofSamples; i++)
            {
                // Generating xwaveform with respect to which magnitude and phase will be plotted.
                xwaveform[i]          = deltaFreq * i;
                subsetOfMagnitudes[i] = magnitudes[i] * scalingFactor *Math.Sqrt(2.0); // Storing only half the magnitudes array.

                subsetOfPhases[i] = phases[i];                                         // Storing only half of the phases array.
            }
            for (int i = 0; i < fftnumofSamples; i++)
            {
                if (Math.Abs(magnitudes[i]) < double.Epsilon)
                {
                    logMagnitudes[i] = 0;
                }
                else
                {
                    logMagnitudes[i] = 20.0 * Math.Log10(magnitudes[i]);
                }
                resultPoints[i] = new Point(xwaveform[i], logMagnitudes[i]);
            }

            return(resultPoints);
        }
Пример #6
0
        /// <summary>
        /// Runs a complex FFT on the interleaved time domain IQ samples and return the FFT's magnitude in dBFS
        /// </summary>
        /// <param name="timeDataInterleavedIq">Signed 16bit array interleaved with I and Q data.  First sample is I, second sample Q.</param>
        /// <param name="sampleRate_MHz">The sampling frequency, used to scale the analysis data.</param>
        /// <param name="runAnalysis">If true, will return a FftAnalysis structure with information about the FFT</param>
        /// <param name="sampleBitWidth"> Bit width of the converter sample (example: 16bit sample)</param>
        /// <param name="analysisData">FftAnalysis struture that is returned when runAnalysis = true</param>
        /// <returns></returns>
        public static double[] complexfftAndScale(short[] timeDataInterleavedIq, double sampleRate_MHz, byte sampleBitWidth, bool runAnalysis, out FftAnalysis analysisData)
        {
            int numSamples = timeDataInterleavedIq.Length / 2;

            double[] fftReal;
            double[] fftImag;
            double[] fftMagnitude_dB = new double[numSamples];
            analysisData = new FftAnalysis();
            double AdcFullScaleCode = System.Math.Pow(2, (sampleBitWidth - 1)); //2^(16-1) for 16bit converter ...assumming two's complement

            //ScaledWindowType window = ScaledWindowType.Hanning;
            ScaledWindow window = ScaledWindow.CreateHanningWindow();


            ComplexDouble[] complexSignal = new ComplexDouble[numSamples];
            int             j             = 0;

            //determine scaling value to normalize the time domain data.
            ComplexDouble scaleValue = new ComplexDouble(AdcFullScaleCode * (numSamples) * Math.Sqrt(window.EquivalentNoiseBandwidth), 0);

            //deinterleave IQ data array into complex number data type and normalize data.
            for (int i = 0; i < complexSignal.Length; i++)
            {
                complexSignal[i] = new ComplexDouble(timeDataInterleavedIq[j], timeDataInterleavedIq[j + 1]);
                complexSignal[i] = complexSignal[i].Divide(scaleValue);
                j = j + 2;
            }

            //Apply the Window (Default hanning)
            window.Apply(complexSignal);

            ComplexDouble[] fftData = Transforms.Fft(complexSignal, true);
            NationalInstruments.ComplexDouble.DecomposeArray(fftData, out fftReal, out fftImag);

            if (runAnalysis == true)
            {
                analysisData = analyzeFft(fftReal, fftImag, sampleRate_MHz);
            }
            else
            {
                analysisData = new FftAnalysis();
            }

            for (int i = 0; i < numSamples; i++)
            {
                fftMagnitude_dB[i] = 10.0 * System.Math.Log10(fftReal[i] * fftReal[i] + fftImag[i] * fftImag[i]);
            }

            return(fftMagnitude_dB);
        }
Пример #7
0
        public void iqDataCW_Array(out ComplexDouble[] iqDataArray)
        {
            List <ComplexDouble> iqData = new List <ComplexDouble>();

            //Generate CW waveform
            for (int x = 0; x < 10000; x++)
            {
                iqData.Add(new ComplexDouble(1, 0));
            }

            //convert from list to Complex Double Array
            iqDataArray = new ComplexDouble[iqData.Count];
            iqDataArray = iqData.ToArray();
        }
        public ComplexWaveform <ComplexDouble> createWaveform(List <PhaseAmplitudeOffset> offsets)
        {
            ComplexWaveform <ComplexDouble> complexWaveform;

            ComplexDouble[] IQData = new ComplexDouble[offsets.Count];

            for (int i = 0; i < offsets.Count; i++)
            {
                IQData[i] = ComplexDouble.FromPolar((double)offsets[i].Amplitude, (double)offsets[i].Phase);
            }

            complexWaveform = ComplexWaveform <ComplexDouble> .FromArray1D(IQData);

            return(complexWaveform);
        }
Пример #9
0
        public void iqData_Array(string IPath, string QPath, out ComplexDouble[] iqDataArray)
        {
            List <ComplexDouble> iqData = new List <ComplexDouble>();

            // read iq data from file
            StreamReader iReader = new StreamReader(File.OpenRead(IPath));
            StreamReader qReader = new StreamReader(File.OpenRead(QPath));

            while (!(iReader.EndOfStream || qReader.EndOfStream))
            {
                double i = double.Parse(iReader.ReadLine());
                double q = double.Parse(qReader.ReadLine());
                iqData.Add(new ComplexDouble(i, q));
            }

            //convert from list to Complex Double Array
            iqDataArray = new ComplexDouble[iqData.Count];
            iqDataArray = iqData.ToArray();
        }
Пример #10
0
 public ComplexDouble Calc(ComplexDouble a, ComplexDouble b, ComplexDouble c, ComplexDouble z /* = new ComplexDouble()*/)
 {
     return((_func ?? (_func = _strToFunc(StrFunc)))
                (a /* + AbcShift.A*/, b /* + AbcShift.B*/, c /* + AbcShift.C*/, z));
 }
Пример #11
0
        public Func <ComplexDouble> Calc(ComplexDouble a, ComplexDouble b, ComplexDouble c)
        {
            var f = (_func ?? (_func = _strToFunc(StrFunc)));

            return(z => f(a, b, c, z));
        }
Пример #12
0
 public static Func <ComplexDouble> Fa2c(int h, Fabcz fa1c, ComplexDouble a, ComplexDouble c)
 {
     return(Fa2c(Fa2czSet[h].Data.Data, fa1c, a, c));
 }
Пример #13
0
        public ComplexDouble Calc(ComplexDouble a, ComplexDouble b, ComplexDouble c, ComplexDouble z /* = new ComplexDouble()*/)
        {
            Coef num = Numerator, den = Denominator;

            return(num.Calc(a, b, c, z) / den.Calc(a, b, c, z));
        }
Пример #14
0
        public Func <ComplexDouble> Calc(ComplexDouble a, ComplexDouble b, ComplexDouble c)
        {
            var copy = this;

            return(z => copy.Calc(a, b, c, z));
        }