コード例 #1
0
        /// <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();
        }