Post Go back to editing

How to config DPD on AD9375?

Hi,

I use default DPDconfig to configure DPD on my custom board:

static mykonosDpdConfig_t dpdConfig =
{
    10,              /* 1/2^(damping + 8) fraction of power `forgotten' per sample (default: `1/8192' = 5, valid 0 to 15), 0 = infinite damping*/
    1,              /* number of weights to use for int8_cpx weights weights member of this structure (default = 1)*/
    2,              /* DPD model version: one of four different generalized polynomial models: 0 = same as R0 silicon, 1-3 are new and the best one depends on the PA (default: 2)*/
    1,              /* 1 = Update saved model whenever peak Tx digital RMS is within 1dB of historical peak Tx RMS*/
    20,             /* Determines how much weight the loaded prior model has on DPD modeling (Valid 0 - 32, default 20)*/
    0,              /* Default off = 0, 1=enables automatic outlier removal during DPD modeling */
    512,            /* Number of samples to capture (default: 512, valid 64-32768)*/
    4096,           /* threshold for sample in AM-AM plot outside of 1:1 line to be thrown out. (default: 50% = 8192/2, valid 8192 to 1)*/
    0,              /* 16th of an ORx sample (16=1sample), (default 0, valid -64 to 64)*/
    255,            /* Default 255 (-30dBFs=(20Log10(value/8192)), (valid range  1 to 8191)*/
    {{64,0},{0,0},{0,0}}/* DPD model error weighting (real/imag valid from -128 to 127)*/
};

My system have multi mode BPSK, QPSK, QUAM16,QUAM64 with bandwidth 5MHz, 10MHz, 20Mhz. 

I have feedback Tx2 signal into ORX2 with power -24dbm and configure dpd follow ug992. But i don't see any different between have setup DPD and no have DPD.

Here is status that I read using MYKONOS_getDpdStatus:

 dpdStatus.dpdErrorStatus = 0,

dpdStatus.dpdExtPathDelay = 0x73B ,

dpdStatus.dpdIterCount = 0,

dpdStatus.dpdMaxAdaptation = 0,

dpdStatus.dpdModelErrorPercent = 1000,

dpdStatus.dpdTrackCount = 0

Can you suggest for me how to solve? Thanks. This is my output from tx:



