Browse Source

Scan Conversion calculation and image added.

Arash Aletayeb 10 months ago
parent
commit
6dbb042b48
  1. 2
      developHw.pro
  2. 2
      developHw.pro.user
  3. 79
      hdf5Scenario/hdf5Scenario.cpp
  4. 2
      hdf5Scenario/hdf5Scenario.h
  5. 31
      kernelParams/KernelParams.cpp
  6. 35
      kernelParams/KernelParams.h
  7. 81
      mainwindow.cpp
  8. 9
      mainwindow.h
  9. 59
      mainwindow.ui

2
developHw.pro

@ -36,7 +36,7 @@ HEADERS += \
INCLUDEPATH += \
"$$PWD/include" \
"/usr/lib/x86_64-linux-gnu/hdf5/serial/include" \
"/usr/include/hdf5/serial"
# "/usr/include/hdf5/serial"
FORMS += \
mainwindow.ui

2
developHw.pro.user

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.10.0, 2024-04-17T14:43:41. -->
<!-- Written by QtCreator 4.10.0, 2024-04-23T15:35:59. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>

79
hdf5Scenario/hdf5Scenario.cpp

@ -1064,3 +1064,82 @@ QVector<float> Hdf5::lineFilterRead()
return lineFilter;
}
void Hdf5::scanConversionParamsRead(scanConversionParameters &params)
{
/*** /swScenarioParameters/scanConversionParameters/rxLineDAz ***/
datasetBranch<float_t>("/swScenarioParameters/scanConversionParameters/rxLineDAz", floatArray);
params.dx = (floatArray[0]);
/*** /swScenarioParameters/scanConversionParameters/rxPointDAx ***/
datasetBranch<float_t>("/swScenarioParameters/scanConversionParameters/rxPointDAx", floatArray);
params.dz = (floatArray[0]);
/*** /swScenarioParameters/scanConversionParameters/rxLineNo ***/
datasetBranch<float_t>("/swScenarioParameters/scanConversionParameters/rxLineNo", floatArray);
params.gridX_size = static_cast<quint32>(floatArray[0]);
/*** /swScenarioParameters/scanConversionParameters/rxFocusPointNo ***/
datasetBranch<float_t>("/swScenarioParameters/scanConversionParameters/rxFocusPointNo", floatArray);
params.gridZ_size = static_cast<quint32>(floatArray[0]);
/*** /swScenarioParameters/scanConversionParameters/scanAz ***/
datasetBranch<float_t>("/swScenarioParameters/scanConversionParameters/scanAz", floatArray);
QList<float> gridX;
for(quint32 j = 0; j < params.gridX_size; j++)
{
gridX.push_back(floatArray[j]);
}
params.gridX = gridX;
/*** /swScenarioParameters/scanConversionParameters/scanAx ***/
datasetBranch<float_t>("/swScenarioParameters/scanConversionParameters/scanAx", floatArray);
QList<float> gridZ;
for(quint32 j = 0; j < params.gridZ_size; j++)
{
gridZ.push_back(floatArray[j]);
}
params.gridZ = gridZ;
/*** /swScenarioParameters/scanConversionParameters/pixelParameters/pixelZNo ***/
datasetBranch<float_t>("/swScenarioParameters/scanConversionParameters/pixelParameters/pixelZNo", floatArray);
quint32 queryRow = static_cast<quint32>(floatArray[0]);
params.pixelZNo = queryRow;
/*** /swScenarioParameters/scanConversionParameters/pixelParameters/pixelXNo ***/
datasetBranch<float_t>("/swScenarioParameters/scanConversionParameters/pixelParameters/pixelXNo", floatArray);
quint32 queryColumn = static_cast<quint32>(floatArray[0]);
params.pixelXNo = queryColumn;
/*** /swScenarioParameters/scanConversionParameters/gridPixelAz ***/
datasetBranch<float_t>("/swScenarioParameters/scanConversionParameters/gridPixelAz", floatArray);
QList<QList<float> > queryX;
for(quint32 i = 0; i < queryColumn; i++)
{
QList<float> temp;
for(quint32 j = 0; j < queryRow; j++)
{
temp.push_back(floatArray[j + i * queryRow]);
}
queryX.push_back(temp);
}
params.queryX = queryX;
/*** /swScenarioParameters/scanConversionParameters/gridPixelAx ***/
datasetBranch<float_t>("/swScenarioParameters/scanConversionParameters/gridPixelAx", floatArray);
QList<QList<float> > queryZ;
for(quint32 i = 0; i < queryColumn; i++)
{
QList<float> temp;
for(quint32 j = 0; j < queryRow; j++)
{
temp.push_back(floatArray[j + i * queryRow]);
}
queryZ.push_back(temp);
}
params.queryZ = queryZ;
}

