小编pau*_*aul的帖子

6DOF使用加速度计和陀螺仪

有没有人只使用iPhone传感器开发6DOF姿势估计,而不是视频?理解加速度计和陀螺仪的漂移.

陀螺仪提供相当可靠的相对定向速率.我已经能够用陀螺仪数据进行开发.

但是,我从加速度计中获得翻译时遇到了更多问题.加速度的双重积分导致无用的位置数据非常快(不到半秒).

我试图通过校准步骤消除偏差,但位置仍然很差.更糟糕的是,偏见不是恒定的.它随着时间的推移而变化,噪音使信号淹没.

我很感兴趣,如果有人能够开发出只有加速度计和陀螺仪的6DOF,它可以在5-10秒内可靠地工作,并且在平移和方向上几乎没有漂移.

iphone accelerometer

11
推荐指数
1
解决办法
3146
查看次数

将NEON组件与非向量函数混合使用

我想我找到了问题的答案.VFP有一个"fmacs"指令可以执行在NEON/VFP寄存器上进行标量计算的技巧.


我对NEON或ARM编程很新...

我想将一个上三角矩阵加载到NEON寄存器中,并使用单精度积分(累加)矢量的外积.基本思想是A + = x'*x,其中A是上三角矩阵.一些操作可以通过在四重或双重寄存器上使用NEON指令"vmla.f32"来矢量化操作来完成.但是,有时我只需要在一个精度寄存器1上操作,即不在2或4个单精度寄存器上操作.在下面的例子中(不起作用),我对该行很感兴趣

// A[8-14] += A[1]*x[1-7] 
"mla  s16, s16, d0[1]\n\t"
Run Code Online (Sandbox Code Playgroud)

我想使用NEON寄存器执行一次单精度操作.

代码段:

    __asm__ volatile (
    //load x into registers
    "vldmia    %0, {d0-d3}\n\t"
    // load A into registers
    "vldmia    %1, {d4-d12}\n\t"
    "vldmia    %1, {d13-d21}\n\t"
    // A[0-7] += x[0]*x[0-7]
    "vmla.f32  q2, q2, d0[0]\n\t"
    "vmla.f32  q3, q3, d0[0]\n\t"
    // A[8-14] += A[1]*x[1-7]
    "mla  s16, s16, d0[1]\n\t"
    // output
    :
    // input
    : "r"(A), "r"(x)
    // registers
    : "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8", "q9", "q10"
    );
Run Code Online (Sandbox Code Playgroud)

assembly arm neon

6
推荐指数
1
解决办法
2057
查看次数

NEON ASM代码运行速度比C代码慢得多?

我正在尝试使用NEON在iPhone ARM上针对特定问题实现Gauss-Newton优化.下面的第一个函数是我原来的C函数.第二个是我写的NEON asm代码.我每次运行100,000次,NEON版本比C版本长7-8倍.我认为加载(vld1.32)是大部分时间.我通过删除一些指令进行了实验.

有没有人对这个问题有任何见解?谢谢!

template<class T>
inline void GaussNewtonOperationJtr8x8(T Jtr[8], const T J[8], T residual)
{
    Jtr[0] -= J[0]*residual;
    Jtr[1] -= J[1]*residual;
    Jtr[2] -= J[2]*residual;
    Jtr[3] -= J[3]*residual;
    Jtr[4] -= J[4]*residual;
    Jtr[5] -= J[5]*residual;
    Jtr[6] -= J[6]*residual;
    Jtr[7] -= J[7]*residual;    
}

inline void GaussNewtonOperationJtr8x8_NEON(NFloat Jtr[8], const NFloat J[8], NFloat residual)
{
    __asm__ volatile (
                      // load Jtr into registers
                      "vld1.32   {d0-d3}, [%0]\n\t"
                      // load J into registers
                      "vld1.32   {d4-d7}, [%1]\n\t"
                      // load residual in register
                      "vmov.f32  s16, %2\n\t"
                      // Jtr …
Run Code Online (Sandbox Code Playgroud)

assembly arm neon

4
推荐指数
1
解决办法
3915
查看次数

使用NEON/ARM加载8位值

我正在尝试将一个char值数组加载到NEON寄存器中,然后将它们视为16位或32位整数值.所以像这样......

void SubVector(short* c, const unsigned char* a, const unsigned char* b, int n)
{
    for(int i = 0; i < n; i++)
    {
        c[i] = (short)a[i] - (short)b[i];
    }
}
Run Code Online (Sandbox Code Playgroud)

我不确定如何加载数据.我应该将8位数据加载到通道中,然后将寄存器重新解释为短路吗?或加载和转换?什么是最快的方式?

有没有人有一个关于如何使用NEON内在函数做到这一点的例子?

谢谢!

arm neon

1
推荐指数
1
解决办法
2121
查看次数

标签 统计

arm ×3

neon ×3

assembly ×2

accelerometer ×1

iphone ×1