Fixed calibration: use the same sampling rate and filter bw when calibrating. Renamed device check to loopback check. Improved debug.

git-svn-id: http://yate.null.ro/svn/yate/trunk@6197 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
marian 2017-03-29 14:28:54 +00:00
parent 5ba976cbe1
commit 86899f4b31
1 changed files with 46 additions and 29 deletions

View File

@ -1322,7 +1322,7 @@ public:
res.test /= samples(); res.test /= samples();
res.total /= samples(); res.total /= samples();
#endif #endif
return res.testOk && res.calOk; return res.testOk;
} }
inline String& dump(String& s, bool full) { inline String& dump(String& s, bool full) {
float delta = 0; float delta = 0;
@ -2408,7 +2408,7 @@ private:
unsigned int findPhaseExpParams(const ComplexVector& swee, float startSweep, float stepSweepp); unsigned int findPhaseExpParams(const ComplexVector& swee, float startSweep, float stepSweepp);
unsigned int calculateAmpTable(); unsigned int calculateAmpTable();
// //
unsigned int deviceCheck(String* error); unsigned int loopbackCheck(String* error);
unsigned int testVga(const char* loc, bool tx, bool preMixer, float omega = 0, unsigned int testVga(const char* loc, bool tx, bool preMixer, float omega = 0,
String* error = 0); String* error = 0);
inline unsigned int testVgaCheck(const NamedList& p, const char* loc, inline unsigned int testVgaCheck(const NamedList& p, const char* loc,
@ -4571,8 +4571,8 @@ unsigned int BrfLibUsbDevice::calibrate(bool sync, const NamedList& params,
txSerialize.drop(); txSerialize.drop();
rxSerialize.drop(); rxSerialize.drop();
// Check // Check
if (params.getBoolValue("device_check",true)) if (params.getBoolValue("loopback_check",true))
BRF_FUNC_CALL_BREAK(deviceCheck(&e)); BRF_FUNC_CALL_BREAK(loopbackCheck(&e));
// LMS autocalibration // LMS autocalibration
// Pause I/O threads, lock external I/O while calibrating // Pause I/O threads, lock external I/O while calibrating
BRF_FUNC_CALL_BREAK(calThreadsPause(true,&e)); BRF_FUNC_CALL_BREAK(calThreadsPause(true,&e));
@ -8636,13 +8636,15 @@ unsigned int BrfLibUsbDevice::prepareCalibrateBb(BrfBbCalData& data, bool dc,
rxFreq = m_state.m_tx.frequency + (Fs / 4); rxFreq = m_state.m_tx.frequency + (Fs / 4);
data.resetOmega(M_PI,0); data.resetOmega(M_PI,0);
} }
s.m_tx.lpfBw = bw;
s.m_tx.sampleRate = Fs;
s.m_rx.lpfBw = bw; s.m_rx.lpfBw = bw;
s.m_rx.sampleRate = Fs; s.m_rx.sampleRate = Fs;
s.m_rx.frequency = rxFreq; s.m_rx.frequency = rxFreq;
s.m_tx.vga1 = data.intParam(dc,YSTRING("txvga1"), s.m_tx.vga1 = data.intParam(dc,YSTRING("txvga1"),
BRF_TXVGA1_GAIN_DEF,BRF_TXVGA1_GAIN_MIN,BRF_TXVGA1_GAIN_MAX); BRF_TXVGA1_GAIN_DEF,BRF_TXVGA1_GAIN_MIN,BRF_TXVGA1_GAIN_MAX);
s.m_tx.vga2 = data.intParam(dc,YSTRING("txvga2"), s.m_tx.vga2 = data.intParam(dc,YSTRING("txvga2"),
BRF_TXVGA2_GAIN_DEF,BRF_TXVGA2_GAIN_MIN,BRF_TXVGA2_GAIN_MAX); 20,BRF_TXVGA2_GAIN_MIN,BRF_TXVGA2_GAIN_MAX);
s.m_rx.vga1 = data.intParam(dc,YSTRING("rxvga1"), s.m_rx.vga1 = data.intParam(dc,YSTRING("rxvga1"),
BRF_RXVGA1_GAIN_DEF,BRF_RXVGA1_GAIN_MIN,BRF_RXVGA1_GAIN_MAX); BRF_RXVGA1_GAIN_DEF,BRF_RXVGA1_GAIN_MIN,BRF_RXVGA1_GAIN_MAX);
s.m_rx.vga2 = data.intParam(dc,YSTRING("rxvga2"), s.m_rx.vga2 = data.intParam(dc,YSTRING("rxvga2"),
@ -8683,8 +8685,8 @@ unsigned int BrfLibUsbDevice::prepareCalibrateBb(BrfBbCalData& data, bool dc,
unsigned int BrfLibUsbDevice::calibrateBb(BrfBbCalData& data, bool dc, String* error) unsigned int BrfLibUsbDevice::calibrateBb(BrfBbCalData& data, bool dc, String* error)
{ {
const char* oper = dc ? "TX I/Q DC Offset (LO Leakage) calibration" : const char* oper = dc ? "TX I/Q DC Offset (LO Leakage)" :
"TX I/Q Imbalance calibration"; "TX I/Q Imbalance";
Debug(m_owner,DebugAll,"calibrateBb %s [%p]",oper,this); Debug(m_owner,DebugAll,"calibrateBb %s [%p]",oper,this);
// VGA tests // VGA tests
@ -8713,9 +8715,9 @@ unsigned int BrfLibUsbDevice::calibrateBb(BrfBbCalData& data, bool dc, String* e
if (data.boolParam(dc,"dump_status_start")) if (data.boolParam(dc,"dump_status_start"))
dumpState(s,data.m_params,true); dumpState(s,data.m_params,true);
if (dbg) if (dbg)
Debug(m_owner,level,"%s starting [%p]%s",oper,m_owner,encloseDashes(s,true)); Debug(m_owner,level,"%s calibration starting [%p]%s",oper,m_owner,encloseDashes(s,true));
else else
Output("%s starting omega_cal=%f omega_test=%f [%p]%s", Output("%s calibration starting omega_cal=%f omega_test=%f [%p]%s",
oper,data.omega(true),data.omega(false),m_owner,encloseDashes(s,true)); oper,data.omega(true),data.omega(false),m_owner,encloseDashes(s,true));
} }
@ -8753,7 +8755,7 @@ unsigned int BrfLibUsbDevice::calibrateBb(BrfBbCalData& data, bool dc, String* e
result << "I=" << data.m_dcI << " " << "Q=" << data.m_dcQ; result << "I=" << data.m_dcI << " " << "Q=" << data.m_dcQ;
else else
result << "PHASE=" << data.m_phase << " " << "GAIN=" << data.m_gain; result << "PHASE=" << data.m_phase << " " << "GAIN=" << data.m_gain;
Debug(m_owner,level,"%s finished in %s %s [%p]", Debug(m_owner,level,"%s calibration finished in %s %s [%p]",
oper,duration.secStr(),result.c_str(),m_owner); oper,duration.secStr(),result.c_str(),m_owner);
} }
@ -8838,9 +8840,10 @@ unsigned int BrfLibUsbDevice::calibrateBaseband(String* error)
BRF_FUNC_CALL_BREAK(prepareCalibrateBb(data,false,&e)); BRF_FUNC_CALL_BREAK(prepareCalibrateBb(data,false,&e));
BRF_FUNC_CALL_BREAK(calibrateBb(data,false,&e)); BRF_FUNC_CALL_BREAK(calibrateBb(data,false,&e));
// Update calibrated data // Update calibrated data
m_calibration.addParam("frequency",String(data.m_calFreq)); // Use initial tunning values: we may change them during calibration
m_calibration.addParam("samplerate",String(data.m_calSampleRate)); m_calibration.addParam("frequency",String(oldState.m_tx.frequency));
m_calibration.addParam("filter",String(m_state.m_tx.lpfBw)); m_calibration.addParam("samplerate",String(oldState.m_tx.sampleRate));
m_calibration.addParam("filter",String(oldState.m_tx.lpfBw));
m_calibration.addParam("cal_tx_dc_i",String(data.m_dcI)); m_calibration.addParam("cal_tx_dc_i",String(data.m_dcI));
m_calibration.addParam("cal_tx_dc_q",String(data.m_dcQ)); m_calibration.addParam("cal_tx_dc_q",String(data.m_dcQ));
m_calibration.addParam("cal_tx_fpga_corr_phase",String(data.m_phase)); m_calibration.addParam("cal_tx_fpga_corr_phase",String(data.m_phase));
@ -8900,17 +8903,17 @@ unsigned int BrfLibUsbDevice::calibrateBaseband(String* error)
return showError(status,e,0,error); return showError(status,e,0,error);
} }
unsigned int BrfLibUsbDevice::deviceCheck(String* error) unsigned int BrfLibUsbDevice::loopbackCheck(String* error)
{ {
Configuration cfg; Configuration cfg;
loadCfg(&cfg,false); loadCfg(&cfg,false);
NamedList& p = *cfg.createSection(YSTRING("device-check")); NamedList& p = *cfg.createSection(YSTRING("loopback-check"));
// Prepare data dump // Prepare data dump
m_dbgMutex.lock(); m_dbgMutex.lock();
BrfDumpFile dump(&p,m_devCheckFile); BrfDumpFile dump(&p,m_devCheckFile);
m_dbgMutex.unlock(); m_dbgMutex.unlock();
Debug(m_owner,DebugNote,"Device check starting ... [%p]",m_owner); Debug(m_owner,DebugNote,"Loopback check starting ... [%p]",m_owner);
BrfDuration duration; BrfDuration duration;
String e; String e;
unsigned int status = 0; unsigned int status = 0;
@ -8923,7 +8926,7 @@ unsigned int BrfLibUsbDevice::deviceCheck(String* error)
m_state.m_tx.frequency,0); m_state.m_tx.frequency,0);
if (!txFreq) if (!txFreq)
BRF_FUNC_CALL_BREAK(setErrorFail(&e,"Frequency not set")); BRF_FUNC_CALL_BREAK(setErrorFail(&e,"Frequency not set"));
unsigned int nBuffs = p.getIntValue("buffers",5,1); unsigned int nBuffs = p.getIntValue("buffers",10,1);
unsigned int bw = m_state.m_tx.lpfBw; unsigned int bw = m_state.m_tx.lpfBw;
unsigned int sampleRate = m_state.m_tx.sampleRate; unsigned int sampleRate = m_state.m_tx.sampleRate;
bw = p.getIntValue(YSTRING("bandwidth"),bw ? bw : 1500000,1500000); bw = p.getIntValue(YSTRING("bandwidth"),bw ? bw : 1500000,1500000);
@ -8942,7 +8945,7 @@ unsigned int BrfLibUsbDevice::deviceCheck(String* error)
minDeltaFreq + (maxDeltaFreq - minDeltaFreq) / 2,minDeltaFreq,maxDeltaFreq); minDeltaFreq + (maxDeltaFreq - minDeltaFreq) / 2,minDeltaFreq,maxDeltaFreq);
if (deltaFreq == (sampleRate / 4)) { if (deltaFreq == (sampleRate / 4)) {
// TODO: Properly adjust it // TODO: Properly adjust it
Debug(m_owner,DebugStub,"Device check adjusting delta freq [%p]",m_owner); Debug(m_owner,DebugStub,"Loopback check adjusting delta freq [%p]",m_owner);
deltaFreq += 1000; deltaFreq += 1000;
} }
// Sanity check // Sanity check
@ -9041,7 +9044,7 @@ unsigned int BrfLibUsbDevice::deviceCheck(String* error)
} }
} }
t.append(tmp,"\r\n"); t.append(tmp,"\r\n");
Output("Device check: frequency tx=%u rx=%u (delta=%u omega=%f) " Output("Loopback check: frequency tx=%u rx=%u (delta=%u omega=%f) "
"samplerate=%u bandwidth=%u samples=%u buffers=%u [%p]%s", "samplerate=%u bandwidth=%u samples=%u buffers=%u [%p]%s",
txFreq,rxFreq,deltaFreq,omega,sampleRate,bw,buf.length(), txFreq,rxFreq,deltaFreq,omega,sampleRate,bw,buf.length(),
nBuffs,m_owner,encloseDashes(t,true)); nBuffs,m_owner,encloseDashes(t,true));
@ -9060,8 +9063,11 @@ unsigned int BrfLibUsbDevice::deviceCheck(String* error)
// Run it // Run it
int dumpRxBeforeRead = p.getIntValue(YSTRING("dump_before_read_rx"),0,0); int dumpRxBeforeRead = p.getIntValue(YSTRING("dump_before_read_rx"),0,0);
int dumpTxBeforeRead = p.getIntValue(YSTRING("dump_before_read_tx"),0,0); int dumpTxBeforeRead = p.getIntValue(YSTRING("dump_before_read_tx"),0,0);
unsigned int allowFail = p.getIntValue(YSTRING("allow_fail"),0,0,nBuffs - 1); unsigned int tmp = nBuffs / 4;
for (unsigned int i = 0; i < nBuffs; i++) { unsigned int limitFailures =
p.getIntValue(YSTRING("sample_limit_allow_fail"),tmp,0,nBuffs - 1);
unsigned int allowFail = p.getIntValue(YSTRING("allow_fail"),tmp,0,nBuffs - 1);
for (int i = 0; i < (int)nBuffs; i++) {
if (dumpRxBeforeRead) { if (dumpRxBeforeRead) {
dumpRxBeforeRead--; dumpRxBeforeRead--;
showBuf(false,1,false); showBuf(false,1,false);
@ -9075,8 +9081,19 @@ unsigned int BrfLibUsbDevice::deviceCheck(String* error)
uint64_t ts = m_syncTxState.m_tx.m_timestamp + m_radioCaps.rxLatency; uint64_t ts = m_syncTxState.m_tx.m_timestamp + m_radioCaps.rxLatency;
BRF_FUNC_CALL_BREAK(capture(false,(float*)buf.data(),buf.length(),ts,&e)); BRF_FUNC_CALL_BREAK(capture(false,(float*)buf.data(),buf.length(),ts,&e));
// Check for out of range values // Check for out of range values
BRF_FUNC_CALL_BREAK(checkSampleLimit((float*)buf.data(),buf.length(), status = checkSampleLimit((float*)buf.data(),buf.length(),limit,&e);
limit,&e)); if (status) {
if (trace)
Output("%-5u [%10s]\tsample invalid (remains=%d): %s",
i,String(ts).c_str(),limitFailures,e.c_str());
if (!limitFailures)
break;
limitFailures--;
i--;
e.clear();
status = 0;
continue;
}
// Apply test pattern (check algorithm) // Apply test pattern (check algorithm)
if (testPattern.length()) if (testPattern.length())
buf.copy(testPattern,testPattern.length()); buf.copy(testPattern,testPattern.length());
@ -9116,18 +9133,18 @@ unsigned int BrfLibUsbDevice::deviceCheck(String* error)
break; break;
} }
allowFail--; allowFail--;
DDebug(m_owner,DebugInfo,"Device check failure %s [%p]",e.safe(),m_owner); DDebug(m_owner,DebugInfo,"Loopback check failure %s [%p]",e.safe(),m_owner);
e.clear(); e.clear();
} }
if (status) if (status)
break; break;
if (trace == 1) if (trace == 1)
Output("Device check succesfully ended"); Output("Loopback check succesfully ended");
// VGA test // VGA test
BRF_FUNC_CALL_BREAK(testVgaCheck(p,"Device check",omega,&e)); BRF_FUNC_CALL_BREAK(testVgaCheck(p,"Loopback check",omega,&e));
break; break;
} }
Debug(m_owner,DebugAll,"Finalizing device check [%p]",m_owner); Debug(m_owner,DebugAll,"Finalizing loopback check [%p]",m_owner);
if (!status) { if (!status) {
calThreadsPause(true); calThreadsPause(true);
status = setState(oldState,&e); status = setState(oldState,&e);
@ -9135,11 +9152,11 @@ unsigned int BrfLibUsbDevice::deviceCheck(String* error)
} }
duration.stop(); duration.stop();
if (status == 0) { if (status == 0) {
Debug(m_owner,DebugNote,"Device check ended duration=%s [%p]", Debug(m_owner,DebugNote,"Loopback check ended duration=%s [%p]",
duration.secStr(),m_owner); duration.secStr(),m_owner);
return 0; return 0;
} }
e.printf(1024,"Device check failed: %s",e.c_str()); e.printf(1024,"Loopback check failed: %s",e.c_str());
return showError(status,e,0,error); return showError(status,e,0,error);
} }