IPP移植实践

目标:IPP软件从X86平台移植到ARM平台

移植函数:

指数函数:ippsExp_32f_A24
三角函数:ippsCos_32f_A24,ippsSin_32f_A24
正弦波生成函数:ippsTone_16s,ippsTone_32f
三角波生成函数:ippsTriangle_32fc

1.安装环境

官网下载ipp环境安装包:https://www.intel.cn/content/www/cn/zh/developer/tools/oneapi/ipp.html

安装环境

 修改环境变量:

临时修改:

source /opt/intel/oneapi/setvars.sh

永久修改: 

echo "source /opt/intel/oneapi/setvars.sh" >> ~/.bashrc

运行测试代码

#include <stdio.h>
#include "ipp.h"

#define PRINT_INFO(feature, text) printf("  %-30s= ", #feature); \
      printf("%c\t%c\t", (cpuFeatures & feature) ? 'Y' : 'N', (enabledFeatures & feature) ? 'Y' : 'N'); \
      printf( #text "\n")

int main(int argc, char* argv[])
{
      const       IppLibraryVersion *libVersion;
      IppStatus   status;
      Ipp64u      cpuFeatures, enabledFeatures;

      ippInit();                      /* Initialize Intel  IPP library */
      libVersion = ippGetLibVersion(); /* Get Intel  IPP library version info */
      printf("%s %s\n", libVersion->Name, libVersion->Version);

      status = ippGetCpuFeatures(&cpuFeatures, 0); /* Get CPU features and features enabled with selected library level */
      if (ippStsNoErr != status) return status;
      enabledFeatures = ippGetEnabledCpuFeatures();
      printf("Features supported: by CPU\tby Intel  IPP\n");
      printf("------------------------------------------------\n");
      PRINT_INFO(ippCPUID_MMX,        Intel  Architecture MMX technology supported);
      PRINT_INFO(ippCPUID_SSE,        Intel  Streaming SIMD Extensions);
      PRINT_INFO(ippCPUID_SSE2,       Intel  Streaming SIMD Extensions 2);
      PRINT_INFO(ippCPUID_SSE3,       Intel  Streaming SIMD Extensions 3);
      PRINT_INFO(ippCPUID_SSSE3,      Supplemental Streaming SIMD Extensions 3);
      PRINT_INFO(ippCPUID_MOVBE,      Intel  MOVBE instruction);
      PRINT_INFO(ippCPUID_SSE41,      Intel  Streaming SIMD Extensions 4.1);
      PRINT_INFO(ippCPUID_SSE42,      Intel  Streaming SIMD Extensions 4.2);
      PRINT_INFO(ippCPUID_AVX,        Intel  Advanced Vector Extensions instruction set);
      PRINT_INFO(ippAVX_ENABLEDBYOS,  Intel  Advanced Vector Extensions instruction set is supported by OS);
      PRINT_INFO(ippCPUID_AES,        Intel  AES New Instructions);
      PRINT_INFO(ippCPUID_CLMUL,      Intel  CLMUL instruction);
      PRINT_INFO(ippCPUID_RDRAND,     Intel  RDRAND instruction);
      PRINT_INFO(ippCPUID_F16C,       Intel  F16C new instructions);
      PRINT_INFO(ippCPUID_AVX2,       Intel  Advanced Vector Extensions 2 instruction set);
      PRINT_INFO(ippCPUID_ADCOX,      Intel  ADOX/ADCX new instructions);
      PRINT_INFO(ippCPUID_RDSEED,     Intel  RDSEED instruction);
      PRINT_INFO(ippCPUID_PREFETCHW,  Intel  PREFETCHW instruction);
      PRINT_INFO(ippCPUID_SHA,        Intel  SHA new instructions);
      PRINT_INFO(ippCPUID_AVX512F,    Intel  Advanced Vector Extensions 512 Foundation instruction set);
      PRINT_INFO(ippCPUID_AVX512CD,   Intel  Advanced Vector Extensions 512 CD instruction set);
      PRINT_INFO(ippCPUID_AVX512ER,   Intel  Advanced Vector Extensions 512 ER instruction set);
      PRINT_INFO(ippCPUID_AVX512PF,   Intel  Advanced Vector Extensions 512 PF instruction set);
      PRINT_INFO(ippCPUID_AVX512BW,   Intel  Advanced Vector Extensions 512 BW instruction set);
      PRINT_INFO(ippCPUID_AVX512VL,   Intel  Advanced Vector Extensions 512 VL instruction set);
      PRINT_INFO(ippCPUID_AVX512VBMI, Intel  Advanced Vector Extensions 512 Bit Manipulation instructions);
      PRINT_INFO(ippCPUID_MPX,        Intel  Memory Protection Extensions);
      PRINT_INFO(ippCPUID_AVX512_4FMADDPS,    Intel  Advanced Vector Extensions 512 DL floating-point single precision);
      PRINT_INFO(ippCPUID_AVX512_4VNNIW,      Intel  Advanced Vector Extensions 512 DL enhanced word variable precision);
      PRINT_INFO(ippCPUID_KNC,        Intel  Xeon Phi™ Coprocessor);
      PRINT_INFO(ippCPUID_AVX512IFMA, Intel  Advanced Vector Extensions 512 IFMA (PMADD52) instruction set);
      PRINT_INFO(ippAVX512_ENABLEDBYOS,       Intel  Advanced Vector Extensions 512 is supported by OS);
      return 0;
}

2.指数函数:ippsExp_32f_A24

原函数及效果

#include <stdio.h>
#include <ipp.h>

int main() {
    Ipp32f src[] = {1.0f, 2.0f, 3.0f};
    Ipp32f dst[3];

    // 计算每个元素的指数函数值
    ippsExp_32f_A24(src, dst, 3);

    // 打印结果
    printf("Result: %f, %f, %f\n", dst[0], dst[1], dst[2]);

    return 0;
}

串行代码

#include <stdio.h>

void ippsExp_f32(const float *src, float *dst, int size) {
    for (int i = 0; i < size; i++) {
        float x = src[i];
        float result = 1.0f;
        float term = 1.0f;

        for (int j = 1; j <= 24; j++) {
            term *= x / j;
            result += term;
        }

        dst[i] = result;
    }
}

int main() {
    float src[] = {1.0f, 2.0f, 3.0f};
    float dst[3];

    // 计算每个元素的指数函数值
    ippsExp_f32(src, dst, 3);

    // 打印结果
    printf("Result: %f, %f, %f\n", dst[0], dst[1], dst[2]);

    return 0;
}

neon优化代码及结果

3.三角函数:ippsCos_32f_A24,ippsSin_32f_A24

原函数及效果

#include <ipp.h>
#include <stdio.h>

int main() {
    Ipp32f src[] = {0.0f, 1.0f, 2.0f, 3.0f};  // 输入的单精度浮点数数组
    Ipp32f cosDst[4];  // 存储余弦值的数组
    Ipp32f sinDst[4];  // 存储正弦值的数组

    // 计算余弦值
    ippsCos_32f_A24(src, cosDst, 4);

    // 计算正弦值
    ippsSin_32f_A24(src, sinDst, 4);

    // 输出计算结果
    for (int i = 0; i < 4; i++) {
        printf("cos(%f) = %f, sin(%f) = %f\n", src[i], cosDst[i], src[i], sinDst[i]);
    }

    return 0;
}

 串行代码

#include <stdio.h>
#include <math.h>
 
void ippsSin_32f_A24(const float *src, float *dst, int size) {
    for (int i = 0; i < size; i++) {
        float x = src[i];
        float result = 1.0f;
        float term = 1.0f;
 
        for (int j = 1; j <= 24; j++) {
			int coefficient = (n % 2 == 0) ? 1 : -1;
			term = coefficient * pow(x, 2 * n + 1) / factorial(2 * n + 1);
            result += term;
        }
 
        dst[i] = result;
    }
}

void ippsCos_32f_A24(const float *src, float *dst, int size) {
    for (int i = 0; i < size; i++) {
        float x = src[i];
        float result = 1.0f;
        float term = 1.0f;
 
        for (int j = 1; j <= 24; j++) {
		int coefficient = (n % 2 == 0) ? 1 : -1;
        term = coefficient * pow(x, 2 * n) / factorial(2 * n);
            result += term;
        }
 
        dst[i] = result;
    }
}



int main() {
    Ipp32f src[] = {0.0f, 1.0f, 2.0f, 3.0f};  // 输入的单精度浮点数数组
    Ipp32f cosDst[4];  // 存储余弦值的数组
    Ipp32f sinDst[4];  // 存储正弦值的数组
 
    // 计算余弦值
    ippsCos_32f_A24(src, cosDst, 4);
 
    // 计算正弦值
    ippsSin_32f_A24(src, sinDst, 4);
 
    // 输出计算结果
    for (int i = 0; i < 4; i++) {
        printf("cos(%f) = %f, sin(%f) = %f\n", src[i], cosDst[i], src[i], sinDst[i]);
    }
 
    return 0;

}

4.正弦波生成函数:ippsTone_16s,ippsTone_32f

原函数及效果

#include <stdio.h>
#include "ipp.h"


#define EXIT_MAIN exitLine:                                  
#define check_sts(st) if((st) != ippStsNoErr) goto exitLine; 


int main()
{
    Ipp32s len = 64;
    int i;
    Ipp16s *pDst = ippsMalloc_16s(len * sizeof(Ipp16s));
    Ipp16s magn = 1; 
    Ipp32f rFreq =  0.025;
    Ipp32f pPhase = IPP_2PI/4; 
    IppStatus status;
    //x[n] = magn * (cos(2πn*rFreq + phase)+j* sin(2πn*rFreq + phase))
    check_sts(status = ippsTone_16s( pDst, len,magn,rFreq,&pPhase,ippAlgHintFast));

    printf("\n\nResult\n");
    for (i = 0; i < len; i++) printf("%d; ", pDst[i]);
    printf("\n\n");

EXIT_MAIN
    ippsFree(pDst);
    printf("Exit status %d (%s)\n", (int)status, ippGetStatusString(status));
    return (int)status;
}

#include <stdio.h>
#include "ipp.h"


#define EXIT_MAIN exitLine:                                  
#define check_sts(st) if((st) != ippStsNoErr) goto exitLine; 


int main()
{
    Ipp32s len = 32;
    int i;
    Ipp32f *pDst = ippsMalloc_32f(len * sizeof(Ipp32f));
    Ipp32f magn = 1; 
    Ipp32f rFreq =  0.25;
    Ipp32f pPhase = IPP_2PI/4; 
    IppStatus status;
    //x[n] = magn * (cos(2πn*rFreq + phase)+j* sin(2πn*rFreq + phase))
    check_sts(status = ippsTone_32f( pDst, len,magn,rFreq,&pPhase,ippAlgHintAccurate));

    printf("\n\nResult\n");
    for (i = 0; i < len; i++) printf("%.5f; ", pDst[i]);
    printf("\n\n");

EXIT_MAIN
    ippsFree(pDst);
    printf("Exit status %d (%s)\n", (int)status, ippGetStatusString(status));
    return (int)status;
}

 

串行代码  

#include <stdio.h>
#include <math.h>

#define PI 3.14159265

typedef struct {
    float real;
    float imag;
} Complex;

float realToneSignal(float magn, float rFreq, float phase, int n) {
    return magn * cosf(2 * PI * rFreq * n + phase);
}

Complex complexToneSignal(float magn, float rFreq, float phase, int n) {
    Complex result;
    result.real = magn * cosf(2 * PI * rFreq * n + phase);
    result.imag = magn * sinf(2 * PI * rFreq * n + phase);
    return result;
}

int main() {
    float magnitude = 1.0; // 振幅
    float frequency = 1.0; // 频率
    float phase = 0.0; // 相位
    int sampleIndex = 0; // 采样索引
    
    // 实数tone信号函数的调用和输出
    float realResult = realToneSignal(magnitude, frequency, phase, sampleIndex);
    printf("Real tone signal value: %f\n", realResult);

    // 复数tone信号函数的调用和输出
    Complex complexResult = complexToneSignal(magnitude, frequency, phase, sampleIndex);
    printf("Complex tone signal value: Real - %f, Imaginary - %f\n", complexResult.real, complexResult.imag);

    return 0;
}

5.三角波生成函数:ippsTriangle_32fc

原函数及效果

#include <stdio.h>
#include "ipp.h"

#define EXIT_MAIN exitLine:                                  
#define check_sts(st) if((st) != ippStsNoErr) goto exitLine; 


int main()
{
    int len = 512;
    int i;
    Ipp32fc *pDst = ippsMalloc_32fc(len * sizeof(Ipp32f));
    Ipp32f magn = 4095.0; 
    Ipp32f rFreq =  0.02;
    Ipp32f asym =  0.0;
    Ipp32f pPhase = 0; 
    IppStatus status;

    //x[n] = magn * [cth(2π* rFreq*n + phase) + j * sth(2π* rFreq*n + phase)], n = 0, 1, 2,...
    check_sts(status = ippsTriangle_32fc( pDst, len,magn,rFreq,asym,&pPhase));

    printf("\n\nResult\n");
    for (i = 0; i < len; i++) printf("im:%.5f,re:%.5f; ", pDst[i].im,  pDst[i].re);
    printf("\n\n");

EXIT_MAIN
    ippsFree(pDst);
    printf("Exit status %d (%s)\n", (int)status, ippGetStatusString(status));
    return (int)status;
}
┌──(root💀kali)-[~/ipp]
└─# ./ippsTriangle_32fc
Result
im:0.00000,re:4095.00000; im:327.60001,re:3767.39990; im:655.20001,re:3439.80005; im:982.79999,re:3112.19995; im:1310.40002,re:2784.60010; im:1638.00000,re:2457.00000; im:1965.59998,re:2129.40015; im:2293.19995,re:1801.80005; im:2620.80005,re:1474.20007; im:2948.39990,re:1146.60010; im:3276.00000,re:819.00006; im:3603.59985,re:491.40009; im:3931.19995,re:163.80009; im:3931.20020,re:-163.79991; im:3603.60010,re:-491.39990; im:3276.00000,re:-818.99988; im:2948.40015,re:-1146.59985; im:2620.80005,re:-1474.19983; im:2293.20020,re:-1801.79993; im:1965.60010,re:-2129.39990; im:1638.00012,re:-2456.99976; im:1310.40015,re:-2784.59985; im:982.80017,re:-3112.19995; im:655.20020,re:-3439.79980; im:327.60019,re:-3767.39990; im:0.00018,re:-4094.99976; im:-327.59982,re:-3767.40015; im:-655.19983,re:-3439.80029; im:-982.79980,re:-3112.20020; im:-1310.39978,re:-2784.60010; im:-1637.99976,re:-2457.00024; im:-1965.59973,re:-2129.40015; im:-2293.19971,re:-1801.80029; im:-2620.79980,re:-1474.20020; im:-2948.39966,re:-1146.60022; im:-3275.99976,re:-819.00024; im:-3603.59985,re:-491.40027; im:-3931.19971,re:-163.80028; im:-3931.20020,re:163.79973; im:-3603.60034,re:491.39972; im:-3276.00024,re:818.99969; im:-2948.40039,re:1146.59973; im:-2620.80029,re:1474.19971; im:-2293.20020,re:1801.79968; im:-1965.60034,re:2129.39966; im:-1638.00037,re:2456.99976; im:-1310.40039,re:2784.59961; im:-982.80035,re:3112.19971; im:-655.20038,re:3439.79956; im:-327.60037,re:3767.39966; im:-0.00037,re:4094.99976; im:327.59964,re:3767.40039; im:655.19965,re:3439.80029; im:982.79962,re:3112.20044; im:1310.39966,re:2784.60034; im:1637.99963,re:2457.00049; im:1965.59961,re:2129.40039; im:2293.19946,re:1801.80042; im:2620.79956,re:1474.20044; im:2948.39966,re:1146.60046; im:3275.99951,re:819.00043; im:3603.59961,re:491.40045; im:3931.19946,re:163.80046; im:3931.20044,re:-163.79955; im:3603.60059,re:-491.39954; im:3276.00049,re:-818.99951; im:2948.40039,re:-1146.59949; im:2620.80054,re:-1474.19946; im:2293.20044,re:-1801.79956; im:1965.60046,re:-2129.39941; im:1638.00049,re:-2456.99951; im:1310.40051,re:-2784.59937; im:982.80054,re:-3112.19946; im:655.20056,re:-3439.79956; im:327.60056,re:-3767.39941; im:0.00055,re:-4094.99951; im:-327.59946,re:-3767.40063; im:-655.19946,re:-3439.80054; im:-982.79944,re:-3112.20068; im:-1310.39941,re:-2784.60059; im:-1637.99939,re:-2457.00049; im:-1965.59937,re:-2129.40063; im:-2293.19946,re:-1801.80066; im:-2620.79932,re:-1474.20056; im:-2948.39941,re:-1146.60059; im:-3275.99927,re:-819.00061; im:-3603.59937,re:-491.40063; im:-3931.19946,re:-163.80064; im:-3931.20068,re:163.79936; im:-3603.60059,re:491.39935; im:-3276.00073,re:818.99933; im:-2948.40063,re:1146.59937; im:-2620.80078,re:1474.19934; im:-2293.20068,re:1801.79932; im:-1965.60071,re:2129.39941; im:-1638.00073,re:2456.99927; im:-1310.40076,re:2784.59937; im:-982.80072,re:3112.19922; im:-655.20074,re:3439.79932; im:-327.60074,re:3767.39917; im:-0.00073,re:4094.99927; im:327.59927,re:3767.40063; im:655.19928,re:3439.80078; im:982.79926,re:3112.20068; im:1310.39929,re:2784.60083; im:1637.99927,re:2457.00073; im:1965.59924,re:2129.40088; im:2293.19922,re:1801.80078; im:2620.79932,re:1474.20081; im:2948.39917,re:1146.60083; im:3275.99927,re:819.00079; im:3603.59912,re:491.40082; im:3931.19922,re:163.80083; im:3931.20093,re:-163.79918; im:3603.60083,re:-491.39917; im:3276.00073,re:-818.99915; im:2948.40088,re:-1146.59912; im:2620.80078,re:-1474.19910; im:2293.20093,re:-1801.79919; im:1965.60083,re:-2129.39917; im:1638.00085,re:-2456.99902; im:1310.40088,re:-2784.59912; im:982.80090,re:-3112.19922; im:655.20093,re:-3439.79907; im:327.60092,re:-3767.39917; im:0.00092,re:-4094.99902; im:-327.59909,re:-3767.40088; im:-655.19910,re:-3439.80103; im:-982.79907,re:-3112.20093; im:-1310.39905,re:-2784.60083; im:-1637.99902,re:-2457.00098; im:-1965.59900,re:-2129.40088; im:-2293.19897,re:-1801.80103; im:-2620.79907,re:-1474.20093; im:-2948.39893,re:-1146.60095; im:-3275.99902,re:-819.00098; im:-3603.59912,re:-491.40100; im:-3931.19897,re:-163.80101; im:-3931.20093,re:163.79900; im:-3603.60107,re:491.39899; im:-3276.00098,re:818.99896; im:-2948.40112,re:1146.59900; im:-2620.80103,re:1474.19897; im:-2293.20093,re:1801.79895; im:-1965.60107,re:2129.39893; im:-1638.00110,re:2456.99902; im:-1310.40112,re:2784.59888; im:-982.80109,re:3112.19897; im:-655.20111,re:3439.79883; im:-327.60110,re:3767.39893; im:-0.00110,re:4094.99902; im:327.59891,re:3767.40112; im:655.19891,re:3439.80103; im:982.79889,re:3112.20117; im:1310.39893,re:2784.60107; im:1637.99890,re:2457.00122; im:1965.59888,re:2129.40112; im:2293.19873,re:1801.80115; im:2620.79883,re:1474.20117; im:2948.39893,re:1146.60120; im:3275.99878,re:819.00116; im:3603.59888,re:491.40118; im:3931.19873,re:163.80119; im:3931.20117,re:-163.79881; im:3603.60132,re:-491.39880; im:3276.00122,re:-818.99878; im:2948.40112,re:-1146.59875; im:2620.80127,re:-1474.19873; im:2293.20117,re:-1801.79883; im:1965.60120,re:-2129.39868; im:1638.00122,re:-2456.99878; im:1310.40125,re:-2784.59863; im:982.80127,re:-3112.19873; im:655.20129,re:-3439.79883; im:327.60129,re:-3767.39868; im:0.00128,re:-4094.99878; im:-327.59872,re:-3767.40137; im:-655.19873,re:-3439.80127; im:-982.79871,re:-3112.20142; im:-1310.39868,re:-2784.60132; im:-1637.99866,re:-2457.00122; im:-1965.59863,re:-2129.40137; im:-2293.19873,re:-1801.80139; im:-2620.79858,re:-1474.20129; im:-2948.39868,re:-1146.60132; im:-3275.99854,re:-819.00134; im:-3603.59863,re:-491.40137; im:-3931.19873,re:-163.80138; im:-3931.20142,re:163.79863; im:-3603.60132,re:491.39862; im:-3276.00146,re:818.99860; im:-2948.40137,re:1146.59863; im:-2620.80151,re:1474.19861; im:-2293.20142,re:1801.79858; im:-1965.60144,re:2129.39868; im:-1638.00146,re:2456.99854; im:-1310.40149,re:2784.59863; im:-982.80145,re:3112.19849; im:-655.20148,re:3439.79858; im:-327.60147,re:3767.39844; im:-0.00146,re:4094.99854; im:327.59854,re:3767.40137; im:655.19855,re:3439.80151; im:982.79852,re:3112.20142; im:1310.39856,re:2784.60156; im:1637.99854,re:2457.00146; im:1965.59851,re:2129.40161; im:2293.19849,re:1801.80151; im:2620.79858,re:1474.20154; im:2948.39844,re:1146.60156; im:3275.99854,re:819.00153; im:3603.59839,re:491.40155; im:3931.19849,re:163.80156; im:3931.20166,re:-163.79845; im:3603.60156,re:-491.39844; im:3276.00146,re:-818.99841; im:2948.40161,re:-1146.59839; im:2620.80151,re:-1474.19836; im:2293.20166,re:-1801.79846; im:1965.60156,re:-2129.39844; im:1638.00159,re:-2456.99829; im:1310.40161,re:-2784.59839; im:982.80164,re:-3112.19849; im:655.20166,re:-3439.79834; im:327.60165,re:-3767.39844; im:0.00165,re:-4094.99829; im:-327.59836,re:-3767.40161; im:-655.19836,re:-3439.80176; im:-982.79834,re:-3112.20166; im:-1310.39832,re:-2784.60156; im:-1637.99829,re:-2457.00171; im:-1965.59827,re:-2129.40161; im:-2293.19824,re:-1801.80176; im:-2620.79834,re:-1474.20166; im:-2948.39819,re:-1146.60168; im:-3275.99829,re:-819.00171; im:-3603.59839,re:-491.40173; im:-3931.19824,re:-163.80174; im:-3931.20166,re:163.79826; im:-3603.60181,re:491.39825; im:-3276.00171,re:818.99823; im:-2948.40186,re:1146.59827; im:-2620.80176,re:1474.19824; im:-2293.20166,re:1801.79822; im:-1965.60181,re:2129.39819; im:-1638.00183,re:2456.99829; im:-1310.40186,re:2784.59814; im:-982.80182,re:3112.19824; im:-655.20184,re:3439.79810; im:-327.60184,re:3767.39819; im:-0.00183,re:4094.99829; im:327.59818,re:3767.40186; im:655.19818,re:3439.80176; im:982.79816,re:3112.20190; im:1310.39819,re:2784.60181; im:1637.99817,re:2457.00195; im:1965.59814,re:2129.40186; im:2293.19800,re:1801.80188; im:2620.79810,re:1474.20190; im:2948.39819,re:1146.60193; im:3275.99805,re:819.00189; im:3603.59814,re:491.40192; im:3931.19800,re:163.80193; im:3931.20190,re:-163.79808; im:3603.60205,re:-491.39807; im:3276.00195,re:-818.99805; im:2948.40186,re:-1146.59802; im:2620.80200,re:-1474.19800; im:2293.20190,re:-1801.79810; im:1965.60193,re:-2129.39795; im:1638.00195,re:-2456.99805; im:1310.40198,re:-2784.59790; im:982.80200,re:-3112.19800; im:655.20203,re:-3439.79810; im:327.60202,re:-3767.39795; im:0.00201,re:-4094.99805; im:-327.59799,re:-3767.40210; im:-655.19800,re:-3439.80200; im:-982.79797,re:-3112.20215; im:-1310.39795,re:-2784.60205; im:-1637.99792,re:-2457.00195; im:-1965.59790,re:-2129.40210; im:-2293.19800,re:-1801.80212; im:-2620.79785,re:-1474.20203; im:-2948.39795,re:-1146.60205; im:-3275.99780,re:-819.00208; im:-3603.59790,re:-491.40210; im:-3931.19800,re:-163.80211; im:-3931.20215,re:163.79790; im:-3603.60205,re:491.39789; im:-3276.00220,re:818.99786; im:-2948.40210,re:1146.59790; im:-2620.80225,re:1474.19788; im:-2293.20215,re:1801.79785; im:-1965.60217,re:2129.39795; im:-1638.00220,re:2456.99780; im:-1310.40222,re:2784.59790; im:-982.80219,re:3112.19775; im:-655.20221,re:3439.79785; im:-327.60220,re:3767.39771; im:-0.00220,re:4094.99780; im:327.59781,re:3767.40210; im:655.19781,re:3439.80225; im:982.79779,re:3112.20215; im:1310.39783,re:2784.60229; im:1637.99780,re:2457.00220; im:1965.59778,re:2129.40234; im:2293.19775,re:1801.80225; im:2620.79785,re:1474.20227; im:2948.39771,re:1146.60229; im:3275.99780,re:819.00226; im:3603.59766,re:491.40228; im:3931.19775,re:163.80229; im:3931.20239,re:-163.79771; im:3603.60229,re:-491.39771; im:3276.00220,re:-818.99768; im:2948.40234,re:-1146.59766; im:2620.80225,re:-1474.19763; im:2293.20239,re:-1801.79773; im:1965.60229,re:-2129.39771; im:1638.00232,re:-2456.99756; im:1310.40234,re:-2784.59766; im:982.80237,re:-3112.19775; im:655.20239,re:-3439.79761; im:327.60239,re:-3767.39771; im:0.00238,re:-4094.99756; im:-327.59763,re:-3767.40234; im:-655.19763,re:-3439.80249; im:-982.79761,re:-3112.20239; im:-1310.39758,re:-2784.60229; im:-1637.99756,re:-2457.00244; im:-1965.59753,re:-2129.40234; im:-2293.19751,re:-1801.80249; im:-2620.79761,re:-1474.20239; im:-2948.39746,re:-1146.60242; im:-3275.99756,re:-819.00244; im:-3603.59766,re:-491.40247; im:-3931.19751,re:-163.80247; im:-3931.20239,re:163.79753; im:-3603.60254,re:491.39752; im:-3276.00244,re:818.99750; im:-2948.40259,re:1146.59753; im:-2620.80249,re:1474.19751; im:-2293.20239,re:1801.79749; im:-1965.60254,re:2129.39746; im:-1638.00256,re:2456.99756; im:-1310.40259,re:2784.59741; im:-982.80255,re:3112.19751; im:-655.20258,re:3439.79736; im:-327.60257,re:3767.39746; im:-0.00256,re:4094.99756; im:327.59744,re:3767.40259; im:655.19745,re:3439.80249; im:982.79742,re:3112.20264; im:1310.39746,re:2784.60254; im:1637.99744,re:2457.00269; im:1965.59741,re:2129.40259; im:2293.19727,re:1801.80261; im:2620.79736,re:1474.20264; im:2948.39746,re:1146.60266; im:3275.99731,re:819.00262; im:3603.59741,re:491.40265; im:3931.19727,re:163.80266; im:3931.20264,re:-163.79735; im:3603.60278,re:-491.39734; im:3276.00269,re:-818.99731; im:2948.40259,re:-1146.59729; im:2620.80273,re:-1474.19727; im:2293.20264,re:-1801.79736; im:1965.60266,re:-2129.39722; im:1638.00269,re:-2456.99731; im:1310.40271,re:-2784.59717; im:982.80273,re:-3112.19727; im:655.20276,re:-3439.79736; im:327.60275,re:-3767.39722; im:0.00275,re:-4094.99731; im:-327.59726,re:-3767.40283; im:-655.19727,re:-3439.80273; im:-982.79724,re:-3112.20288; im:-1310.39722,re:-2784.60278; im:-1637.99719,re:-2457.00269; im:-1965.59717,re:-2129.40283; im:-2293.19727,re:-1801.80286; im:-2620.79712,re:-1474.20276; im:-2948.39722,re:-1146.60278; im:-3275.99707,re:-819.00281; im:-3603.59717,re:-491.40283; im:-3931.19727,re:-163.80284; im:-3931.20288,re:163.79716; im:-3603.60278,re:491.39716; im:-3276.00293,re:818.99713; im:-2948.40283,re:1146.59717; im:-2620.80298,re:1474.19714; im:-2293.20288,re:1801.79712; im:-1965.60291,re:2129.39722; im:-1638.00293,re:2456.99707; im:-1310.40295,re:2784.59717; im:-982.80292,re:3112.19702; im:-655.20294,re:3439.79712; im:-327.60294,re:3767.39697; im:-0.00293,re:4094.99707; im:327.59708,re:3767.40283; im:655.19708,re:3439.80298; im:982.79706,re:3112.20288; im:1310.39709,re:2784.60303; im:1637.99707,re:2457.00293; im:1965.59705,re:2129.40308; im:2293.19702,re:1801.80298; im:2620.79712,re:1474.20300; im:2948.39697,re:1146.60303; im:3275.99707,re:819.00299; im:3603.59692,re:491.40302; im:3931.19702,re:163.80302; im:3931.20312,re:-163.79698; im:3603.60303,re:-491.39697; im:3276.00293,re:-818.99695; im:2948.40308,re:-1146.59692; im:2620.80298,re:-1474.19690; im:2293.20312,re:-1801.79700; im:1965.60303,re:-2129.39697; im:1638.00305,re:-2456.99683; im:1310.40308,re:-2784.59692; im:982.80310,re:-3112.19702; im:655.20312,re:-3439.79688; im:327.60312,re:-3767.39697; im:0.00311,re:-4094.99683; im:-327.59689,re:-3767.40308; im:-655.19690,re:-3439.80322; im:-982.79688,re:-3112.20312; im:-1310.39685,re:-2784.60303; im:-1637.99683,re:-2457.00317; im:-1965.59680,re:-2129.40308; im:-2293.19678,re:-1801.80322; im:-2620.79688,re:-1474.20312; im:-2948.39673,re:-1146.60315; im:-3275.99683,re:-819.00317; im:-3603.59692,re:-491.40320; im:-3931.19678,re:-163.80321; im:-3931.20312,re:163.79680; im:-3603.60327,re:491.39679; im:-3276.00317,re:818.99677; im:-2948.40332,re:1146.59680; im:-2620.80322,re:1474.19678; im:-2293.20312,re:1801.79675; im:-1965.60327,re:2129.39673; im:-1638.00330,re:2456.99683; im:-1310.40332,re:2784.59668; im:-982.80328,re:3112.19678; im:-655.20331,re:3439.79663; im:-327.60330,re:3767.39673; im:-0.00330,re:4094.99683; im:327.59671,re:3767.40332; im:655.19672,re:3439.80322; im:982.79669,re:3112.20337; im:1310.39673,re:2784.60327; im:1637.99670,re:2457.00342; im:1965.59668,re:2129.40332; im:2293.19653,re:1801.80334; im:2620.79663,re:1474.20337; im:2948.39673,re:1146.60339; im:3275.99658,re:819.00336; im:3603.59668,re:491.40338; im:3931.19653,re:163.80339; im:3931.20337,re:-163.79662; im:3603.60352,re:-491.39661; im:3276.00342,re:-818.99658; im:2948.40332,re:-1146.59656; im:2620.80347,re:-1474.19653; im:2293.20337,re:-1801.79663; im:1965.60339,re:-2129.39648; im:1638.00342,re:-2456.99658; im:1310.40344,re:-2784.59644; im:982.80347,re:-3112.19653; im:655.20349,re:-3439.79663; im:327.60349,re:-3767.39648; im:0.00348,re:-4094.99658; im:-327.59653,re:-3767.40356; im:-655.19653,re:-3439.80347; im:-982.79651,re:-3112.20361; im:-1310.39648,re:-2784.60352; im:-1637.99646,re:-2457.00342; im:-1965.59644,re:-2129.40356; im:-2293.19653,re:-1801.80359; im:-2620.79639,re:-1474.20349; im:-2948.39648,re:-1146.60352; im:-3275.99634,re:-819.00354; im:-3603.59644,re:-491.40356; im:-3931.19653,re:-163.80357; im:-3931.20361,re:163.79643; im:-3603.60352,re:491.39642; im:-3276.00366,re:818.99640; im:-2948.40356,re:1146.59644; im:-2620.80371,re:1474.19641; im:-2293.20361,re:1801.79639; im:-1965.60364,re:2129.39648; im:-1638.00366,re:2456.99634; im:-1310.40369,re:2784.59644; im:-982.80365,re:3112.19629; im:-655.20367,re:3439.79639; im:-327.60367,re:3767.39624; im:-0.00366,re:4094.99634; im:327.59634,re:3767.40356; im:655.19635,re:3439.80371; im:982.79633,re:3112.20361; im:1310.39636,re:2784.60376; im:1637.99634,re:2457.00366; im:1965.59631,re:2129.40381; im:2293.19629,re:1801.80371; im:2620.79639,re:1474.20374; im:2948.39624,re:1146.60376; im:3275.99634,re:819.00372; im:3603.59619,re:491.40375; 

Exit status 0 (ippStsNoErr: No errors)

串行代码 

#include <stdio.h>
#include <math.h>

double cth(double x) {
    return 1.0 / tanh(x);
}

double sth(double x) {
    return sinh(x) / cosh(x);
}

void real_triangle_wave(double magn, double rFreq, double phase, int n, double *result) {
    *result = magn * cth(2 * M_PI * rFreq * n + phase);
}

void complex_triangle_wave(double magn, double rFreq, double phase, int n, double *real_part, double *imag_part) {
    *real_part = magn * cth(2 * M_PI * rFreq * n + phase);
    *imag_part = magn * sth(2 * M_PI * rFreq * n + phase);
}

int main() {
    double magn = 1.0; // 幅值
    double rFreq = 1.0; // 频率
    double phase = 0.0; // 相位
    int n_values[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; // n 的值,例如 0 到 9

    // 计算实数三角波生成函数
    printf("实数三角波生成函数值:\n");
    for (int i = 0; i < 10; i++) {
        double result;
        real_triangle_wave(magn, rFreq, phase, n_values[i], &result);
        printf("%lf\n", result);
    }

    // 计算复数三角波生成函数
    printf("复数三角波生成函数值:\n");
    for (int i = 0; i < 10; i++) {
        double real_part, imag_part;
        complex_triangle_wave(magn, rFreq, phase, n_values[i], &real_part, &imag_part);
        printf("%lf + j%lf\n", real_part, imag_part);
    }

    return 0;
}

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值