dpdStatus.dpdErrorStatus = 0, dpdStatus.dpdExtPathDelay = 0x73B , dpdStatus.dpdIterCount = 0, dpdStatus.dpdMaxAdaptation = 0, dpdStatus.dpdModelErrorPercent = 1000, dpdStatus.dpdTrackCount = 0
[edited by: sonminh at 2:00 AM (GMT 0) on 24 Apr 2020]
Parents
  • HI ,

    I have mistake once post this question in to that forum, then I received this answer:

    "Moving to No-Os forum for comments on the DPD configuration"

    Because I don't know delete that question, I have post again in this forum.

    Thanks

  • When you say Enable DPD , What function is called ? What is the sequence.? 

    Peak current going high, you can try adding some bulk capacitor to PA drain bias , Say 220 UF. 

    Can you share a wide band span spectrum plot of PA output with DPD enabled., Is the output unstable?

  • Hi

    With output power 30dbm, with DPD enable, spectrum plot stable.

    Here is sequence once change frequency and calib DPD:

    mykonosErr_t		mykError;
    
    
    #if DPD_ENABLE
    
    	/*************************************************************************/
    	/*****            Enable DPD calibrations                            *****/
    	/*************************************************************************/
    	uint8_t				errorFlag = 0;
    	uint8_t				errorCode = 0;
    	uint32_t			initCalsCompleted;
    
    	uint32_t initCalMask = TX_BB_FILTER | ADC_TUNER | TIA_3DB_CORNER | DC_OFFSET |
    										  TX_ATTENUATION_DELAY | RX_GAIN_DELAY | FLASH_CAL |
    										  PATH_DELAY | TX_LO_LEAKAGE_INTERNAL | TX_QEC_INIT |
    										  LOOPBACK_RX_LO_DELAY | LOOPBACK_RX_RX_QEC_INIT |
    										  RX_LO_DELAY | RX_QEC_INIT ;
    
    	uint32_t trackingCalMask = TRACK_ORX1_QEC | TRACK_ORX2_QEC | TRACK_RX1_QEC |
    							 TRACK_RX2_QEC | TRACK_TX1_QEC | TRACK_TX2_QEC | TRACK_TX1_LOL | TRACK_TX2_LOL;
    
    	uint32_t initCalMaskDpd = initCalMask | DPD_INIT | CLGC_INIT | VSWR_INIT;
    
    
    #endif
    	if ((mykError = MYKONOS_radioOff(&mykDevice)) != MYKONOS_ERR_OK)
    	{
    		/*** < Info: errorString will contain log error string in order to debug why radioOn failed > ***/
    		//errorString = getMykonosErrorMessage(mykError);
    		puts(getMykonosErrorMessage(mykError));
    
    	}
    
    	if ((mykError = MYKONOS_setRfPllFrequency(&mykDevice, TX_PLL, u64TxFrq)) != MYKONOS_ERR_OK) {
    		return MYKONOS_ERR_FAILED;
    	}
    
    #if DPD_ENABLE
    
    	// Make sure PA is ON
    	if((mykError = MYKONOS_abortInitCals(&mykDevice, &initCalsCompleted)) != MYKONOS_ERR_OK)
    	{
    		/*** < Info: errorString will contain log error string in order to debug why failed > ***/
    		//errorString = getMykonosErrorMessage(mykError);
    		puts("abortInitCals failed");
    		fflush(stdout);
    		puts(getMykonosErrorMessage(mykError));
    	}
    
    	xil_printf("\r\n Mykonos ARM Initialization Calibrations for DPD");
    
    	if ((mykError = MYKONOS_runInitCals(&mykDevice, (initCalMaskDpd & ~TX_LO_LEAKAGE_EXTERNAL))) != MYKONOS_ERR_OK)
    	{
    		/*** < Info: errorString will contain log error string in order to debug why failed > ***/
    		//errorString = getMykonosErrorMessage(mykError);
    		puts("MYKONOS_runInitCals");
    		fflush(stdout);
    		puts(getMykonosErrorMessage(mykError));
    
    	}
    
    	if ((mykError = MYKONOS_waitInitCals(&mykDevice, 60000, &errorFlag, &errorCode)) != MYKONOS_ERR_OK)
    	{
    		/*** < Info: errorString will contain log error string in order to debug why failed > ***/
    		//errorString = getMykonosErrorMessage(mykError);
    		puts("MYKONOS_waitInitCals");
    		fflush(stdout);
    		puts(getMykonosErrorMessage(mykError));
    	 }
    
    	if ((mykError = MYKONOS_getEnabledTrackingCals(&mykDevice, &trackingCalMask)) != MYKONOS_ERR_OK)
    	{
    		/*** < Info: errorString will contain log error string in order to debug why failed > ***/
    		//errorString = getMykonosErrorMessage(mykError);
    		puts("MYKONOS_getEnabledTrackingCals");
    		fflush(stdout);
    		puts(getMykonosErrorMessage(mykError));
    
    	}
    
    	trackingCalMask |= TRACK_TX1_DPD | TRACK_TX2_DPD | TRACK_TX1_CLGC | TRACK_TX2_CLGC | TRACK_TX1_VSWR | TRACK_TX2_VSWR;
    
    	if ((mykError = MYKONOS_enableTrackingCals(&mykDevice, trackingCalMask)) != MYKONOS_ERR_OK)
    	{
    		/*** < Info: errorString will contain log error string in order to debug why enableTrackingCals failed > ***/
    		//errorString = getMykonosErrorMessage(mykError);
    		puts(getMykonosErrorMessage(mykError));
    
    	}
    
    #endif
    
    	MYKONOS_radioOn(&mykDevice);
    
    	return MYKONOS_ERR_OK;

  • What is the max current you are seeing when you are running init cals other than DPD?

    Please refer to the max current requirement for Mykonos chip from the datasheet, section "CURRENT AND POWER CONSUMPTION SPECIFICATIONS", table 2.

  • Hi

    Where are document that say ACLR should be symmetric within +- 1dB?

    Thanks

  • There is no document on this. What i mentioned was generic , 1dB is a tight requirement . DPD applies correction with assumption that the IM products are symmetric , 

    You can measure Video bandwidth of your PA and see if the lower and upper IM products are not deviating more than 3 dB,

  • Hi ,

    My system using GaN PA 's. What will happen when use DPD with GaN PA 's ?. What should I do with gaN PA 's and DPD on ADRV9375.

    Thanks

  • AD9375 DPD has limited number of GMP terms and that may not work well with GaN PA's. I guess all our test reports are with LDMOS PA's.

    https://www.analog.com/en/applications/technology/sdr-radioverse-pavilion-home/wideband-transceivers/digital-pre-distortion.html  --> Power Amplifier Test Report

  • Thanks for your infomation.

    Because my system using GaN PA 's. So i try to use DPD on ad9375 at frequency that may be DPD. I implement high speed transmission 100Mbps between 2 system with have DPD and then run  between 2 system No DPD to compare. I see system NO DPD work much  better  than system HAVE DPD( speed higher).  Although spectrum of system have dpd better than no dpd and status of DPD return 0 (no error  ).

    Here is spectrum of system NO HAVE DPD:

    And here is spectrum of system  HAVE DPD:

    Can you give me solution ?

    Thanks

  • I see system NO DPD work much  better  than system HAVE DPD

    Why you say so?  The second plot with DPD seems to be better.(Have DPD)

    What is the target ACLR and what is the measured ACLR after DPD? 

  • Yes,

    The second plot with DPD seems to be better.(Have DPD). BUT I don't understand why system no have dpd run better than system have DPD.

    ACLR before DPD:  -33dbc

    ACLR after DPD: -45DBC

