目标: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>
void ippsSin_32f_A24(const float *src, float *dst, int size) {
for (int i = 0; i < size; i++) {
float x = src[i];
float result = 0.0f; // 修改初始值为0
int sign = 1;
float power = x;
float fact = 1;
for (int i = 1; i <= 24; i++) {
result += sign * power / fact;
sign = -sign;
power *= x * x;
fact *= (2 * i) * (2 * i + 1);
}
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 = 0.0f; // 初始值为0
float term = 0.0f;
int sign = 1;
float power = 1;
float fact = 1;
for (int i = 1; i <= 24; i++) {
result += sign * power / fact;
sign = -sign;
power *= x * x;
fact *= (2 * i - 1) * (2 * i);
}
dst[i] = result;
}
}
int main() {
float src[] = {0.0f, 1.0f, 2.0f, 3.0f}; // 输入的单精度浮点数数组
float cosDst[4]; // 存储余弦值的数组
float 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;
}