📄 drmplot.cpp
字号:
else
SetQAM16Grid();
/* Set marker symbol */
MarkerSym1.setStyle(QwtSymbol::Ellipse);
MarkerSym1.setSize(4);
MarkerSym1.setPen(QPen(MainPenColorConst));
MarkerSym1.setBrush(QBrush(MainPenColorConst));
}
void CDRMPlot::SetSDCConst(CVector<_COMPLEX>& veccData,
CParameter::ECodScheme eNewCoSc)
{
/* Always set up plot. TODO: only set up plot if constellation
scheme has changed */
InitCharType = SDC_CONSTELLATION;
SetupSDCConst(eNewCoSc);
removeMarkers();
SetData(veccData);
replot();
}
void CDRMPlot::SetupMSCConst(const CParameter::ECodScheme eNewCoSc)
{
/* Init chart for MSC constellation */
setTitle(tr("MSC Constellation"));
enableAxis(QwtPlot::yRight, FALSE);
enableGridX(FALSE);
enableGridY(FALSE);
setAxisTitle(QwtPlot::xBottom, tr("Real"));
enableAxis(QwtPlot::yLeft, TRUE);
setAxisTitle(QwtPlot::yLeft, tr("Imaginary"));
canvas()->setBackgroundMode(QWidget::PaletteBackground);
/* Fixed scale (8 / sqrt(42)) */
setAxisScale(QwtPlot::xBottom, (double) -1.2344, (double) 1.2344);
setAxisScale(QwtPlot::yLeft, (double) -1.2344, (double) 1.2344);
/* Insert grid */
clear();
if (eNewCoSc == CParameter::CS_2_SM)
SetQAM16Grid();
else
SetQAM64Grid();
/* Set marker symbol */
MarkerSym1.setStyle(QwtSymbol::Ellipse);
MarkerSym1.setSize(2);
MarkerSym1.setPen(QPen(MainPenColorConst));
MarkerSym1.setBrush(QBrush(MainPenColorConst));
}
void CDRMPlot::SetMSCConst(CVector<_COMPLEX>& veccData,
CParameter::ECodScheme eNewCoSc)
{
/* Always set up plot. TODO: only set up plot if constellation
scheme has changed */
InitCharType = MSC_CONSTELLATION;
SetupMSCConst(eNewCoSc);
removeMarkers();
SetData(veccData);
replot();
}
void CDRMPlot::SetupAllConst()
{
/* Init chart for constellation */
setTitle(tr("MSC / SDC / FAC Constellation"));
enableAxis(QwtPlot::yRight, FALSE);
enableGridX(TRUE);
enableGridY(TRUE);
setAxisTitle(QwtPlot::xBottom, tr("Real"));
enableAxis(QwtPlot::yLeft, TRUE);
setAxisTitle(QwtPlot::yLeft, tr("Imaginary"));
canvas()->setBackgroundMode(QWidget::PaletteBackground);
/* Fixed scale */
setAxisScale(QwtPlot::xBottom, (double) -1.5, (double) 1.5);
setAxisScale(QwtPlot::yLeft, (double) -1.5, (double) 1.5);
/* Set marker symbols */
/* MSC */
MarkerSym1.setStyle(QwtSymbol::Rect);
MarkerSym1.setSize(2);
MarkerSym1.setPen(QPen(MainPenColorConst));
MarkerSym1.setBrush(QBrush(MainPenColorConst));
/* SDC */
MarkerSym2.setStyle(QwtSymbol::XCross);
MarkerSym2.setSize(4);
MarkerSym2.setPen(QPen(SpecLine1ColorPlot));
MarkerSym2.setBrush(QBrush(SpecLine1ColorPlot));
/* FAC */
MarkerSym3.setStyle(QwtSymbol::Ellipse);
MarkerSym3.setSize(4);
MarkerSym3.setPen(QPen(SpecLine2ColorPlot));
MarkerSym3.setBrush(QBrush(SpecLine2ColorPlot));
/* Insert "dummy" curves for legend */
clear();
curve1 = insertCurve("MSC");
setCurveSymbol(curve1, MarkerSym1);
setCurvePen(curve1, QPen(Qt::NoPen));
enableLegend(TRUE, curve1);
curve2 = insertCurve("SDC");
setCurveSymbol(curve2, MarkerSym2);
setCurvePen(curve2, QPen(Qt::NoPen));
enableLegend(TRUE, curve2);
curve3 = insertCurve("FAC");
setCurveSymbol(curve3, MarkerSym3);
setCurvePen(curve3, QPen(Qt::NoPen));
enableLegend(TRUE, curve3);
}
void CDRMPlot::SetAllConst(CVector<_COMPLEX>& veccMSC,
CVector<_COMPLEX>& veccSDC,
CVector<_COMPLEX>& veccFAC)
{
/* First check if plot must be set up */
if (InitCharType != ALL_CONSTELLATION)
{
InitCharType = ALL_CONSTELLATION;
SetupAllConst();
}
removeMarkers();
SetData(veccMSC, veccSDC, veccFAC);
replot();
}
void CDRMPlot::SetQAM4Grid()
{
long curve;
double dXMax[2], dYMax[2];
double dX[2];
/* Set scale style */
QPen ScalePen(MainGridColorPlot, 1, DotLine);
/* Get bounds of scale */
dXMax[0] = axisScale(QwtPlot::xBottom)->lBound();
dXMax[1] = axisScale(QwtPlot::xBottom)->hBound();
dYMax[0] = axisScale(QwtPlot::yLeft)->lBound();
dYMax[1] = axisScale(QwtPlot::yLeft)->hBound();
dX[0] = dX[1] = (double) 0.0;
curve = insertCurve("line");
setCurvePen(curve, ScalePen);
setCurveData(curve, dX, dYMax, 2);
curve = insertCurve("line");
setCurvePen(curve, ScalePen);
setCurveData(curve, dXMax, dX, 2);
}
void CDRMPlot::SetQAM16Grid()
{
long curve;
double dXMax[2], dYMax[2];
double dX[2];
/* Set scale style */
QPen ScalePen(MainGridColorPlot, 1, DotLine);
/* Get bounds of scale */
dXMax[0] = axisScale(QwtPlot::xBottom)->lBound();
dXMax[1] = axisScale(QwtPlot::xBottom)->hBound();
dYMax[0] = axisScale(QwtPlot::yLeft)->lBound();
dYMax[1] = axisScale(QwtPlot::yLeft)->hBound();
dX[0] = dX[1] = (double) 0.0;
curve = insertCurve("line");
setCurvePen(curve, ScalePen);
setCurveData(curve, dX, dYMax, 2);
curve = insertCurve("line");
setCurvePen(curve, ScalePen);
setCurveData(curve, dXMax, dX, 2);
dX[0] = dX[1] = (double) 0.6333;
curve = insertCurve("line");
setCurvePen(curve, ScalePen);
setCurveData(curve, dX, dYMax, 2);
curve = insertCurve("line");
setCurvePen(curve, ScalePen);
setCurveData(curve, dXMax, dX, 2);
dX[0] = dX[1] = (double) -0.6333;
curve = insertCurve("line");
setCurvePen(curve, ScalePen);
setCurveData(curve, dX, dYMax, 2);
curve = insertCurve("line");
setCurvePen(curve, ScalePen);
setCurveData(curve, dXMax, dX, 2);
}
void CDRMPlot::SetQAM64Grid()
{
long curve;
double dXMax[2], dYMax[2];
double dX[2];
/* Set scale style */
QPen ScalePen(MainGridColorPlot, 1, DotLine);
/* Get bounds of scale */
dXMax[0] = axisScale(QwtPlot::xBottom)->lBound();
dXMax[1] = axisScale(QwtPlot::xBottom)->hBound();
dYMax[0] = axisScale(QwtPlot::yLeft)->lBound();
dYMax[1] = axisScale(QwtPlot::yLeft)->hBound();
dX[0] = dX[1] = (double) 0.0;
curve = insertCurve("line");
setCurvePen(curve, ScalePen);
setCurveData(curve, dX, dYMax, 2);
curve = insertCurve("line");
setCurvePen(curve, ScalePen);
setCurveData(curve, dXMax, dX, 2);
dX[0] = dX[1] = (double) 0.3086;
curve = insertCurve("line");
setCurvePen(curve, ScalePen);
setCurveData(curve, dX, dYMax, 2);
curve = insertCurve("line");
setCurvePen(curve, ScalePen);
setCurveData(curve, dXMax, dX, 2);
dX[0] = dX[1] = (double) -0.3086;
curve = insertCurve("line");
setCurvePen(curve, ScalePen);
setCurveData(curve, dX, dYMax, 2);
curve = insertCurve("line");
setCurvePen(curve, ScalePen);
setCurveData(curve, dXMax, dX, 2);
dX[0] = dX[1] = (double) 0.6172;
curve = insertCurve("line");
setCurvePen(curve, ScalePen);
setCurveData(curve, dX, dYMax, 2);
curve = insertCurve("line");
setCurvePen(curve, ScalePen);
setCurveData(curve, dXMax, dX, 2);
dX[0] = dX[1] = (double) -0.6172;
curve = insertCurve("line");
setCurvePen(curve, ScalePen);
setCurveData(curve, dX, dYMax, 2);
curve = insertCurve("line");
setCurvePen(curve, ScalePen);
setCurveData(curve, dXMax, dX, 2);
dX[0] = dX[1] = (double) 0.9258;
curve = insertCurve("line");
setCurvePen(curve, ScalePen);
setCurveData(curve, dX, dYMax, 2);
curve = insertCurve("line");
setCurvePen(curve, ScalePen);
setCurveData(curve, dXMax, dX, 2);
dX[0] = dX[1] = (double) -0.9258;
curve = insertCurve("line");
setCurvePen(curve, ScalePen);
setCurveData(curve, dX, dYMax, 2);
curve = insertCurve("line");
setCurvePen(curve, ScalePen);
setCurveData(curve, dXMax, dX, 2);
}
void CDRMPlot::OnClicked(const QMouseEvent& e)
{
/* Get frequency from current cursor position */
const double dFreq = invTransform(QwtPlot::xBottom, e.x());
/* Send normalized frequency to receiver */
const double dMaxxBottom = axisScale(QwtPlot::xBottom)->hBound();
/* Check if value is valid */
if (dMaxxBottom != (double) 0.0)
{
/* Emit signal containing normalized selected frequency */
emit xAxisValSet(dFreq / dMaxxBottom);
}
}
void CDRMPlot::AddWhatsThisHelpChar(const ECharType NCharType)
{
QString strCurPlotHelp;
switch (NCharType)
{
case AVERAGED_IR:
/* Impulse Response */
strCurPlotHelp =
tr("<b>Impulse Response:</b> This plot shows "
"the estimated Impulse Response (IR) of the channel based on the "
"channel estimation. It is the averaged, Hamming Window weighted "
"Fourier back transformation of the transfer function. The length "
"of PDS estimation and time synchronization tracking is based on "
"this function. The two red dashed vertical lines show the "
"beginning and the end of the guard-interval. The two black dashed "
"vertical lines show the estimated beginning and end of the PDS of "
"the channel (derived from the averaged impulse response "
"estimation). If the \"First Peak\" timing tracking method is "
"chosen, a bound for peak estimation (horizontal dashed red line) "
"is shown. Only peaks above this bound are used for timing "
"estimation.");
break;
case TRANSFERFUNCTION:
/* Transfer Function */
strCurPlotHelp =
tr("<b>Transfer Function / Group Delay:</b> "
"This plot shows the squared magnitude and the group delay of "
"the estimated channel at each sub-carrier.");
break;
case FAC_CONSTELLATION:
case SDC_CONSTELLATION:
case MSC_CONSTELLATION:
case ALL_CONSTELLATION:
/* Constellations */
strCurPlotHelp =
tr("<b>FAC, SDC, MSC:</b> The plots show the "
"constellations of the FAC, SDC and MSC logical channel of the DRM "
"stream. Depending on the current transmitter settings, the SDC "
"and MSC can have 4-QAM, 16-QAM or 64-QAM modulation.");
break;
case POWER_SPEC_DENSITY:
/* Shifted PSD */
strCurPlotHelp =
tr("<b>Shifted PSD:</b> This plot shows the "
"estimated Power Spectrum Density (PSD) of the input signal. The "
"DC frequency (red dashed vertical line) is fixed at 6 kHz. If "
"the frequency offset acquisition was successful, the rectangular "
"DRM spectrum should show up with a center frequency of 6 kHz. "
"This plot represents the frequency synchronized OFDM spectrum. "
"If the frequency synchronization was successful, the useful "
"signal really shows up only inside the actual DRM bandwidth "
"since the side loops have in this case only energy between the "
"samples in the frequency domain. On the sample positions outside "
"the actual DRM spectrum, the DRM signal has zero crossings "
"because of the orthogonality. Therefore this spectrum represents "
"NOT the actual spectrum but the \"idealized\" OFDM spectrum.");
break;
case SNR_SPECTRUM:
/* SNR Spectrum (Weighted MER on MSC Cells) */
strCurPlotHelp =
tr("<b>SNR Spectrum (Weighted MER on MSC Cells):</b> "
"This plot shows the Weighted MER on MSC cells for each carrier "
"separately.");
break;
case INPUTSPECTRUM_NO_AV:
/* Input Spectrum */
strCurPlotHelp =
tr("<b>Input Spectrum:</b> This plot shows the "
"Fast Fourier Transformation (FFT) of the input signal. This plot "
"is active in both modes, analog and digital. There is no "
"averaging applied. The screen shot of the Evaluation Dialog shows "
"the significant shape of a DRM signal (almost rectangular). The "
"dashed vertical line shows the estimated DC frequency. This line "
"is very important for the analog AM demodulation. Each time a "
"new carrier frequency is acquired, the red line shows the "
"selected AM spectrum. If more than one AM spectrums are within "
"the sound card frequency range, the strongest signal is chosen.");
break;
case INPUT_SIG_PSD:
case INPUT_SIG_PSD_ANALOG:
/* Input PSD */
strCurPlotHelp =
tr("<b>Input PSD:</b> This plot shows the "
"estimated power spectral density (PSD) of the input signal. The "
"PSD is estimated by averaging some Hamming Window weighted "
"Fourier transformed blocks of the input signal samples. The "
"dashed vertical line shows the estimated DC frequency.");
break;
case AUDIO_SPECTRUM:
/* Audio Spectrum */
strCurPlotHelp =
tr("<b>Audio Spectrum:</b> This plot shows the "
"averaged audio spectrum of the currently played audio. With this "
"plot the actual audio bandwidth can easily determined. Since a "
"linear scale is used for the frequency axis, most of the energy "
"of the signal is usually concentrated on the far left side of the "
"spectrum.");
break;
case FREQ_SAM_OFFS_HIST:
/* Frequency Offset / Sample Rate Offset History */
strCurPlotHelp =
tr("<b>Frequency Offset / Sample Rate Offset History:"
"</b> The history "
"of the values for frequency offset and sample rate offset "
"estimation is shown. If the frequency offset drift is very small, "
"this is an indication that the analog front end is of high "
"quality.");
break;
case DOPPLER_DELAY_HIST:
/* Doppler / Delay History */
strCurPlotHelp =
tr("<b>Doppler / Delay History:</b> "
"The history of the values for the "
"Doppler and Impulse response length is shown. Large Doppler "
"values might be responsable for audio drop-outs.");
break;
case SNR_AUDIO_HIST:
/* SNR History */
strCurPlotHelp =
tr("<b>SNR History:</b> "
"The history of the values for the "
"SNR and correctly decoded audio blocks is shown. The maximum "
"achievable number of correctly decoded audio blocks per DRM "
"frame is 10 or 5 depending on the audio sample rate (24 kHz "
"or 12 kHz AAC core bandwidth).");
break;
case INP_SPEC_WATERF:
/* Waterfall Display of Input Spectrum */
strCurPlotHelp =
tr("<b>Waterfall Display of Input Spectrum:</b> "
"The input spectrum is displayed as a waterfall type. The "
"different colors represent different levels.");
break;
}
/* Main plot */
QWhatsThis::add(this, strCurPlotHelp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -