iOS vDSP中的单矢量相反


矢量相反1 (float型矢量相反)

extern void vDSP_vneg(
    const float *__A,
    vDSP_Stride  __IA,
    float       *__C,
    vDSP_Stride  __IC,
    vDSP_Length  __N)
        __OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_4_0);

公式:



例子:注:注意例子n*AI不能大于8并且n*cl也不能大于8 (vDSP_zvneg函数出现数组越界)。

 float input[8],output[8];
    printf("input:\n");
    for (int i=1; i<=8; i++) {
        input[i-1]=-i;
        printf("%f ",input[i-1]);
    }
    vDSP_vneg(input, 1, output, 1, 8);
    printf("\noutput:\n");
    for (int i=0; i<8; i++) {
        printf("%f ",output[i]);
    }

打印结果:

input:
-1.000000 -2.000000 -3.000000 -4.000000 -5.000000 -6.000000 -7.000000 -8.000000 
output:
1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000 8.000000


如改变vDSP_vneg中的函数参数如下:

vDSP_vneg(input, 1, output, 1, 4);

打印结果:

input:
-1.000000 -2.000000 -3.000000 -4.000000 -5.000000 -6.000000 -7.000000 -8.000000 
output:
1.000000 2.000000 3.000000 4.000000 0.000000 0.000000 0.000000 0.000000


如改变vDSP_vneg中的函数参数如下:

vDSP_vneg(input, 2, output, 1, 4);

打印结果

input:
-1.000000 -2.000000 -3.000000 -4.000000 -5.000000 -6.000000 -7.000000 -8.000000 
output:
1.000000 3.000000 5.000000 7.000000 -0.000000 -0.000000 -0.000000 -0.000000 


如改变vDSP_vneg中的函数参数如下:

vDSP_vneg(input, 1, output, 2, 4);


打印结果:

input:
-1.000000 -2.000000 -3.000000 -4.000000 -5.000000 -6.000000 -7.000000 -8.000000 
output:
1.000000 0.000000 2.000000 0.000000 3.000000 0.000000 4.000000 0.000000 


根据上面的各种情况和公式对比一下,你应该很清楚的明白vDSP_vneg各个参数变化得到结果的变化。


矢量相反2 (double型矢量相反)

extern void vDSP_vnegD(
    const double *__A,
    vDSP_Stride   __IA,
    double       *__C,
    vDSP_Stride   __IC,
    vDSP_Length   __N)
        __OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_4_0);



矢量相反3 (float型复数矢量相反)


typedef struct DSPSplitComplex {
    float  * __nonnull realp;
    float  * __nonnull imagp;
} DSPSplitComplex;

extern void vDSP_zvneg(
    const DSPSplitComplex *__A,
    vDSP_Stride            __IA,
    const DSPSplitComplex *__C,
    vDSP_Stride            __IC,
    vDSP_Length            __N)
        __OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_4_0);

公式:


例子:

DSPSplitComplex input[8],output[8];
    printf("input:\n");
    for(int i=0;i<8;i++){
        float inr[4]={1,2,3,4};
        float ini[4]={1,2,3,4};
        float outr[4]={0};
        float outi[4]={0};
        input[i].realp = inr;
        input[i].imagp = ini;
        output[i].realp = outr;
        output[i].imagp = outi;
        printf("( ");
        for(int j=0;j<4;j++){
            printf("%f ",input[i].realp[j]);
        }
        printf(")+(");
        for(int j=0;j<4;j++){
            printf("%f ",input[i].imagp[j]);
        }
        printf(")i\n");
        
    }
    vDSP_zvneg(input,1, output, 1, 4);
    printf("\noutput:\n");
    for(int i=0;i<8;i++){
        printf("( ");
        for(int j=0;j<4;j++){
            printf("%f ",output[i].realp[j]);
        }
        printf(")+( ");
        for(int j=0;j<4;j++){
            printf("%f ",output[i].imagp[j]);
        }
        printf(")i\n");
    }

打印结果:

input:
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i


output:
( -1.000000 -2.000000 -3.000000 -4.000000 )+( -1.000000 -2.000000 -3.000000 -4.000000 )i
( -1.000000 -2.000000 -3.000000 -4.000000 )+( -1.000000 -2.000000 -3.000000 -4.000000 )i
( -1.000000 -2.000000 -3.000000 -4.000000 )+( -1.000000 -2.000000 -3.000000 -4.000000 )i
( -1.000000 -2.000000 -3.000000 -4.000000 )+( -1.000000 -2.000000 -3.000000 -4.000000 )i
( -1.000000 -2.000000 -3.000000 -4.000000 )+( -1.000000 -2.000000 -3.000000 -4.000000 )i
( -1.000000 -2.000000 -3.000000 -4.000000 )+( -1.000000 -2.000000 -3.000000 -4.000000 )i
( -1.000000 -2.000000 -3.000000 -4.000000 )+( -1.000000 -2.000000 -3.000000 -4.000000 )i
( -1.000000 -2.000000 -3.000000 -4.000000 )+( -1.000000 -2.000000 -3.000000 -4.000000 )i


如改变vDSP_zvneg中的函数参数如下:

vDSP_zvneg(input,1, output, 1, 2);

打印结果:

input:
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i


