8.6 First_value和Last_value

本文主要介绍First_value和Last_value这两个窗口函数的使用方法及其应用场景,帮助读者更好地理解如何在SQL查询中利用这些函数来处理复杂的数据逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

8.6 First_value和Last_value正在更新内容。请稍后

转载于:https://www.cnblogs.com/yutingliuyl/p/7064344.html

优化一下这段代码,减少LUT的使用,并且减少for循环的出现,点数平滑可设置:void SmoothProfileOnXAxisMean(hls::stream& points_in_z, hls::stream& smoothed_z, ap_uint<6> mean_win_size, float invalid_z ) { // #pragma HLS DATAFLOW #pragma HLS INTERFACE axis port=points_in_z #pragma HLS INTERFACE axis port=smoothed_z #pragma HLS INTERFACE ap_none port=mean_win_size #pragma HLS INTERFACE ap_none port=invalid_z #pragma HLS INTERFACE ap_ctrl_none port=return float result = 0.0f; float mean_registers [33]; #pragma HLS ARRAY_PARTITION dim=1 type=complete variable=mean_registers // 上一周期window size static ap_uint<6> last_mean_win_size = 0; // 新周期刷新window size if (mean_win_size != last_mean_win_size) { last_mean_win_size = mean_win_size; } // 使用稳定window size ap_uint<6> stable_mean_win_size = 0; stable_mean_win_size = last_mean_win_size; int half_window = stable_mean_win_size / 2; // 初始化寄存器 for (int i = 0; i < 33; i++) { #pragma HLS UNROLL mean_registers[i] = 0.0f; } // 主循环 for (int i = 0; i < 3200 + half_window; i++) { #pragma HLS PIPELINE II=1 bool data_available = (i < 3200); // 数据读使能 float new_value = 0.0f; ap_uint<8> gray_new_value = 0; // 接收数据流 if (data_available) { new_value = points_in_z.read(); } // 数据移位寄存 for (int j = 32; j > 0; j--) { mean_registers[j] = mean_registers[j - 1]; } mean_registers[0] = data_available ? new_value : mean_registers[0]; // 如果窗口中心点是无效值,则直接输出无效值 if (mean_registers[half_window] == invalid_z) { smoothed_z.write(invalid_z); continue; } // 边界处直接输出源值 if (((i >= half_window) && (i < stable_mean_win_size - 1)) || (i >= 3200)) { smoothed_z.write(mean_registers[half_window]); continue; } // 窗口填满后开始滤波处理 else if ((i >= stable_mean_win_size - 1) && (i <= 3200)) { float sum = 0.0f; int valid_count = 0; if (stable_mean_win_size == 1) { for (int k = 0; k < 1; k++) { if (mean_registers[k] != invalid_z) { sum += mean_registers[k]; valid_count++; } } } if (stable_mean_win_size == 3) { for (int k = 0; k < 3; k++) { if (mean_registers[k] != invalid_z) { sum += mean_registers[k]; valid_count++; } } } if (stable_mean_win_size == 5) { for (int k = 0; k < 5; k++) { if (mean_registers[k] != invalid_z) { sum += mean_registers[k]; valid_count++; } } } else if (stable_mean_win_size == 9) { for (int k = 0; k < 9; k++) { if (mean_registers[k] != invalid_z) { sum += mean_registers[k]; valid_count++; } } } else if (stable_mean_win_size == 17) { for (int k = 0; k < 17; k++) { if (mean_registers[k] != invalid_z) { sum += mean_registers[k]; valid_count++; } } } else if (stable_mean_win_size == 33) { for (int k = 0; k < 33; k++) { if (mean_registers[k] != invalid_z) { sum += mean_registers[k]; valid_count++; } } } // 计算并输出均值 result = (valid_count > 0) ? sum / valid_count : invalid_z; smoothed_z.write(result); } } }
07-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值