/// <summary>Configures common settings for the ACP measurement and selects the measurement.</summary> /// <param name="specAn">Specifies the SpecAn signal to configure.</param> /// <param name="acpConfig">Specifies the ACP settings to apply.</param> /// <param name="selectorString">Pass an empty string. The signal name that is passed when creating the signal configuration is used. See the RFmx help for more documention of this parameter.</param> public static void ConfigureAcp(RFmxSpecAnMX specAn, AcpConfiguration acpConfig, string selectorString = "") { specAn.SelectMeasurements(selectorString, RFmxSpecAnMXMeasurementTypes.Acp, false); specAn.Acp.Configuration.ConfigurePowerUnits(selectorString, acpConfig.PowerUnits); specAn.Acp.Configuration.ConfigureAveraging(selectorString, acpConfig.AveragingEnabled, acpConfig.AveragingCount, acpConfig.AveragingType); specAn.Acp.Configuration.ConfigureFft(selectorString, acpConfig.FftWindow, acpConfig.FftPadding); specAn.Acp.Configuration.ConfigureRbwFilter(selectorString, acpConfig.RbwAuto, acpConfig.Rbw_Hz, acpConfig.RbwFilterType); specAn.Acp.Configuration.ConfigureSweepTime(selectorString, acpConfig.SweepTimeAuto, acpConfig.SweepTimeInterval_s); specAn.Acp.Configuration.ConfigureNumberOfCarriers(selectorString, acpConfig.ComponentCarrierConfiguration.Length); for (int i = 0; i < acpConfig.ComponentCarrierConfiguration.Length; i++) { string carrierString = RFmxSpecAnMX.BuildCarrierString2(selectorString, i); AcpComponentCarrierConfiguration carrierConfiguration = acpConfig.ComponentCarrierConfiguration[i]; specAn.Acp.Configuration.ConfigureCarrierIntegrationBandwidth(carrierString, carrierConfiguration.IntegrationBandwidth_Hz); specAn.Acp.Configuration.ConfigureCarrierFrequency(carrierString, carrierConfiguration.Frequency_Hz); specAn.Acp.Configuration.ConfigureCarrierRrcFilter(carrierString, carrierConfiguration.RrcFilterEnabled, carrierConfiguration.RrcAlpha); specAn.Acp.Configuration.ConfigureCarrierMode(carrierString, carrierConfiguration.Mode); } specAn.Acp.Configuration.ConfigureNumberOfOffsets(selectorString, acpConfig.OffsetChannelConfiguration.Length); for (int i = 0; i < acpConfig.OffsetChannelConfiguration.Length; i++) { string offsetString = RFmxSpecAnMX.BuildOffsetString2(selectorString, i); AcpOffsetChannelConfiguration offsetConfiguration = acpConfig.OffsetChannelConfiguration[i]; specAn.Acp.Configuration.ConfigureOffsetIntegrationBandwidth(offsetString, offsetConfiguration.IntegrationBandwidth_Hz); specAn.Acp.Configuration.ConfigureOffset(offsetString, offsetConfiguration.Frequency_Hz, offsetConfiguration.SideBand, offsetConfiguration.Enabled); specAn.Acp.Configuration.ConfigureOffsetPowerReference(offsetString, offsetConfiguration.PowerReferenceCarrier, offsetConfiguration.PowerReferenceSpecificIndex); specAn.Acp.Configuration.ConfigureOffsetRelativeAttenuation(offsetString, offsetConfiguration.RelativeAttenuation_dB); specAn.Acp.Configuration.ConfigureOffsetRrcFilter(offsetString, offsetConfiguration.RrcFilterEnabled, offsetConfiguration.RrcAlpha); } }
/// <summary>Fetches common results from the ACP measurement.</summary> /// <param name="specAn">Specifies the SpecAn 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 ACP measurement results.</returns> public static AcpResults FetchAcp(RFmxSpecAnMX specAn, string selectorString = "") { double[] lowerRelativePower = null; double[] upperRelativePower = null; double[] lowerAbsolutePower = null; double[] upperAbsolutePower = null; specAn.Acp.Results.FetchOffsetMeasurementArray(selectorString, 10.0, ref lowerRelativePower, ref upperRelativePower, ref lowerAbsolutePower, ref upperAbsolutePower); AcpResults results = new AcpResults() { OffsetResults = new AcpOffsetResults[lowerRelativePower.Length] }; for (int i = 0; i < lowerRelativePower.Length; i++) { string offsetString = RFmxSpecAnMX.BuildOffsetString2(selectorString, i); specAn.Acp.Configuration.GetOffsetFrequency(offsetString, out double offsetFrequency); specAn.Acp.Configuration.GetOffsetIntegrationBandwidth(offsetString, out double offsetIbw); results.OffsetResults[i] = new AcpOffsetResults() { LowerRelativePower_dB = lowerRelativePower[i], UpperRelativePower_dB = upperRelativePower[i], LowerAbsolutePower_dBm_or_dBmHz = lowerAbsolutePower[i], UpperAbsolutePower_dBm_or_dBmHz = upperAbsolutePower[i], Frequency_Hz = offsetFrequency, IntegrationBandwidth_Hz = offsetIbw }; } specAn.Acp.Configuration.GetNumberOfCarriers(selectorString, out int numCarrierChannels); results.ComponentCarrierResults = new AcpComponentCarrierResults[numCarrierChannels]; for (int i = 0; i < numCarrierChannels; i++) { string carrierString = RFmxSpecAnMX.BuildCarrierString2(selectorString, i); AcpComponentCarrierResults componentCarrierResults; specAn.Acp.Results.FetchCarrierMeasurement(carrierString, 10.0, out componentCarrierResults.AbsolutePower_dBm_or_dBmHz, out componentCarrierResults.TotalRelativePower_dB, out componentCarrierResults.Frequency_Hz, out componentCarrierResults.IntegrationBandwidth_Hz); results.ComponentCarrierResults[i] = componentCarrierResults; } specAn.Acp.Results.FetchTotalCarrierPower(selectorString, 10.0, out results.TotalCarrierPower_dBm_or_dBmHz); return(results); }
/// <summary>Configures common pre-DPD CFR settings and applies CFR to the reference waveform, which is returned by the function.</summary> /// <param name="specAn">Specifies the SpecAn signal to configure.</param> /// <param name="referenceWaveform">Specifies the <see cref="Waveform"/> whose data defines the complex baseband equivalent of the RF signal on which the /// pre-DPD signal conditioning is applied. See the RFmx help for more documention of this parameter.</param> /// <param name="preDpdCfrConfig">Specifies common pre-DPD CFR settings to apply.</param> /// <param name="selectorString">Pass an empty string. The signal name that is passed when creating the signal configuration is used. /// See the RFmx help for more documention of this parameter.</param> /// <returns>The reference waveform with CFR applied.</returns> public static Waveform ConfigurePreDpdCrestFactorReduction(RFmxSpecAnMX specAn, Waveform referenceWaveform, PreDpdCrestFactorReductionConfiguration preDpdCfrConfig, string selectorString = "") { Waveform preDpdCfrWaveform = referenceWaveform; RFmxSpecAnMXDpdApplyDpdIdleDurationPresent preDpdCfrIdlePresent = preDpdCfrWaveform.IdleDurationPresent ? RFmxSpecAnMXDpdApplyDpdIdleDurationPresent.True : RFmxSpecAnMXDpdApplyDpdIdleDurationPresent.False; specAn.Dpd.PreDpd.SetCfrEnabled(selectorString, preDpdCfrConfig.Enabled); specAn.Dpd.PreDpd.SetCfrMethod(selectorString, preDpdCfrConfig.Method); specAn.Dpd.PreDpd.SetCfrMaximumIterations(selectorString, preDpdCfrConfig.MaxIterations); specAn.Dpd.PreDpd.SetCfrTargetPapr(selectorString, preDpdCfrConfig.TargetPapr_dB); specAn.Dpd.PreDpd.SetCfrWindowType(selectorString, preDpdCfrConfig.WindowType); specAn.Dpd.PreDpd.SetCfrWindowLength(selectorString, preDpdCfrConfig.WindowLength); specAn.Dpd.PreDpd.SetCfrShapingFactor(selectorString, preDpdCfrConfig.ShapingFactor); specAn.Dpd.PreDpd.SetCfrShapingThreshold(selectorString, preDpdCfrConfig.ShapingThreshold_dB); specAn.Dpd.PreDpd.SetCfrFilterEnabled(selectorString, preDpdCfrConfig.FilterEnabled); specAn.Dpd.PreDpd.SetCfrNumberOfCarriers(selectorString, preDpdCfrConfig.CarrierChannels.Length); // Configure the carrier channels for (int i = 0; i < preDpdCfrConfig.CarrierChannels.Length; i++) { string carrierString = RFmxSpecAnMX.BuildCarrierString2(selectorString, i); specAn.Dpd.PreDpd.SetCarrierOffset(carrierString, preDpdCfrConfig.CarrierChannels[i].Offset_Hz); specAn.Dpd.PreDpd.SetCarrierBandwidth(carrierString, preDpdCfrConfig.CarrierChannels[i].Bandwidth_Hz); } // Only call Apply Pre-DPD CFR and modify the waveform if Pre-DPD CFR is enabled if (preDpdCfrConfig.Enabled == RFmxSpecAnMXDpdPreDpdCfrEnabled.True) { // Configure the new waveform preDpdCfrWaveform.Data = referenceWaveform.Data.Clone(); // clone waveform so RFmx can't act on reference waveform preDpdCfrWaveform.UpdateNameAndScript(referenceWaveform.Name + "preDPDCFR"); // Apply CFR and return specAn.Dpd.PreDpd.ApplyPreDpdSignalConditioning(selectorString, referenceWaveform.Data, preDpdCfrIdlePresent, ref preDpdCfrWaveform.Data, out preDpdCfrWaveform.PAPR_dB); } return(preDpdCfrWaveform); }