// 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)); }
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); }
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); }
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()))); }
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); }
/// <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); }
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); }
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(); }
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)); }
public Func <ComplexDouble> Calc(ComplexDouble a, ComplexDouble b, ComplexDouble c) { var f = (_func ?? (_func = _strToFunc(StrFunc))); return(z => f(a, b, c, z)); }
public static Func <ComplexDouble> Fa2c(int h, Fabcz fa1c, ComplexDouble a, ComplexDouble c) { return(Fa2c(Fa2czSet[h].Data.Data, fa1c, a, c)); }
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)); }
public Func <ComplexDouble> Calc(ComplexDouble a, ComplexDouble b, ComplexDouble c) { var copy = this; return(z => copy.Calc(a, b, c, z)); }