2
hdf5Scenario/hdf5Scenario.h

@ -5,6 +5,7 @@
#include "hdf5.h"
#include "H5File.h"
#include "model/hardware/core/lowLevelApi/TrxBoard.h"
#include "../kernelParams/KernelParams.h"
#define MAX_ARRAY_DEPTH 131072U
@ -30,6 +31,7 @@ public:
QVector<quint32> stbRead (void);
QVector<float> lineFilterRead (void);
void scanConversionParamsRead(scanConversionParameters &params);
};
#endif // HDF5SCENARIO_H

31
kernelParams/KernelParams.cpp

@ -39,3 +39,34 @@ float DynamicContrast(float input, DynamicContrastParameters &params)
return output;
}
QPair<qint32, qint32> readScanConversionIndex(float x, float z, scanConversionParameters &params)
{
QPair<qint32, qint32> index;
if(abs(x - params.gridX.at(static_cast<qint32>(params.gridX_size - 1))) < EPSILSON)
{
index.first = static_cast<qint32>(params.gridX_size - 2);
}
else
{
index.first = static_cast<qint32>(floorf((x - params.gridX.at(0)) / params.dx));
}
if(abs(z - params.gridZ.at(static_cast<qint32>(params.gridZ_size - 1))) < EPSILSON)
{
index.second = static_cast<qint32>(params.gridZ_size - 2);
}
else
{
index.second = static_cast<qint32>(floorf((z - params.gridZ.at(0)) / params.dz));
}
return index;
}
float scanConversionFmaCalc(scanConversionMatrix &field)
{
return (fmaf(field.c11, (fmaf(field.a11, field.b11, (field.a12 * field.b21))), \
(field.c12 * (fmaf(field.a11, field.b12, (field.a12 * field.b22))))) / (field.dx * field.dz));
}

35
kernelParams/KernelParams.h

@ -5,6 +5,7 @@
#include <QDebug>
#include <QByteArray>
#include <QList>
#include <math.h>
#define ARRAY_SIZE(X) X.length()
#define DYN_CNTR_CONST_PIECE_NO 256U
@ -18,6 +19,8 @@
#define GAIN_DEFAULT 4
#define CONTRAST_NUM_DEFAULT 1U
#define EPSILSON 1.401298E-45f
struct DynamicContrastParameters
{
float gain;
@ -30,8 +33,40 @@ struct DynamicContrastParameters
float app_max_log_input_level;
};
struct scanConversionParameters
{
quint32 pixelXNo;
quint32 pixelZNo;
quint32 gridX_size;
quint32 gridZ_size;
float dx;
float dz;
QList<float> gridX;
QList<float> gridZ;
QList<QList<float>> queryX;
QList<QList<float>> queryZ;
};
struct scanConversionMatrix
{
float a11;
float a12;
float b11;
float b12;
float b21;
float b22;
float c11;
float c12;
float dx;
float dz;
};
float linear_interpolate (float output, QList<float> x, QList<float> y, quint32 num);
float DynamicContrast(float input, DynamicContrastParameters &params);
QPair<qint32, qint32> readScanConversionIndex(float x, float z, scanConversionParameters &params);
float scanConversionFmaCalc(scanConversionMatrix &field);
#endif // KERNELPARAMS_H

81
mainwindow.cpp