output:
( -1.000000 -2.000000 0.000000 0.000000 )+( -1.000000 -2.000000 0.000000 0.000000 )i
( -1.000000 -2.000000 0.000000 0.000000 )+( -1.000000 -2.000000 0.000000 0.000000 )i
( -1.000000 -2.000000 0.000000 0.000000 )+( -1.000000 -2.000000 0.000000 0.000000 )i
( -1.000000 -2.000000 0.000000 0.000000 )+( -1.000000 -2.000000 0.000000 0.000000 )i
( -1.000000 -2.000000 0.000000 0.000000 )+( -1.000000 -2.000000 0.000000 0.000000 )i
( -1.000000 -2.000000 0.000000 0.000000 )+( -1.000000 -2.000000 0.000000 0.000000 )i
( -1.000000 -2.000000 0.000000 0.000000 )+( -1.000000 -2.000000 0.000000 0.000000 )i
( -1.000000 -2.000000 0.000000 0.000000 )+( -1.000000 -2.000000 0.000000 0.000000 )i


如改变vDSP_zvneg中的函数参数如下:

vDSP_zvneg(input,2, output, 1, 2);


打印结果:

input:
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i


output:
( -1.000000 -3.000000 0.000000 0.000000 )+( -1.000000 -3.000000 0.000000 0.000000 )i
( -1.000000 -3.000000 0.000000 0.000000 )+( -1.000000 -3.000000 0.000000 0.000000 )i
( -1.000000 -3.000000 0.000000 0.000000 )+( -1.000000 -3.000000 0.000000 0.000000 )i
( -1.000000 -3.000000 0.000000 0.000000 )+( -1.000000 -3.000000 0.000000 0.000000 )i
( -1.000000 -3.000000 0.000000 0.000000 )+( -1.000000 -3.000000 0.000000 0.000000 )i
( -1.000000 -3.000000 0.000000 0.000000 )+( -1.000000 -3.000000 0.000000 0.000000 )i
( -1.000000 -3.000000 0.000000 0.000000 )+( -1.000000 -3.000000 0.000000 0.000000 )i
( -1.000000 -3.000000 0.000000 0.000000 )+( -1.000000 -3.000000 0.000000 0.000000 )i

如改变vDSP_zvneg中的函数参数如下:

vDSP_zvneg(input,1, output, 2, 2);

打印结果:


input:
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i
( 1.000000 2.000000 3.000000 4.000000 )+(1.000000 2.000000 3.000000 4.000000 )i


output:
( -1.000000 0.000000 -2.000000 0.000000 )+( -1.000000 0.000000 -2.000000 0.000000 )i
( -1.000000 0.000000 -2.000000 0.000000 )+( -1.000000 0.000000 -2.000000 0.000000 )i
( -1.000000 0.000000 -2.000000 0.000000 )+( -1.000000 0.000000 -2.000000 0.000000 )i
( -1.000000 0.000000 -2.000000 0.000000 )+( -1.000000 0.000000 -2.000000 0.000000 )i
( -1.000000 0.000000 -2.000000 0.000000 )+( -1.000000 0.000000 -2.000000 0.000000 )i
( -1.000000 0.000000 -2.000000 0.000000 )+( -1.000000 0.000000 -2.000000 0.000000 )i
( -1.000000 0.000000 -2.000000 0.000000 )+( -1.000000 0.000000 -2.000000 0.000000 )i
( -1.000000 0.000000 -2.000000 0.000000 )+( -1.000000 0.000000 -2.000000 0.000000 )i


根据上面的各种情况和公式对比一下,你应该很清楚的明白vDSP_zvneg各个参数变化得到结果的变化。

注:注意例子n*AI不能大于4并且n*cl也不能大于4 (vDSP_zvneg函数出现数组越界)。


矢量相反4 (double型复数矢量相反)

typedef struct DSPDoubleSplitComplex {
    double * __nonnull realp;
    double * __nonnull imagp;
} DSPDoubleSplitComplex;

extern void vDSP_zvnegD(
    const DSPDoubleSplitComplex *__A,
    vDSP_Stride                  __IA,
    const DSPDoubleSplitComplex *__C,
    vDSP_Stride                  __IC,
    vDSP_Length                  __N)
        __OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_4_0);


祝你生活愉快!








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
VDSP(Vector Digital Signal Processing,向量数字信号处理)是一种用于高效处理数字信号的技术。它使用向量指令和并行处理的方式,能够同时处理多个数据元素,提高信号处理的速度和效率。 理解VDSP的情况可以从以下几个方面: 1. 并行处理能力:VDSP利用向量指令集和SIMD(Single Instruction, Multiple Data)技术,可以同时处理多个数据元素。这意味着它可以在个指令的执行对多个数据进行操作,从而提高信号处理的效率。 2. 数据对齐要求:VDSP通常要求数据在内存按照特定的对齐方式存储。这是因为向量指令需要访问连续的内存地址来读取数据,如果数据没有按照对齐要求存储,可能会导致性能下降。 3. 应用领域:VDSP广泛应用于数字信号处理领域,包括音频处理、图像处理、视频编解码等。通过利用并行处理能力,VDSP可以加速这些领域的算法和操作,提高实时性能和响应速度。 4. 硬件支持:VDSP通常需要硬件支持,例如特定的处理器或DSP芯片。这些硬件提供了向量指令集和并行处理元,使得VDSP能够发挥其优势。 总之,VDSP是一种利用向量指令和并行处理的技术,用于高效处理数字信号。它在提高信号处理速度和效率方面具有重要作用,并广泛应用于音频、图像、视频等领域。理解VDSP的情况可以帮助我们选择合适的技术和工具来进行信号处理任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

u014068781

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值