我正在计算极坐标系中给出的两条直线的交点:
@Override
public void onItemSelected(AdapterView<?> main, View view, int position,
long Id) {
if(position > 0){
// get spinner value
}else{
// show toast select gender
}
}
在我们的FPGA合成之后,我看到浮动正弦(和cos)的4个实现每个实现需要4800个LUT,这四个函数总计19000个LUT。我想通过使用固定点正弦来减少LUT计数。 I already found a implementation的CORDIC但我不确定如何使用它。函数的输入是一个整数但我有一个typedef ap_fixed<16,3,AP_RND> t_lines_angle;
typedef ap_fixed<16,14,AP_RND> t_lines_rho;
bool get_intersection(
hls::Polar_< t_lines_angle, t_lines_rho>* lineOne,
hls::Polar_< t_lines_angle, t_lines_rho>* lineTwo,
Point* point)
{
float angleL1 = lineOne->angle.to_float();
float angleL2 = lineTwo->angle.to_float();
t_lines_angle rhoL1 = lineOne->rho.to_float();
t_lines_angle rhoL2 = lineTwo->rho.to_float();
t_lines_angle ct1=cosf(angleL1);
t_lines_angle st1=sinf(angleL1);
t_lines_angle ct2=cosf(angleL2);
t_lines_angle st2=sinf(angleL2);
t_lines_angle d=ct1*st2-st1*ct2;
// we make sure that the lines intersect
// which means that parallel lines are not possible
point->X = (int)((st2*rhoL1-st1*rhoL2)/d);
point->Y = (int)((-ct2*rhoL1+ct1*rhoL2)/d);
return true;
}
数据类型。如何将此ap_fixed
映射到整数?如何将3.13固定点映射到所需的2.14固定点?
答案 0 :(得分:0)
在我的一位同事的帮助下,我找到了一个非常简单的解决方案,不需要任何手写实现或操纵定点数据:
使用String[] items = new String[]{ "Office", "Home", "College", "Uncle's Home", "CoDebuggers"};
int[] items_value = new String[]{ 4, 8, 9, 10, 55};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, items);
SpinnerName.setAdapter(adapter);
以及#!/bin/bash
# Calculate num of changed, new lines on git per days (show your productivity)
ds() {
date --date="$1 days ago" +%Y-%m-%d
}
echo "GIT changes stat: Date, Total lines modified (New added, Changed)"
for week in {13..0}
do
# git log outputs lines like:
# 11 10 path/to/your/file.java
# => add first two columns with awk
lines_all=$(git --no-pager log --after=$(ds $week) --before=$(ds $(($week - 1))) --format=format: --numstat | awk '{s+=$1; s+=$2} END {print s/1}')
lines_chg=$(git --no-pager log --after=$(ds $week) --before=$(ds $(($week - 1))) --format=format: --numstat | awk '{s+=$1;} END {print s/1}')
lines_new=$(git --no-pager log --after=$(ds $week) --before=$(ds $(($week - 1))) --format=format: --numstat | awk '{s+=$2} END {print s/1}')
#echo -e "$(ds $week): $lines_all \t\t(new: $lines_new, \tchanged: $lines_chg)"
printf "%10s: %10s \t\t(new: %10s, \tchanged: %10s)\n" $(ds $week) $lines_all $lines_new $lines_chg
done
和#include "hls_math.h"
函数。
重要的是要说函数的输入应该是hls::sinf()
hls::cosf()
。可以将函数的输出分配给不同类型,例如ap_fixed<32, I>
示例:强>
I <= 32
LUT消费:
在我的情况下,对于每个函数的实现,LUT的消耗减少到400 LUT。
答案 1 :(得分:0)
您可以使用位切片来获取ap_fixed变量的分数和整数部分,然后对它们进行操作以获得新的ap_fixed。也许是这样的事情:
constexpr int max(int a, int b) { return a > b ? a : b; }
template <int W2, int I2, int W1, int I1>
ap_fixed<W2, I2> convert(ap_fixed<W1, I1> f)
{
// Read fraction part as integer:
ap_fixed<max(W2, W1) + 1, max(I2, I1) + 1> result = f(W1 - I1 - 1, 0);
// Shift by the original number of bits in the fraction part
result >>= W1 - I1;
// Add the integer part
result += f(W1 - 1, W1 - I1);
return result;
}
我还没有很好地测试过这段代码,所以请耐心等待。