我正在通过在 hls 中实现的中值滤波器,可以在https://cas.tudelft.nl/Education/courses/et4351/Median.pdf找到
这可能是一个愚蠢的问题,但我无法理解行缓冲区的第一个元素是如何被填充的。这是代码
void top_median(pix_t in_pix[MAX_HEIGHT][MAX_WIDTH],
pix_t out_pix[MAX_HEIGHT][MAX_WIDTH],
short int height, short int width)
{
#pragma HLS INTERFACE ap_vld register port=width
#pragma HLS INTERFACE ap_vld register port=height
#pragma HLS INTERFACE ap_fifo depth=2 port=out_pix
#pragma HLS INTERFACE ap_fifo depth=2 port=in_pix
short int r, c; //row and col index
pix_t pix, med, window[KMED*KMED], pixel[KMED];
static pix_t line_buffer[KMED][MAX_WIDTH];
#pragma HLS ARRAY_PARTITION variable=line_buffer complete dim=1
L1:for(r = 0; r < height; r++) {
#pragma HLS LOOP_TRIPCOUNT min=600 max=1080 avg=720
L2:for(c = 0; c < width; c++)
{
#pragma HLS LOOP_TRIPCOUNT min=800 max=1920 avg=1280
#pragma HLS PIPELINE II=1
// Line Buffers fill
for(int i = 0; i < KMED-1; i++)
{
line_buffer[i][c] = line_buffer[i+1][c];///<--- This part of the line buffer(How are the initial pixel values stored))
pixel[i] = line_buffer[i][c];
}
pix = in_pix[r][c];
pixel[KMED-1]=line_buffer[KMED-1][c]=pix;
// sliding window
for(int i = 0; i < KMED; i++)
for(int j = 0; j < KMED-1; j++)
window[i*KMED+j] = window[i*KMED+j+1];
for(int i = 0; i < KMED; i++)
window[i*KMED+KMED-1] = pixel[i];
// Median Filter
med = median(window);
if v( (r>=KMED-1)&&(r<height)&&
(c>=KMED-1)&&(c<=width) )
pix = med;
else
pix = 0;
if(r>0 && c>0)
// KKMED == 1 for 3x3 window
// KKMED == 2 for 5x5 window
out_pix[r-KKMED][c-KKMED] = pix;
} // end of L2 loop
} // end of L1 loop
} // end of function
行缓冲区的初始填充是否应该具有不同的逻辑,例如
linebuf[i][c]= in_pix[r][c]
;
如果你有这样的逻辑,我只是不明白这些值是如何存储line_buffer[i][c] = line_buffer[i+1][c];
的 我还看到输入的像素值存储在
pix = in_pix[r][c];
pixel[KMED-1]=line_buffer[KMED-1][c]=pix;
但是这种存储发生在之后
// Line Buffers fill
for(int i = 0; i < KMED-1; i++)
{
line_buffer[i][c] = line_buffer[i+1][c];
pixel[i] = line_buffer[i][c];
}
linebuf 中到底存在什么r=0 and c=0
有人可以帮助我了解这是如何工作的吗?我在理解 vivadohls 中的 2d 卷积示例时遇到了同样的问题。
提前致谢