public static ModAccResults FetchModAcc(RFmxNRMX nrSignal, string selectorString = "") { ModAccResults modaccResults = new ModAccResults(); nrSignal.ModAcc.Results.GetCompositeRmsEvmMean(selectorString, out modaccResults.compositeRmsEvmMean); nrSignal.ModAcc.Results.GetCompositePeakEvmMaximum(selectorString, out modaccResults.compositePeakEvmMaximum); nrSignal.ModAcc.Results.GetCompositePeakEvmSlotIndex(selectorString, out modaccResults.compositePeakEvmSlotIndex); nrSignal.ModAcc.Results.GetCompositePeakEvmSymbolIndex(selectorString, out modaccResults.compositePeakEvmSymbolIndex); nrSignal.ModAcc.Results.GetCompositePeakEvmSubcarrierIndex(selectorString, out modaccResults.compositePeakEvmSubcarrierIndex); nrSignal.ModAcc.Results.GetComponentCarrierFrequencyErrorMean(selectorString, out modaccResults.componentCarrierFrequencyErrorMean); nrSignal.ModAcc.Results.GetComponentCarrierIQOriginOffsetMean(selectorString, out modaccResults.componentCarrierIQOriginOffsetMean); nrSignal.ModAcc.Results.GetComponentCarrierIQGainImbalanceMean(selectorString, out modaccResults.componentCarrierIQGainImbalanceMean); nrSignal.ModAcc.Results.GetComponentCarrierQuadratureErrorMean(selectorString, out modaccResults.componentCarrierQuadratureErrorMean); nrSignal.ModAcc.Results.GetInBandEmissionMargin(selectorString, out modaccResults.inBandEmissionMargin); nrSignal.ModAcc.Results.FetchPuschDataConstellationTrace(selectorString, 10, ref modaccResults.puschDataConstellation); nrSignal.ModAcc.Results.FetchPuschDmrsConstellationTrace(selectorString, 10, ref modaccResults.puschDmrsConstellation); nrSignal.ModAcc.Results.FetchRmsEvmPerSubcarrierMeanTrace(selectorString, 10, ref modaccResults.rmsEvmPerSubcarrierMean); nrSignal.ModAcc.Results.FetchRmsEvmPerSymbolMeanTrace(selectorString, 10, ref modaccResults.rmsEvmPerSymbolMean); nrSignal.ModAcc.Results.FetchSpectralFlatnessTrace(selectorString, 10, ref modaccResults.spectralFlatness, ref modaccResults.spectralFlatnessLowerMask, ref modaccResults.spectralFlatnessUpperMask); return(modaccResults); }
public void TestOfflineAnalysisSingleCarrierTdd() { RFmxInstrMX instr = new RFmxInstrMX("", "AnalysisOnly=1"); RFmxLteMX lte = instr.GetLteSignalConfiguration(); ConfigureCommon(lte, CommonConfiguration.GetDefault()); StandardConfiguration signalConfig = StandardConfiguration.GetDefault(); signalConfig.DuplexScheme = RFmxLteMXDuplexScheme.Tdd; ConfigureStandard(lte, signalConfig); ModAccConfiguration modAccConfig = ModAccConfiguration.GetDefault(); modAccConfig.MeasurementOffset = 4; ConfigureModAcc(lte, modAccConfig); lte.Commit(""); instr.GetRecommendedIQPreTriggerTime("", out double pretriggerTime); PrecisionTimeSpan timeOffset = new PrecisionTimeSpan(-pretriggerTime); Waveform wfm = LoadWaveformFromTDMS(@"Support Files\LTE_TDD_2.0.tdms"); Buffer <ComplexSingle> readBuffer = wfm.Data.GetBuffer(true); WritableBuffer <ComplexSingle> writeBuffer = wfm.Data.GetWritableBuffer(); int sampleOffset = (int)Math.Round(pretriggerTime * wfm.SampleRate); for (int i = 0; i < readBuffer.Size; i++) { writeBuffer[i] = readBuffer[(i - sampleOffset + readBuffer.Size) % readBuffer.Size]; } wfm.Data.PrecisionTiming = PrecisionWaveformTiming.CreateWithRegularInterval( wfm.Data.PrecisionTiming.SampleInterval, timeOffset); lte.AnalyzeIQ("", "", wfm.Data, true, out _); ModAccResults modAccResults = FetchModAcc(lte); instr.Close(); Assert.IsTrue(modAccResults.ComponentCarrierResults[0].MeanRmsCompositeEvm < 0.001); }
/// <summary>Fetches common results from the ModAcc measurement.</summary> /// <param name="nr">Specifies the NR signal to fetch results from.</param> /// <param name="selectorString">(Optional) Specifies the result name. See the RFmx help for more documentation of this parameter.</param> /// <returns>Common ModAcc measurement results.</returns> public static ModAccResults FetchModAcc(RFmxNRMX nr, string selectorString = "") { nr.ComponentCarrier.GetNumberOfComponentCarriers(selectorString, out int numComponentCarriers); ModAccResults modaccResults = new ModAccResults() { ComponentCarrierResults = new ModAccComponentCarrierResults[numComponentCarriers] }; for (int i = 0; i < numComponentCarriers; i++) { ModAccComponentCarrierResults componentCarrierResults; string carrierString = RFmxNRMX.BuildCarrierString(selectorString, i); nr.ModAcc.Results.GetCompositePeakEvmSubcarrierIndex(carrierString, out componentCarrierResults.PeakCompositeEvmSubcarrierIndex); nr.ModAcc.Results.GetCompositePeakEvmSymbolIndex(carrierString, out componentCarrierResults.PeakCompositeEvmSymbolIndex); nr.ModAcc.Results.GetCompositeRmsEvmMean(carrierString, out componentCarrierResults.MeanRmsCompositeEvm); nr.ModAcc.Results.GetCompositePeakEvmMaximum(carrierString, out componentCarrierResults.MaxPeakCompositeEvm); nr.ModAcc.Results.GetComponentCarrierFrequencyErrorMean(carrierString, out componentCarrierResults.MeanFrequencyError_Hz); nr.ModAcc.Results.GetCompositePeakEvmSlotIndex(carrierString, out componentCarrierResults.PeakCompositeEvmSlotIndex); modaccResults.ComponentCarrierResults[i] = componentCarrierResults; } return(modaccResults); }
/// <summary> /// This example illustrates how to use the RFmxNR APIs to configure the analyzer to perform a ModAcc measurement. /// You can use the Generator Basic example to generate the NR signal before running this example. /// </summary> static void Main(string[] args) { Console.WriteLine("\n----------------------- 5GNR Analyzer Example -----------------------\n"); double centerFrequency = 3.5e9; //Hz string resourceName = "5840"; string signalString = "Signal0"; string resultString = "Result0"; SA.RFmxInstr.InstrumentConfiguration saInstrConfig; SA.CommonConfiguration saCommonConfig; SA.AutoLevelConfiguration saAutolevelConfig; SA.RFmxNR.StandardConfiguration StandardConfigNR; SA.RFmxNR.ModAccConfiguration ModaccConfigNR; SA.RFmxNR.ModAccResults ModaccResultsNR = new ModAccResults(); //Analyzer Configuration Console.WriteLine("Configure...\n"); saInstrConfig = SA.RFmxInstr.InstrumentConfiguration.GetDefault(); saCommonConfig = saCommonConfig = SA.CommonConfiguration.GetDefault(); saCommonConfig.ExternalAttenuation_dB = 0; saCommonConfig.CenterFrequency_Hz = centerFrequency; saCommonConfig.ReferenceLevel_dBm = 0.0; saAutolevelConfig = SA.AutoLevelConfiguration.GetDefault(); saAutolevelConfig.Enabled = true; StandardConfigNR = SA.RFmxNR.StandardConfiguration.GetDefault(); StandardConfigNR.ComponentCarrierConfigurations[0].PuschModulationType = RFmxNRMXPuschModulationType.Qpsk; ModaccConfigNR = SA.RFmxNR.ModAccConfiguration.GetDefault(); #region Configure Analyzer saAutolevelConfig.MeasurementInterval_s = 0.001; RFmxInstrMX instr = new RFmxInstrMX(resourceName, ""); SA.RFmxInstr.ConfigureInstrument(instr, saInstrConfig); RFmxNRMX nr = instr.GetNRSignalConfiguration(signalString); SA.RFmxNR.ConfigureCommon(nr, saCommonConfig); SA.RFmxNR.ConfigureStandard(nr, StandardConfigNR); #endregion #region Measure Console.WriteLine("Measure...\n"); ConfigureModacc(nr, ModaccConfigNR); RFmxNRMXMeasurementTypes[] nrMeasurements = new RFmxNRMXMeasurementTypes[1] { RFmxNRMXMeasurementTypes.ModAcc }; SA.RFmxNR.SelectAndInitiateMeasurements(nr, nrMeasurements, saAutolevelConfig, false, "", resultString); ModaccResultsNR = FetchModAcc(nr, RFmxNRMX.BuildResultString(resultString)); //print Results for (int i = 0; i < ModaccResultsNR.ComponentCarrierResults.Length; i++) { Console.WriteLine("----------------------- EVM Results CC {0} -----------------------\n", i); Console.WriteLine("Composite RMS EVM Mean (% or dB) : {0:0.000}", ModaccResultsNR.ComponentCarrierResults[i].MeanRmsCompositeEvm); Console.WriteLine("Composite Peak EVM Maximum (% or dB) : {0:0.000}", ModaccResultsNR.ComponentCarrierResults[i].MaxPeakCompositeEvm); Console.WriteLine("Composite Peak EVM Slot Index : {0}", ModaccResultsNR.ComponentCarrierResults[i].PeakCompositeEvmSlotIndex); Console.WriteLine("Composite Peak EVM Symbol Index : {0}", ModaccResultsNR.ComponentCarrierResults[i].PeakCompositeEvmSymbolIndex); Console.WriteLine("Composite Peak EVM Subcarrier Index : {0}", ModaccResultsNR.ComponentCarrierResults[i].PeakCompositeEvmSubcarrierIndex); Console.WriteLine("Component Carrier Frequency Error Mean (Hz) : {0:0.000}", ModaccResultsNR.ComponentCarrierResults[i].MeanFrequencyError_Hz); } #endregion nr.Dispose(); instr.Close(); Console.WriteLine("Please press any key to close the application.\n"); Console.ReadKey(); }