@ -205,7 +205,8 @@ MainWindow::MainWindow(QWidget* parent)
_firstFrameEn = false;
_discardTempTest = false;
_discardAdcLog = false;
_isDynamicContrast = false;
_isScanConvDynamicCont = false;
_isScanConversionScenario = false;
_programFlag = true;
_frameCount = 0;
@ -1574,7 +1575,7 @@ void MainWindow::on_btn_dynConSetParams_clicked()
/*************************************************************************************************/
void MainWindow::on_chk_dynamicContrast_clicked(bool checked)
{
_isDynamicContrast = checked;
_isScanConvDynamicCont = checked;
}
/*************************************************************************************************/
@ -1604,6 +1605,12 @@ void MainWindow::readDynamicContrastParameters(DynamicContrastParameters& params
params.const_piecewise_x = piecewise_x;
}
/*************************************************************************************************/
void MainWindow::on_checkBox_clicked(bool checked)
{
_isScanConversionScenario = checked;
}
/*************************************************************************************************/
/*********************************************DMA*************************************************/
/*************************************************************************************************/
@ -2143,6 +2150,15 @@ void MainWindow::on_btn_dmaShow_clicked()
}while (_dmaShow);
}
/*************************************************************************************************/
quint32 MainWindow::frameDataCalc(QByteArray frame, qint32 index)
{
return (( static_cast<quint32>(frame[index])) & 0x000000FF) |
(((static_cast<quint32>(frame[index + 1])) << 8) & 0x0000FF00) |
(((static_cast<quint32>(frame[index + 2])) << 16) & 0x00FF0000) |
(((static_cast<quint32>(frame[index + 3])) << 24) & 0xFF000000);
}
/*************************************************************************************************/
void MainWindow::show3d()
{
@ -2245,19 +2261,61 @@ void MainWindow::show3d()
for(auto pnt = 0; pnt < (point + 1); pnt += 1)
{
indx = (ln * point + pnt) * 4 + 160;
auto val = ((static_cast<quint32>(plotPacket[indx])) & 0x000000FF) |
(((static_cast<quint32>(plotPacket[indx + 1])) << 8) & 0x0000FF00) |
(((static_cast<quint32>(plotPacket[indx + 2])) << 16) & 0x00FF0000) |
(((static_cast<quint32>(plotPacket[indx + 3])) << 24) & 0xFF000000);
auto val = frameDataCalc(plotPacket, indx);
if(max < val)
{
max = val;
}
if(_isDynamicContrast)
if(_isScanConvDynamicCont)
{
val = static_cast<quint32>(DynamicContrast(val, dynamicContrastParams));
float pixel = 0.0f;
float queryX = 0.0f;
float queryZ = 0.0f;
if(static_cast<quint32>(pnt) < scanConversionParams.pixelZNo &&
static_cast<quint32>(ln) < scanConversionParams.pixelXNo)
{
queryX = scanConversionParams.queryX.at(ln).at(pnt);
queryZ = scanConversionParams.queryZ.at(ln).at(pnt);
}
QPair<qint32, qint32> index = readScanConversionIndex(queryX, queryZ, scanConversionParams);
qint32 gridX_index = index.first;
qint32 gridZ_index = index.second;
if(gridX_index >= 0 && (gridX_index) < static_cast<qint32>(scanConversionParams.gridX_size - 1) &&
gridZ_index >= 0 && (gridZ_index) < static_cast<qint32>(scanConversionParams.gridZ_size - 1))
{
matrix.a11 = scanConversionParams.gridZ.at(gridZ_index + 1) - queryZ;
matrix.a12 = queryZ - scanConversionParams.gridZ.at(gridZ_index);
matrix.c11 = scanConversionParams.gridX.at(gridX_index + 1) - queryX;
matrix.c12 = queryX - scanConversionParams.gridX.at(gridX_index);
matrix.dx = scanConversionParams.dx;
matrix.dz = scanConversionParams.dz;
auto scanConIndex = (gridX_index * point + gridZ_index) * 4 + 160;
auto scanConValue = frameDataCalc(plotPacket, scanConIndex);
matrix.b11 = scanConValue;
scanConIndex = ((gridX_index + 1) * point + gridZ_index) * 4 + 160;
scanConValue = frameDataCalc(plotPacket, scanConIndex);
matrix.b12 = scanConValue;
scanConIndex = (gridX_index * point + (gridZ_index + 1)) * 4 + 160;
scanConValue = frameDataCalc(plotPacket, scanConIndex);
matrix.b21 = scanConValue;
scanConIndex = ((gridX_index + 1) * point + (gridZ_index + 1)) * 4 + 160;
scanConValue = frameDataCalc(plotPacket, scanConIndex);
matrix.b22 = scanConValue;
pixel = scanConversionFmaCalc(matrix);
pixel = DynamicContrast(pixel, dynamicContrastParams);
}
val = static_cast<quint32>(pixel);
}
if(pnt == point)
@ -2284,7 +2342,7 @@ void MainWindow::show3d()
ui->plot_2->axisRect()->setMarginGroup(QCP::msBottom | QCP::msTop, marginGroup);
colorScale->setMarginGroup(QCP::msBottom | QCP::msTop, marginGroup);
}
if(_isDynamicContrast)
if(_isScanConvDynamicCont)
{
_colorMap->setGradient((QCPColorGradient::gpGrayscale));
}
@ -2901,6 +2959,11 @@ void MainWindow::setScenario(const QString& h5Path)
_trx.setProbeDependParams(prbDepParams);
//_trx.setLineFilterCoefficient(lineFilterLut);
_trx.setStbCoefficient(stbLut);
if(_isScanConversionScenario)
{
hdf.scanConversionParamsRead(scanConversionParams);
}
}
catch(SonoException& e)
{

9
mainwindow.h

@ -246,6 +246,8 @@ private:
void dynamicContrastCsvRead(const QString &path);
quint32 frameDataCalc(QByteArray frame, qint32 index);
QString _fpgaProgramFolder = "/home/hasis/Desktop/hardware/hwCode";
QString _mcsProgramFolder = "/home/hasis/Desktop/hardware/hwCode";
QString _mcsVerifyFolder = "/home/hasis/Desktop/hardware/hwCode";
@ -291,9 +293,12 @@ private:
bool _programFlag;
bool _discardTempTest;
bool _discardAdcLog;
bool _isDynamicContrast;
bool _isScanConvDynamicCont;
bool _isScanConversionScenario;
DynamicContrastParameters dynamicContrastParams;
scanConversionParameters scanConversionParams;
scanConversionMatrix matrix;
QList<QList <float>> dynamicTotalData;
// uncrustify off
@ -577,6 +582,8 @@ private slots:
void on_chk_dynamicContrast_clicked(bool checked);
void on_checkBox_clicked(bool checked);
signals:
void showMessage(QString message);
void threeDReady();

59
mainwindow.ui

@ -42,7 +42,7 @@
<string/>
</property>
<property name="currentIndex">
<number>2</number>
<number>1</number>
</property>
<widget class="QWidget" name="tab_0">
<attribute name="title">
@ -1635,6 +1635,49 @@
</item>
</layout>
</widget>
<widget class="QWidget" name="verticalLayoutWidget_37">
<property name="geometry">
<rect>
<x>690</x>
<y>130</y>
<width>101</width>
<height>51</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_9">
<property name="sizeConstraint">
<enum>QLayout::SetFixedSize</enum>
</property>
<item>
<widget class="QCheckBox" name="checkBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>90</width>
<height>45</height>
</size>
</property>
<property name="font">
<font>
<pointsize>9</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Scan
Conversion
Scenarios</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</widget>
<widget class="QWidget" name="tab_2">
@ -1673,7 +1716,7 @@
<x>520</x>
<y>20</y>
<width>241</width>
<height>331</height>
<height>341</height>
</rect>
</property>
<property name="title">
@ -1827,8 +1870,13 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Set Parameters</string>
<string>Set Dynamic Contrast Params</string>
</property>
</widget>
</item>
@ -1882,11 +1930,12 @@
<x>50</x>
<y>290</y>
<width>181</width>
<height>23</height>
<height>41</height>
</rect>
</property>
<property name="text">
<string>Dynamic Contrast</string>
<string>Scan Conversion
Dynamic Contrast</string>
</property>
</widget>
</widget>

Loading…
Cancel
Save