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);
        }
Пример #2
0
        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();
        }