Reply Children
  • BUT I don't understand why system no have dpd run better than system have DPD.

    What do you mean by run better here ? 

  • I implement high speed transmission 100Mbps between 2 system with have DPD and then run between 2 system No DPD to compare. System no have dpd run at about100Mbps, but system have dpd only run about 10Mbps because error packet

  • Are you enabling disabling DPD on same hardware or different hardware boards? 

    Have you measured EVM with and with out DPD ? 

    Are you using CFR with DPD ? 

  • I enable or disable DPD on same hardware, same waveform, in same condition, only have different between have dpd and no dpd.

    I have used CFR and PAR is 8dB 

  • What is the EVM and through put with CFR with out DPD ? 

    DPD should not deteriorate EVM or increase packet loss.

  • Yes, although spectrum of dpd better than, but may be DPD deteriorate EVM or increase packet loss

    I have tried transmit tone sine with dpd and no dpd on board 1 and then log IQ receiver on board 2. Then plot spectrum in matlab.

    here is with dpd:

    here is no dpd

  • Can you measure TX output on spectrum analyzer and measure EVM on both cases .? 

    What is the Tx power going into Rx ? The specturm looks like the Rx is saturating or the digital input power to tX is too high .

    \You can try using -6 dBFS for tone. For modulated waveforms back off digital as per PAR+ some margin.

  • Above plot  is 2 tone sine 3Mhz and 10Mhz is logged from RX receiver in case no DPD. (Tx output on board 1 is 2 tone sine signal  and log IQ on board 2 ). It could have harmonic but no have noises as case have dpd. I couldn't measure EVM. But why dpd make output tx be deteriorated ?

  • Not sure why you are measuring DPD performance with 2 tone signal. What is DPD status mykonosDpdStatus_t. 

    You need to first find out Tx EVM after applying CFR No DPD . If CFR is based on hard clipping EVM & through put will deteriorate.

    From the ACLR plot with DPD that you shared previously , ACLR is improving means , EVM should improve and this should not impact through put.

  • After applying CFR with no dpd, system run at mode custom waveform QAM64 work well with 100Mbps, So, I guess Tx EVM good.

    With applying CFR with DPD, I veryfied DPDStatus every 1s. It return in order
    dpdStatus.dpdErrorStatus: ,dpdStatus.dpdExtPathDelay, dpdStatus.dpdIterCount, dpdStatus.dpdMaxAdaptation, dpdStatus.dpdModelErrorPercent, dpdStatus.dpdTrackCount

    DPDStatus: 0 0x740 0xC6 0x11D3 0x25 0xC6
    DPDStatus: 0 0x740 0xCA 0x11D3 0x26 0xCA
    DPDStatus: 0 0x740 0xCE 0x11D3 0x25 0xCE
    DPDStatus: 0 0x740 0xD2 0x11D3 0x27 0xD2
    DPDStatus: 0 0x740 0xD6 0x11D3 0x28 0xD6
    DPDStatus: 0 0x740 0xDA 0x11D3 0x27 0xDA
    DPDStatus: 0 0x740 0xDE 0x11D3 0x28 0xDE
    DPDStatus: 0 0x740 0xE2 0x11D3 0x25 0xE2
    DPDStatus: 0 0x740 0xE6 0x11D3 0x27 0xE6
    DPDStatus: 0 0x740 0xF2 0x12CE 0x24 0xF2

    Because after applying DPD, my system seems run not good as no have dpd. So i don't know how to do next. Although my system run at 20Mhz bandwidth, I still  measuring DPD performance with 2 tone signal  to can see spectrum clearly.

    Can you give solution?