farScope/1_peakCentering/sourceCode/peakCentering_tb.cpp
jerryzeng bcefbebd6d v0.1
基本版本:所有模块中每个Peak的处理时钟不超过9个clock
2026-10-14 20:28:58 +08:00

414 lines
16 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <fstream>
#include <cstring>
#include <stdio.h>
//#include "ap_utils.h"
#include <iostream>
#include "peakCentering.h"
#include "../../globals/tbGlobals.h"
void save_bmp_2(
const char* filename,
std::vector<Luma_rgnData>& testSamples)
{
FILE* file;
#if defined(__linux__)
file = fopen(filename, "wb");
#else
fopen_s(&file, filename, "wb");
#endif
if (!file) {
printf("闂傚倷娴囧▔鏇㈠窗閹炬剚鐒藉Δ锝呭暙缁<EFBFBD>鍕煏閸繃顥滄い蹇撶埣濮婅櫣鎹勯妸銉︾<EFBFBD>鹃梺鍝勵儏椤兘鐛箛娑欏<EFBFBD>婚柤鎭掑劜濞呫垺绻涢幘鏉戞惛闁稿孩濞婃俊瀵革拷锝庡枛缁狀垶鏌ㄩ悤鍌涘 %s\n", filename);
return;
}
// 闂傚倷娴囧▔鏇㈠窗閹版澘鍑犲┑鐘宠壘缁狀垶鏌i幋锝呅撻柡鍛倐閺岋繝宕掑Ο鐚存嫹閺嶎偓鎷峰杈ㄥ殌鐞氭瑩鐓崶銊р檨闁哄懏鎮傞弻锟犲磼濡尨鎷烽弽顐嫹濮橆剛绉洪柡灞诲姂閹垽宕ㄦ繝鍕磿闂備礁缍婇ˉ鎾诲礂濮楋拷瀵偊骞樼拠鍙夘棟闂侀潧鐗嗗Λ妤咁敂閸撲胶纾奸柣鎰靛墯閸婃劙鏌℃担瑙勫磳鐎殿噮鍓熸俊鍫曞幢濡ゅ﹣绱﹂梻鍌欐祰濞夋洟宕抽敃鍌氱闁跨噦鎷<E599A6>
int bytes_per_row = RGN_DATA_WIN_SIZE * 3; // 婵犳鍣徊鐣屾崲濮楋拷瀵偊骞樼拠鍙夘棟闂侀潧鐗嗗Λ妤咁敂閸洘鈷戦悹鎭掑妼閺嬫垿鏌$<E98F8C>n亶鐓兼鐐茬箻閹粓鎳為妷锔筋仧闂備礁鎼崐鍫曞磹閺嶎偓鎷峰鐐3闂傚倷娴囧▔鏇㈠窗閺団偓锟戒礁顭ㄩ崼鐔锋疅闂佺鐭夋俊鍥╃矓閸洘鐓欏瀣瘎娑撶兒闂傚倷娴囧▔鏇㈠窗閹版澘鍑犲┑鐘宠壘缁狀垶鏌ㄩ悤鍌涘
int padding = (4 - (bytes_per_row % 4)) % 4;
int row_size = bytes_per_row + padding;
int height = testSamples.size();
// 闂傚倷娴囧▔鏇㈠窗閹版澘鍑犲┑鐘宠壘缁狀垳锟界懓瀚伴崑濠傤焽濡ゅ懏鈷戦悹鎭掑妼閺嬫垿鏌$<E98F8C>n亶鐓兼鐐茬箻閹粓鎳為妷锔筋仧濠电偞鎸婚崫搴ㄥ磿閹惰棄违閻庯綆鍠栫粻顖滐拷鐟板閸╁洦绂掗敓锟<E69593>
BMPFileHeader file_header = {
.file_type = 0x4D42, // 'BM'
.file_size = sizeof(BMPFileHeader) + sizeof(BMPInfoHeader) + row_size * height,
.reserved1 = 0,
.reserved2 = 0,
.offset_data = sizeof(BMPFileHeader) + sizeof(BMPInfoHeader)
};
// 闂傚倷娴囧▔鏇㈠窗閹版澘鍑犲┑鐘宠壘缁狀垳锟界懓瀚伴崑濠傤焽濡ゅ懏鈷戦悹鎭掑妼閺嬫垿鏌$<E98F8C>n亶鐓兼鐐茬箻閹粓鎳為妷锔筋仧闂備礁鎼崐鍫曞磹閺嶎偓鎷峰顒傜Ш妤犵偘绶氶、娑橆潩閵夈倗鐭<E58097>
BMPInfoHeader info_header = {
.size = sizeof(BMPInfoHeader),
.width = RGN_DATA_WIN_SIZE,
.height = height, // 闂傚倷娴囧▔鏇㈠窗閹版澘鍑犲┑鐘宠壘缁狀垶鏌i幋锝呅撻柡鍛倐閺岋繝宕掑Ο鐚存嫹閺嶎偓鎷峰顒傜Ш闁哄被鍔戦幃銏ゅ川婵犲嫪绱曢梻浣告贡閸忔﹢藟閹捐桅婵鍩栭悡銉╂煟閺傛寧鍟為柣蹇e櫍閺岀喐顦版惔鈥冲箣闂佽桨鐒﹂幑鍥ь嚕椤掑嫬围闁糕剝顨忔导鎾绘⒒娴h姤纭堕柛鐘冲姍瀵憡绻濆顒傤唵闂佺粯鍨兼慨銈夊疾閹间焦鐓欓柛锔诲幗閻掑潡鏌熷ú璁抽偗妤犵偛绻橀幃婊堟嚍閵夛附顏熼梻鍌欒兌閸嬫挻绔熼崱娑栵拷鍌烆敋閿熶粙鐛箛娑欏<E5A891>婚柤鎭掑劜濞呫垽姊洪崫鍕拷鍫曞磹閺嶎偓鎷峰顒傜Ш闁哄被鍔戦幃銏ゅ川婵犲嫪绱曢梻浣哥秺椤ユ捇宕楀锟藉顐﹀箻鐠囧弶顥濋梺闈涚墕濡顢旈敓锟<E69593>
.planes = 1,
.bit_count = 24,
.compression = 0,
.size_image = (uint32_t)(row_size * height),
.x_pixels_per_meter = 0,
.y_pixels_per_meter = 0,
.colors_used = 0,
.colors_important = 0
};
// 闂備礁鎲¢崝鏍偡閳哄懎鏋侀柟鎹愵嚙濡﹢鏌曢崼婵囶棞妞ゅ繗娉涢…鍧楁嚋閸偄鍞夐梺杞扮劍閹瑰洤顕i鍕ч柛鈩冾殢娴兼捇姊虹拠鈥冲伎闁瑰嚖鎷<E59A96>
fwrite(&file_header, 1, sizeof(BMPFileHeader), file);
fwrite(&info_header, 1, sizeof(BMPInfoHeader), file);
// 闂備礁鎲¢崝鏍偡閳哄懎鏋侀柟鎹愵嚙濡﹢鏌曢崼婵囶棞妞ゅ繐鐖煎铏规崉閵娿儲鐎鹃梺鍝勵儏椤兘鐛箛娑欏<E5A891>婚柤鎭掑劜濞呫垽姊洪崫鍕拷鍫曞磹閺嶎偓鎷峰顒傜Ш闁哄被鍔戦幃銏ゅ川婵犲嫪绱曢梻浣哥秺椤ユ捇宕楀锟藉顐﹀箻鐠囪尙顔夐梺鍛婂灟閸婃绮旈崼鏇熺厵濡炲楠搁崢鎾煛娴h宕岀<E5AE95>殿噮鍓熸俊鍫曞幢濡ゅ﹣绱﹂梻鍌欐祰濞夋洟宕伴幇鏉垮嚑濠电姵鑹剧粻顖炴煟閹达絽袚闁哄懏鎮傞弻鐔访虹拠鎻掔缂備線纭搁崳锝夌嵁韫囨稒鍊婚柤鎭掑劜閺嗐垽姊绘担鑺ョ《闁哥姵鎸鹃崚鎺楀传閵夛箑鍘归梻浣哥仢椤戝懘顢旈崼鏇熲拺閻犳亽鍔屽▍鎰版煙閸戙倖瀚<E58096>
uint8_t padding_bytes[3] = { 0, 0, 0 };
for (int y = height - 1; y >= 0; y--) {
for (int x = 0; x < RGN_DATA_WIN_SIZE; x++) {
uint8_t pixel = (uint8_t)testSamples[y].data[x];
// 闂傚倷娴囧▔鏇㈠窗閹版澘鍑犲┑鐘宠壘缁狀垳绱掔<E7BBB1>n剚娴嘊闂佸搫顦遍崕鎰板礂濞戞碍瀚婚柣鎴炲嚡R濠碉紕鍋戦崐鏍ь渻娴犲鏋侀柟鎹愵嚙濡﹢鏌曢崼婵囶棞妞ゅ骏鎷<E9AA8F>
fputc(pixel, file); // B
fputc(pixel, file); // G
fputc(pixel, file); // R
}
fwrite(padding_bytes, 1, padding, file); // 闂傚倷娴囧▔鏇㈠窗閹版澘鍑犲┑鐘宠壘缁狀垶鏌i幋锝呅撻柡鍛倐閺屻劑鎮ら崒娑橆伓
}
fclose(file);
}
std::vector<Luma_rgnData> readTestFile(
const char* file,
int* winSize)
{
std::ifstream inputFile(file);
int winW = 0;
std::string strLineTxt;
getline(inputFile, strLineTxt);
sscanf(strLineTxt.c_str(), "%x", &winW);
int size = 0;
std::vector<Luma_rgnData> testData;
Luma_rgnData a_line;
while(getline(inputFile, strLineTxt))
{
if (strLineTxt.empty())
continue;
if(size == 0)
{
int winRdx, y, Rid, Flag, PeakRltvRdx;
sscanf(strLineTxt.c_str(), "%04x %04x %04x %01x %02x", &winRdx, &y, &Rid, &Flag, &PeakRltvRdx);
a_line.WinRdx = (uint16_t)winRdx;
a_line.y = (uint16_t)y;
a_line.Rid = (uint16_t)Rid;
a_line.Flag = (uint8_t)Flag;
a_line.PeakRltvRdx = (uint8_t)PeakRltvRdx;
for(int n = 0; n < RGN_DATA_WIN_SIZE; n ++)
a_line.data[n] = 0;
size = 1 ;
}
else //receive Data
{
int data;
sscanf(strLineTxt.c_str(), "%02x", &data);
a_line.data[size -1] = (uint8_t)data;
if(size >= 16)
{
testData.push_back(a_line);
size = 0;
}
else
size ++;
}
}
inputFile.close();
return testData;
}
void genTestSream(
std::vector<Luma_rgnData>& srcData,
hls::stream<RgnPix>& inStream,
int LRflag, //0-left image; 1-right image
const Luma_frameInfo frameInfo)
{
RgnPix VSync = {0,0,0,0,0,0,0};
ap_uint<32> data_32;
//1st:FrmNo
data_32 = frameInfo.FrmNo;
VSync.Sync = 0b10;
VSync.LazerWinX(CAM4K_Y_WIDTH-1,0) = data_32.range(CAM4K_Y_WIDTH-1,0);
VSync.LazerWinY(CAM4K_Y_WIDTH-1,0) = data_32.range(CAM4K_Y_WIDTH*2-1,CAM4K_Y_WIDTH);
VSync.LazerWinRid(CAM4K_Y_RSV_BITS*2-1,0) = data_32.range(31,CAM4K_Y_WIDTH*2);
VSync.LazerWinRid(10,CAM4K_Y_RSV_BITS*2) = 0;
inStream.write(VSync);
//2nd:FrmNo
data_32 = frameInfo.TimeStamp;
VSync.Sync = 0b00;
VSync.LazerWinX(CAM4K_Y_WIDTH-1,0) = data_32.range(CAM4K_Y_WIDTH-1,0);
VSync.LazerWinY(CAM4K_Y_WIDTH-1,0) = data_32.range(CAM4K_Y_WIDTH*2-1,CAM4K_Y_WIDTH);
VSync.LazerWinRid(CAM4K_Y_RSV_BITS*2-1,0) = data_32.range(31,CAM4K_Y_WIDTH*2);
VSync.LazerWinRid(10,CAM4K_Y_RSV_BITS*2) = 0;
inStream.write(VSync);
//3rd:encInfo
data_32 = frameInfo.encInfo;
VSync.Sync = 0b00;
VSync.LazerWinX(CAM4K_Y_WIDTH-1,0) = data_32.range(CAM4K_Y_WIDTH-1,0);
VSync.LazerWinY(CAM4K_Y_WIDTH-1,0) = data_32.range(CAM4K_Y_WIDTH*2-1,CAM4K_Y_WIDTH);
VSync.LazerWinRid(CAM4K_Y_RSV_BITS*2-1,0) = data_32.range(31,CAM4K_Y_WIDTH*2);
VSync.LazerWinRid(10,CAM4K_Y_RSV_BITS*2) = 0;
inStream.write(VSync);
//4th:frmW(12bit), frmH(12bit)
ap_uint<16> data16_1, data16_2;
data16_1 = frameInfo.W;
data16_2 = frameInfo.H;
VSync.Sync = 0b00;
VSync.LazerWinX(CAM4K_Y_WIDTH-1,0) = data16_1.range(CAM4K_Y_WIDTH-1,0);
VSync.LazerWinY(CAM4K_Y_WIDTH-1,0) = data16_2.range(CAM4K_Y_WIDTH-1,0);
VSync.LazerWinRid(10,0) = 0;
inStream.write(VSync);
//5th: frmX, WinNum
int winNum = (int)srcData.size();
if(LRflag == 0)
data16_1 = frameInfo.left_L;
else
data16_1 = frameInfo.right_L;
data16_2 = (uint16_t)winNum;
VSync.Sync = 0b00;
VSync.LazerWinX(CAM4K_Y_WIDTH-1,0) = data16_1.range(CAM4K_Y_WIDTH-1,0);
VSync.LazerWinY(CAM4K_Y_WIDTH-1,0) = data16_2.range(CAM4K_Y_WIDTH-1,0);
inStream.write(VSync);
//6th: frmY
if(LRflag == 0)
data16_1 = frameInfo.left_T;
else
data16_1 = frameInfo.right_T;
VSync.Sync = 0b00;
VSync.LazerWinX(CAM4K_Y_WIDTH-1,0) = data16_1.range(CAM4K_Y_WIDTH-1,0);
VSync.LazerWinY(CAM4K_Y_WIDTH-1,0) = 0;
inStream.write(VSync);
//output data
for(int i = 0; i < winNum; i ++)
{
Luma_rgnData* a_line = &srcData[i];
RgnPix Hsync;
Hsync.LazerWinX = (ap_uint<CAM4K_Y_WIDTH>)a_line->WinRdx;
Hsync.LazerWinY = (ap_uint<CAM4K_Y_WIDTH>)a_line->y;
Hsync.LazerWinRid = (ap_uint<11>)a_line->Rid;
Hsync.LazerWinFlag = (ap_uint<4>)a_line->Flag;
Hsync.LazerWinRsv = 0;
Hsync.RltvRdx = (ap_uint<8>)a_line->PeakRltvRdx;
Hsync.Sync = 0b01;
inStream.write(Hsync);
for(int j = 0; j < RGN_DATA_WIN_SIZE/2; j ++)
{
RgnPix a_data = {0,0,0,0,0,0,0};
ap_uint<8> data8_1, data8_2;
data8_1 = (ap_uint<8>)a_line->data[j * 2];
data8_2 = (ap_uint<8>)a_line->data[j * 2 + 1];
a_data.LazerWinX(7,0) = data8_1.range(7,0);
a_data.LazerWinX(CAM4K_Y_WIDTH-1, 8) = 0;
a_data.LazerWinY(7,0) = data8_2.range(7,0);
a_data.LazerWinY(CAM4K_Y_WIDTH-1, 8) = 0;
a_data.Sync = 0b00;
inStream.write(a_data);
}
}
//add Last sync data
VSync.LazerWinFlag = 0;
VSync.LazerWinRid = 0;
VSync.LazerWinRsv = 0;
VSync.LazerWinX = 0;
VSync.LazerWinY = 0;
VSync.RltvRdx = 0;
VSync.Sync = 0b11;
inStream.write(VSync);
return;
}
void convertStreamToArray(
hls::stream<RgnPix>& streamData,
std::vector<Luma_rgnData>& arrayData,
uint32_t* FrmNo,
uint32_t* timeStamp,
uint32_t* encInfo,
uint16_t* frameROI_w,
uint16_t* frameROI_h,
uint16_t* frameROI_x,
uint16_t* frameROI_y)
{
//1st:FrmNo
RgnPix VSync = streamData.read();
ap_uint<32> data_32;
data_32(CAM4K_Y_WIDTH-1,0) = VSync.LazerWinX.range(CAM4K_Y_WIDTH-1,0);
data_32(CAM4K_Y_WIDTH*2-1, CAM4K_Y_WIDTH) = VSync.LazerWinY.range(CAM4K_Y_WIDTH-1,0);
data_32(31,CAM4K_Y_WIDTH*2) = VSync.LazerWinRid.range(CAM4K_Y_RSV_BITS*2-1,0);
*FrmNo = (int)data_32;
//2nd:timeStamp
VSync = streamData.read();
data_32(CAM4K_Y_WIDTH-1,0) = VSync.LazerWinX.range(CAM4K_Y_WIDTH-1,0);
data_32(CAM4K_Y_WIDTH*2-1, CAM4K_Y_WIDTH) = VSync.LazerWinY.range(CAM4K_Y_WIDTH-1,0);
data_32(31,CAM4K_Y_WIDTH*2) = VSync.LazerWinRid.range(CAM4K_Y_RSV_BITS*2-1,0);
*timeStamp = (int)data_32;
//3rd:encInfo
VSync = streamData.read();
data_32(CAM4K_Y_WIDTH-1,0) = VSync.LazerWinX.range(CAM4K_Y_WIDTH-1,0);
data_32(CAM4K_Y_WIDTH*2-1, CAM4K_Y_WIDTH) = VSync.LazerWinY.range(CAM4K_Y_WIDTH-1,0);
data_32(31,CAM4K_Y_WIDTH*2) = VSync.LazerWinRid.range(CAM4K_Y_RSV_BITS*2-1,0);
*encInfo = (int)data_32;
//4th:frmW(12bit), frmH(12bit)
VSync = streamData.read();
ap_uint<16> data16_1, data16_2;
data16_1(CAM4K_Y_WIDTH-1,0) = VSync.LazerWinX.range(CAM4K_Y_WIDTH-1,0);
data16_1(15, CAM4K_Y_WIDTH) = 0;
data16_2(CAM4K_Y_WIDTH-1,0) = VSync.LazerWinY.range(CAM4K_Y_WIDTH-1,0);
data16_2(15, CAM4K_Y_WIDTH) = 0;
*frameROI_w = data16_1;
*frameROI_h = data16_2;
//5th: frmX, WinNum
VSync = streamData.read();
data16_1(CAM4K_Y_WIDTH-1,0) = VSync.LazerWinX.range(CAM4K_Y_WIDTH-1,0);
data16_1(15, CAM4K_Y_WIDTH) = 0;
data16_2(CAM4K_Y_WIDTH-1,0) = VSync.LazerWinY.range(CAM4K_Y_WIDTH-1,0);
data16_2(15, CAM4K_Y_WIDTH) = 0;
*frameROI_x = data16_1;
uint16_t winNum = (uint16_t)data16_2;
//6th: frmY
VSync = streamData.read();
data16_1(CAM4K_Y_WIDTH-1,0) = VSync.LazerWinX.range(CAM4K_Y_WIDTH-1,0);
data16_1(15, CAM4K_Y_WIDTH) = 0;
*frameROI_y = data16_1;
//output data
for(int i = 0; i <= winNum; i ++)
{
RgnPix Hsync = streamData.read();
if(Hsync.Sync == 0b11)
break;
else if(Hsync.Sync != 0b01)
continue;
Luma_rgnData a_line;
a_line.WinRdx = (uint16_t)Hsync.LazerWinX;
a_line.y = (uint16_t)Hsync.LazerWinY;
if(a_line.y >= 1963)
int kkk = 1; //debug point
a_line.Rid = (uint16_t)Hsync.LazerWinRid;
a_line.Flag = (uint8_t)Hsync.LazerWinFlag;
a_line.PeakRltvRdx = (uint8_t)Hsync.RltvRdx;
for(int j = 0; j < RGN_DATA_WIN_SIZE/2; j ++)
{
RgnPix a_data = streamData.read();
ap_uint<8> data8_1, data8_2;
data8_1(7,0) = a_data.LazerWinX.range(7,0);
data8_2(7,0) = a_data.LazerWinY.range(7,0);
a_line.data[j * 2] = (uint8_t)data8_1;
a_line.data[j * 2 + 1] = (uint8_t)data8_2;
}
arrayData.push_back(a_line);
}
return;
}
void writepeakCenteringData(
const char* fileName,
std::vector<Luma_rgnData>& outData)
{
std::ofstream sw(fileName);
char str[250];
#if defined(__linux__)
sprintf(str, "0x10");
#else
sprintf_s(str, "0x10");
#endif
sw << str << std::endl;
int i_max = outData.size();
for (int i = 0; i < i_max; i++)
{
char data[250];
#if defined(__linux__)
sprintf(data, "%04x %04x %04x %01x %02x",
outData[i].WinRdx, outData[i].y, outData[i].Rid, outData[i].Flag, outData[i].PeakRltvRdx);
#else
sprintf_s(data, "%04x %04x %04x %01x %02x",
outData[i].WinRdx, outData[i].y, outData[i].Rid, outData[i].Flag, outData[i].PeakRltvRdx);
#endif
sw << data << std::endl;
for (int j = 0; j < RGN_DATA_WIN_SIZE; j++)
{
#if defined(__linux__)
sprintf(data, "%02x", outData[i].data[j]);
#else
sprintf_s(data, "%02x", outData[i].data[j]);
#endif
sw << data << std::endl;
}
}
sw.close();
}
int main()
{
setvbuf(stdout, NULL, _IONBF, 0); // _IONBF = 无缓冲,立即输出
TbModule currModule = TB_1_peakCentering;
for(int n = 0; n < tb_group_count; n ++)
{
int winSize = 0;
int fileStart = tb_groups[n].start_id;
int fileEnd = tb_groups[n].end_id;
for(int fi = fileStart; fi <= fileEnd; fi++)
{
TbPaths test_path_L;
int rcode_L = tb_get_paths(currModule, n,fi, 0, &test_path_L);
TbPaths test_path_R;
int rcode_R = tb_get_paths(currModule, n,fi, 1, &test_path_R);
Luma_frameInfo framwInfo = readParaFile(test_path_L.paras, fi);
std::vector<Luma_rgnData> testData_L = readTestFile(test_path_L.input, &winSize);
std::vector<Luma_rgnData> testData_R = readTestFile(test_path_R.input, &winSize);
//gen test stream
hls::stream<RgnPix> inStream_L;
genTestSream(testData_L, inStream_L, 0, framwInfo);
hls::stream<RgnPix> inStream_R;
genTestSream(testData_R, inStream_R, 1, framwInfo);
//peakCentering
hls::stream<RgnPix> outStream_L;
peakCentering(inStream_L,outStream_L);
hls::stream<RgnPix> outStream_R;
peakCentering(inStream_R,outStream_R);
//output
std::vector<Luma_rgnData> outData_L;
uint32_t outFrmNo_L, outTimeStamp_L, outEncInfo_L;
uint16_t outROI_w_L,outROI_h_L, outROI_x_L,outROI_y_L;
convertStreamToArray(
outStream_L,
outData_L,
&outFrmNo_L,
&outTimeStamp_L,
&outEncInfo_L,
&outROI_w_L,
&outROI_h_L,
&outROI_x_L,
&outROI_y_L);
writepeakCenteringData(test_path_L.output, outData_L);
//right
std::vector<Luma_rgnData> outData_R;
uint32_t outFrmNo_R, outTimeStamp_R, outEncInfo_R;
uint16_t outROI_w_R,outROI_h_R, outROI_x_R,outROI_y_R;
convertStreamToArray(
outStream_R,
outData_R,
&outFrmNo_R,
&outTimeStamp_R,
&outEncInfo_R,
&outROI_w_R,
&outROI_h_R,
&outROI_x_R,
&outROI_y_R);
writepeakCenteringData(test_path_R.output, outData_R);
printf("%s ... done\n", test_path_L.input);
}
}
printf("done!\n");
}