/// <summary>Creates an envelope waveform utilizing the detrough method.</summary> /// <param name="referenceWaveform">Specifies the waveform used for RF signal generation.</param> /// <param name="detroughConfig">Specifies common settings for creating the detrough envelope waveform.</param> /// <returns>The detrough envelope waveform.</returns> public static Waveform CreateDetroughEnvelopeWaveform(Waveform referenceWaveform, DetroughConfiguration detroughConfig) { Waveform envelopeWaveform = CloneAndConditionReferenceWaveform(referenceWaveform); WritableBuffer <ComplexSingle> envWfmWriteBuffer = envelopeWaveform.Data.GetWritableBuffer(); double[] envelope = envelopeWaveform.Data.GetMagnitudeDataArray(false); double detroughRatio = detroughConfig.MinimumVoltage_V / detroughConfig.MaximumVoltage_V; // Waveforms are assumed to be normalized in range [0, 1], so no normalization will happen here switch (detroughConfig.Type) { case DetroughType.Exponential: // Formula: e = IQmag + d*exp(-IQmag/d) for (int i = 0; i < envWfmWriteBuffer.Size; i++) { envelope[i] = envelope[i] + detroughRatio * Math.Exp(-envelope[i] / detroughRatio); } break; case DetroughType.Cosine: // Formula: e = 1 - (1-d)*cos(IQmag*pi/2) for (int i = 0; i < envWfmWriteBuffer.Size; i++) { envelope[i] = 1.0 - (1.0 - detroughRatio) * Math.Cos(envelope[i] * Math.PI / 2.0); } break; case DetroughType.Power: // Formula: e = d + IQmag^(exponent)*(1-d) for (int i = 0; i < envWfmWriteBuffer.Size; i++) { envelope[i] = detroughRatio + Math.Pow(envelope[i], detroughConfig.Exponent) * (1 - detroughRatio); } break; default: throw new ArgumentException("Detrough type not supported.\n"); } double max = envelope.Max(); for (int i = 0; i < envelope.Length; i++) { envelope[i] *= detroughConfig.MaximumVoltage_V / max; envWfmWriteBuffer[i] = ComplexSingle.FromSingle((float)envelope[i]); } return(envelopeWaveform); }
/// <summary> /// This example illustrates how to use RFSG drivers and envelope tracking APIs to configure envelope tracking. /// </summary> static void Main(string[] args) { #region Example Settings // Select mode for use in the example EnvelopeMode mode = EnvelopeMode.Detrough; string waveformPath = @"C:\Users\Public\Documents\National Instruments\RFIC Test Software\Waveforms\LTE_FDD_DL_1x20MHz_TM11_OS4.tdms"; #endregion #region Configure RF Generator // Initialize instrument sessions NIRfsg rfVsg = new NIRfsg("5840", true, false); // Load up waveform Waveform rfWfm = LoadWaveformFromTDMS(waveformPath); // Configure RF generator InstrumentConfiguration rfInstrConfig = InstrumentConfiguration.GetDefault(); ConfigureInstrument(rfVsg, rfInstrConfig); DownloadWaveform(rfVsg, rfWfm); ConfigureContinuousGeneration(rfVsg, rfWfm); #endregion #region Configure Tracker Generator NIRfsg envVsg = new NIRfsg("5820", true, false); // Configure envelope generator EnvelopeGeneratorConfiguration envInstrConfig = EnvelopeGeneratorConfiguration.GetDefault(); TrackerConfiguration trackerConfig = TrackerConfiguration.GetDefault(); ConfigureEnvelopeGenerator(envVsg, envInstrConfig, trackerConfig); Waveform envWfm = new Waveform(); switch (mode) { case EnvelopeMode.Detrough: // Create envelope waveform DetroughConfiguration detroughConfig = DetroughConfiguration.GetDefault(); detroughConfig.MinimumVoltage_V = 1.5; detroughConfig.MaximumVoltage_V = 3.5; detroughConfig.Exponent = 1.2; detroughConfig.Type = DetroughType.Exponential; envWfm = CreateDetroughEnvelopeWaveform(rfWfm, detroughConfig); break; case EnvelopeMode.LUT: LookUpTableConfiguration lutConfig = new LookUpTableConfiguration { DutAverageInputPower_dBm = rfInstrConfig.DutAverageInputPower_dBm }; // Todo - initialize lookup table envWfm = CreateLookUpTableEnvelopeWaveform(rfWfm, lutConfig); break; } ScaleAndDownloadEnvelopeWaveform(envVsg, envWfm, trackerConfig); ConfigureContinuousGeneration(envVsg, envWfm, "PFI0"); #endregion // Start envelope tracking SynchronizationConfiguration syncConfig = SynchronizationConfiguration.GetDefault(); InitiateSynchronousGeneration(rfVsg, envVsg, syncConfig); // Wait until user presses a button to stop Console.WriteLine("Press any key to abort envelope tracking.."); Console.ReadKey(); AbortGeneration(envVsg); AbortGeneration(rfVsg); // Close instruments rfVsg.Close(); envVsg.Close(); }