注:注意数组越界问题。
vDSP_Length和vDSP_Stride数据类型:
typedef unsigned long vDSP_Length;
typedef long vDSP_Stride;
矢量生成 vDSP_vramp方法
extern void vDSP_vramp(
const float *__A,
const float *__B,
float *__C,
vDSP_Stride __IC,
vDSP_Length __N)
__OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_4_0);
方法算法:
for (n = 0; n < N; ++n)
C[n] = A[0] + n*B[0];
函数使用例子:
float A[1]={3},B[1]={2};
float C[8]={0};
printf("input:\n");
printf("A:%f B:%f",A[0],B[0]);
vDSP_vramp(A, B, C, 1,8);
printf("\nvDSP_vramp(A,B,C,1,8) C:\n");
for (int i=0; i<8; i++) {
printf("%f ",C[i]);
C[i]=0;
}
vDSP_vramp(A, B, C, 2,4);
printf("\nvDSP_vramp(A,B,C,2,4) C\n");
for (int i=0; i<8; i++) {
printf("%f ",C[i]);
C[i]=0;
}
vDSP_vramp(A, B, C, 1,4);
printf("\nvDSP_vramp(A,B,C,1,4) C:\n");
for (int i=0; i<8; i++) {
printf("%f ",C[i]);
}
输出结果如下:
input:
A:3.000000 B:2.000000
vDSP_vramp(A,B,C,1,8) C:
3.000000 5.000000 7.000000 9.000000 11.000000 13.000000 15.000000 17.000000
vDSP_vramp(A,B,C,2,4) C
3.000000 0.000000 5.000000 0.000000 7.000000 0.000000 9.000000 0.000000
vDSP_vramp(A,B,C,1,4) C:
3.000000 5.000000 7.000000 9.000000 0.000000 0.000000 0.000000 0.000000
A:3.000000 B:2.000000
vDSP_vramp(A,B,C,1,8) C:
3.000000 5.000000 7.000000 9.000000 11.000000 13.000000 15.000000 17.000000
vDSP_vramp(A,B,C,2,4) C
3.000000 0.000000 5.000000 0.000000 7.000000 0.000000 9.000000 0.000000
vDSP_vramp(A,B,C,1,4) C:
3.000000 5.000000 7.000000 9.000000 0.000000 0.000000 0.000000 0.000000
矢量生成 vDSP_vrampD方法
extern void vDSP_vrampD(
const double *__A,
const double *__B,
double *__C,
vDSP_Stride __IC,
vDSP_Length __N)
__OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_4_0);
方法算法:
for (n = 0; n < N; ++n)
C[n] = A[0] + n*B[0];
矢量生成 vDSP_vrampmul方法
void vDSP_vrampmul(
const float *__I, vDSP_Stride __IS,
float *__Start,
const float *__Step,
float *__O, vDSP_Stride __OS,
vDSP_Length __N)
__OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_4_0);
方法算法:
for (i = 0; i < N; ++i){
O[i*OS] = *Start * I[i*IS];
*Start += *Step;
}
方法使用例子:
float start=0,step=2;
float I[8],O[8]={0};
printf("input:\n");
for(int i=0;i<8;i++){
I[i]=i;
printf("%f ",I[i]);
}
vDSP_vrampmul(I,1, &start, &step, O, 1, 8);
printf("\nvDSP_vrampmul(I,1, &start, &step, O, 1, 8) O:\n");
for(int i=0;i<8;i++){
printf("%f ",O[i]);
O[i]=0;
}
start=0;step=2;
vDSP_vrampmul(I,2, &start, &step, O, 1, 4);
printf("\nvDSP_vrampmul(I,2, &start, &step, O, 1, 4) O:\n");
for(int i=0;i<8;i++){
printf("%f ",O[i]);
O[i]=0;
}
start=0;step=2;
vDSP_vrampmul(I,1, &start, &step, O, 2, 4);
printf("\nvDSP_vrampmul(I,1, &start, &step, O, 2, 4) O:\n");
for(int i=0;i<8;i++){
printf("%f ",O[i]);
O[i]=0;
}
start=0;step=2;
vDSP_vrampmul(I,1, &start, &step, O, 1, 4);
printf("\nvDSP_vrampmul(I,1, &start, &step, O, 1, 4) O:\n");
for(int i=0;i<8;i++){
printf("%f ",O[i]);
}
输出结果:
input:
0.000000 1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000
vDSP_vrampmul(I,1, &start, &step, O, 1, 8) O:
0.000000 2.000000 8.000000 18.000000 32.000000 50.000000 72.000000 98.000000
vDSP_vrampmul(I,2, &start, &step, O, 1, 4) O:
0.000000 4.000000 16.000000 36.000000 0.000000 0.000000 0.000000 0.000000
vDSP_vrampmul(I,1, &start, &step, O, 2, 4) O:
0.000000 0.000000 2.000000 0.000000 8.000000 0.000000 18.000000 0.000000
vDSP_vrampmul(I,1, &start, &step, O, 1, 4) O:
0.000000 2.000000 8.000000 18.000000 0.000000 0.000000 0.000000 0.000000
矢量生成 vDSP_vrampmulD方法
void vDSP_vrampmulD(
const double *__I, vDSP_Stride __IS,
double *__Start,
const double *__Step,
double *__O, vDSP_Stride __OS,
vDSP_Length __N)
__OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0);
vDSP_vrampmulD方法计算方式:
for (i = 0; i < N; ++i){
O[i*OS] = *Start * I[i*IS];
*Start += *Step;
}
矢量生成 vDSP_vrampmul_s1_15方法
void vDSP_vrampmul_s1_15(
const short int *__I, vDSP_Stride __IS,
short int *__Start,
const short int *__Step,
short int *__O, vDSP_Stride __OS,
vDSP_Length __N)
__OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_4_0);
方法算法:
for (i = 0; i < N; ++i){
O[i*OS] = (*Start * I[i*IS])/32768;//(2的15次方32768)
*Start += *Step;
}
short int start=1,step=2;
short int I[8],O[8]={0};
printf("input:\n");
for(short int i=0;i<8;i++){
I[i]=32768/2;
printf("%d ",I[i]);
}
vDSP_vrampmul_s1_15(I,1, &start, &step, O, 1, 8);
printf("\n(I,1, &start, &step, O, 1, 8) O:\n");
for(int i=0;i<8;i++){
printf("%d ",O[i]);
O[i]=0;
}
start=1;step=2;
vDSP_vrampmul_s1_15(I,2, &start, &step, O, 1, 4);
printf("\n(I,2, &start, &step, O, 1, 4) O:\n");
for(int i=0;i<8;i++){
printf("%d ",O[i]);
O[i]=0;
}
start=1;step=2;
vDSP_vrampmul_s1_15(I,1, &start, &step, O, 2, 4);
printf("\n(I,1, &start, &step, O, 2, 4) O:\n");
for(int i=0;i<8;i++){
printf("%d ",O[i]);
O[i]=0;
}
start=1;step=2;
vDSP_vrampmul_s1_15(I,1, &start, &step, O, 1, 4);
printf("\n(I,1, &start, &step, O, 1, 4) O:\n");
for(int i=0;i<8;i++){
printf("%d ",O[i]);
}
打印结果:
input:
16384 16384 16384 16384 16384 16384 16384 16384
(I,1, &start, &step, O, 1, 8) O:
0 1 2 3 4 5 6 7
(I,2, &start, &step, O, 1, 4) O:
0 1 2 3 0 0 0 0
(I,1, &start, &step, O, 2, 4) O:
0 0 1 0 2 0 3 0
(I,1, &start, &step, O, 1, 4) O:
0 1 2 3 0 0 0 0
16384 16384 16384 16384 16384 16384 16384 16384
(I,1, &start, &step, O, 1, 8) O:
0 1 2 3 4 5 6 7
(I,2, &start, &step, O, 1, 4) O:
0 1 2 3 0 0 0 0
(I,1, &start, &step, O, 2, 4) O:
0 0 1 0 2 0 3 0
(I,1, &start, &step, O, 1, 4) O:
0 1 2 3 0 0 0 0
矢量生成 vDSP_vrampmul_s8_24方法
void vDSP_vrampmul_s8_24(
const int *__I, vDSP_Stride __IS,
int *__Start,
const int *__Step,
int *__O, vDSP_Stride __OS,
vDSP_Length __N)
__OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_4_0);
方法算法:
for (i = 0; i < N; ++i){
O[i*OS] = (*Start * I[i*IS])/16777216;//(2的24次方16777216)
*Start += *Step;
}
矢量生成 vDSP_vrampmul2方法
void vDSP_vrampmul2(
const float *__I0, const float *__I1, vDSP_Stride __IS,
float *__Start,
const float *__Step,
float *__O0, float *__O1, vDSP_Stride __OS,
vDSP_Length __N)
__OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_4_0);
方法算法:
for (i = 0; i < N; ++i) {
O0[i*OS] = *Start * I0[i*IS];
O1[i*OS] = *Start * I1[i*IS];
*Start += *Step;
}
矢量生成 vDSP_vrampmul2D方法
void vDSP_vrampmul2D(
const double *__I0, const double *__I1, vDSP_Stride __IS,
double *__Start,
const double *__Step,
double *__O0, double *__O1, vDSP_Stride __OS,
vDSP_Length __N)
__OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0);
方法算法:
for (i = 0; i < N; ++i) {
O0[i*OS] = *Start * I0[i*IS];
O1[i*OS] = *Start * I1[i*IS];
*Start += *Step;
}
矢量生成 vDSP_vrampmul2_s1_15方法
void vDSP_vrampmul2_s1_15(
const short int *__I0, const short int *__I1, vDSP_Stride __IS,
short int *__Start,
const short int *__Step,
short int *__O0, short int *__O1, vDSP_Stride __OS,
vDSP_Length __N)
__OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_4_0);
方法算法:
for (i = 0; i < N; ++i) {
O0[i*OS] = *Start * I0[i*IS]/32768;//2^15=32768
O1[i*OS] = *Start * I1[i*IS]/32768;//2^15=32768
*Start += *Step;
}
<pre name="code" class="objc">
矢量生成 vDSP_vrampmul2_s8_24方法
void vDSP_vrampmul2_s8_24(
const int *__I0, const int *__I1, vDSP_Stride __IS,
int *__Start,
const int *__Step,
int *__O0, int *__O1, vDSP_Stride __OS,
vDSP_Length __N)
__OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_4_0);
方法算法:
for (i = 0; i < N; ++i) {
O0[i*OS] = *Start * I0[i*IS]/16777216;//2^24=16777216
O1[i*OS] = *Start * I1[i*IS]/1677216;//2^24=16777216
*Start += *Step;
}
矢量生成 vDSP_vrampmuladd 方法
void vDSP_vrampmuladd(
const float *__I, vDSP_Stride __IS,
float *__Start,
const float *__Step,
float *__O, vDSP_Stride __OS,
vDSP_Length __N)
__OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_4_0);
方法算法:
for (i = 0; i < N; ++i) {
O[i*OS] += *Start * I[i*IS];
*Start += *Step;
}
例子:
float start=1,step=2;
float I[8],O[8]={0};
printf("input:\n");
for(int i=0;i<8;i++){
I[i]=2;
O[i]=0;
printf("%f ",I[i]);
}
vDSP_vrampmuladd(I,1, &start, &step, O, 1, 8);
printf("\n(I,1, &start, &step, O, 1, 8) O:\n");
for(int i=0;i<8;i++){
printf("%f ",O[i]);
O[i]=1;
}
start=1;step=2;
vDSP_vrampmuladd(I,1, &start, &step, O, 1, 8);
printf("\n(I,1, &start, &step, O, 1, 8) O:\n");
for(int i=0;i<8;i++){
printf("%f ",O[i]);
O[i]=2;
}
start=1;step=2;
vDSP_vrampmuladd(I,1, &start, &step, O, 1, 8);
printf("\n(I,1, &start, &step, O, 1, 8) O:\n");
for(int i=0;i<8;i++){
printf("%f ",O[i]);
O[i]=3;
}
start=1;step=2;
vDSP_vrampmuladd(I,1, &start, &step, O, 1, 8);
printf("\n(I,1, &start, &step, O, 1, 8) O:\n");
for(int i=0;i<8;i++){
printf("%f ",O[i]);
}
输出结果:
input:
2.000000 2.000000 2.000000 2.000000 2.000000 2.000000 2.000000 2.000000
(I,1, &start, &step, O, 1, 8) O:
2.000000 6.000000 10.000000 14.000000 18.000000 22.000000 26.000000 30.000000
(I,1, &start, &step, O, 1, 8) O:
3.000000 7.000000 11.000000 15.000000 19.000000 23.000000 27.000000 31.000000
(I,1, &start, &step, O, 1, 8) O:
4.000000 8.000000 12.000000 16.000000 20.000000 24.000000 28.000000 32.000000
(I,1, &start, &step, O, 1, 8) O:
5.000000 9.000000 13.000000 17.000000 21.000000 25.000000 29.000000 33.000000
矢量生成 vDSP_vrampmuladdD方法
void vDSP_vrampmuladdD(
const double *__I, vDSP_Stride __IS,
double *__Start,
const double *__Step,
double *__O, vDSP_Stride __OS,
vDSP_Length __N)
__OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0);
方法算法:
for (i = 0; i < N; ++i) {
O[i*OS] += *Start * I[i*IS];
*Start += *Step;
}
矢量生成 vDSP_vrampmul_s1_15方法
void vDSP_vrampmuladd_s1_15(
const short int *__I, vDSP_Stride __IS,
short int *__Start,
const short int *__Step,
short int *__O, vDSP_Stride __OS,
vDSP_Length __N)
__OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_4_0);
方法算法:
for (i = 0; i < N; ++i) {
O[i*OS] += (*Start * I[i*IS])/32768;//2^15=32768
*Start += *Step;
}
例子:
short int start=1,step=2;
short int I[8],O[8]={0};
printf("input:\n");
for(int i=0;i<8;i++){
I[i]=32768/2;
O[i]=32768-8;
printf("%d ",I[i]);
}
vDSP_vrampmuladd_s1_15(I,1, &start, &step, O, 1, 8);
printf("\n(I,1, &start, &step, O, 1, 8) O:\n");
for(int i=0;i<8;i++){
printf("%d ",O[i]);
O[i]=32768-9;
}
start=1;step=2;
vDSP_vrampmuladd_s1_15(I,1, &start, &step, O, 1, 8);
printf("\n(I,1, &start, &step, O, 1, 8) O:\n");
for(int i=0;i<8;i++){
printf("%d ",O[i]);
O[i]=32768-10;
}
start=1;step=2;
vDSP_vrampmuladd_s1_15(I,1, &start, &step, O, 1, 8);
printf("\n(I,1, &start, &step, O, 1, 8) O:\n");
for(int i=0;i<8;i++){
printf("%d ",O[i]);
O[i]=32768-100;
}
start=1;step=2;
vDSP_vrampmuladd_s1_15(I,1, &start, &step, O, 1, 8);
printf("\n(I,1, &start, &step, O, 1, 8) O:\n");
for(int i=0;i<8;i++){
printf("%d ",O[i]);
}
输出结果:
input:
16384 16384 16384 16384 16384 16384 16384 16384
(I,1, &start, &step, O, 1, 8) O:
32760 32761 32762 32763 32764 32765 32766 32767
(I,1, &start, &step, O, 1, 8) O:
32759 32760 32761 32762 32763 32764 32765 32766
(I,1, &start, &step, O, 1, 8) O:
32758 32759 32760 32761 32762 32763 32764 32765
(I,1, &start, &step, O, 1, 8) O:
32668 32669 32670 32671 32672 32673 32674 32675
16384 16384 16384 16384 16384 16384 16384 16384
(I,1, &start, &step, O, 1, 8) O:
32760 32761 32762 32763 32764 32765 32766 32767
(I,1, &start, &step, O, 1, 8) O:
32759 32760 32761 32762 32763 32764 32765 32766
(I,1, &start, &step, O, 1, 8) O:
32758 32759 32760 32761 32762 32763 32764 32765
(I,1, &start, &step, O, 1, 8) O:
32668 32669 32670 32671 32672 32673 32674 32675
矢量生成 vDSP_vrampmuladd_s8_24方法
void vDSP_vrampmuladd_s8_24(
const int *__I, vDSP_Stride __IS,
int *__Start,
const int *__Step,
int *__O, vDSP_Stride __OS,
vDSP_Length __N)
__OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_4_0);
方法算法:
for (i = 0; i < N; ++i) {
O[i*OS] += (*Start * I[i*IS])/16777216;//2^24=16777216
*Start += *Step;
}
矢量生成 vDSP_vrampmuladd2方法
void vDSP_vrampmuladd2(
const float *__I0, const float *__I1, vDSP_Stride __IS,
float *__Start,
const float *__Step,
float *__O0, float *__O1, vDSP_Stride __OS,
vDSP_Length __N)
__OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_4_0);
方法算法:
for (i = 0; i < N; ++i){
O0[i*OS] += *Start * I0[i*IS];
O1[i*OS] += *Start * I1[i*IS];
*Start += *Step;
}
矢量生成 vDSP_vrampmuladd2D方法
void vDSP_vrampmuladd2D(
const double *__I0, const double *__I1, vDSP_Stride __IS,
double *__Start,
const double *__Step,
double *__O0, double *__O1, vDSP_Stride __OS,
vDSP_Length __N)
__OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0);
方法算法:
for (i = 0; i < N; ++i){
O0[i*OS] += *Start * I0[i*IS];
O1[i*OS] += *Start * I1[i*IS];
*Start += *Step;
}
矢量生成 vDSP_vrampmul2_s1_15方法
void vDSP_vrampmul2_s1_15(
const short int *__I0, const short int *__I1, vDSP_Stride __IS,
short int *__Start,
const short int *__Step,
short int *__O0, short int *__O1, vDSP_Stride __OS,
vDSP_Length __N)
__OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_4_0);
方法算法:
for (i = 0; i < N; ++i){
O0[i*OS] += *Start * I0[i*IS]/32768;//2^15=32768
O1[i*OS] += *Start * I1[i*IS]/32768;//2^15=32768
*Start += *Step;
}
矢量生成 vDSP_vrampmul2_s8_24方法
void vDSP_vrampmul2_s8_24(
const int *__I0, const int *__I1, vDSP_Stride __IS,
int *__Start,
const int *__Step,
int *__O0, int *__O1, vDSP_Stride __OS,
vDSP_Length __N)
__OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_4_0);
方法算法:
for (i = 0; i < N; ++i){
O0[i*OS] += *Start * I0[i*IS]/16777216;//2^24=16777216
O1[i*OS] += *Start * I1[i*IS]/16777216;//2^24=16777216
*Start += *Step;
}
矢量生成 vDSP_vgen方法 生成锥形轨道
extern void vDSP_vgen(
const float *__A,
const float *__B,
float *__C,
vDSP_Stride __IC,
vDSP_Length __N)
__OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_4_0);
方法算法:
for (n = 0; n < N; ++n)
C[n] = A[0] + (B[0] - A[0]) * n/(N-1);
例子:
float A[1]={1},B[1]={3};
float C[16]={0};
printf("input:\n");
printf("A:%f B:%f",A[0],B[0]);
vDSP_vgen(A, B, C, 1,8);
printf("\nvDSP_vgen(A,B,C,1,8) C:\n");
for (int i=0; i<8; i++) {
printf("%f ",C[i]);
C[i]=0;
}
vDSP_vgen(A, B, C, 2,8);
printf("\nvDSP_vgen(A,B,C,2,8) C\n");
for (int i=0; i<8; i++) {
printf("%f ",C[i]);
C[i]=0;
}
输出结果:
input:
A:1.000000 B:3.000000
vDSP_vgen(A,B,C,1,8) C:
1.000000 1.285714 1.571429 1.857143 2.142857 2.428571 2.714286 3.000000
vDSP_vgen(A,B,C,2,4) C
1.000000 0.000000 1.285714 0.000000 1.571429 0.000000 1.857143 0.000000
A:1.000000 B:3.000000
vDSP_vgen(A,B,C,1,8) C:
1.000000 1.285714 1.571429 1.857143 2.142857 2.428571 2.714286 3.000000
vDSP_vgen(A,B,C,2,4) C
1.000000 0.000000 1.285714 0.000000 1.571429 0.000000 1.857143 0.000000
矢量生成 vDSP_vgenD方法 生成锥形轨道
extern void vDSP_vgenD(
const double *__A,
const double *__B,
double *__C,
vDSP_Stride __IC,
vDSP_Length __N)
__OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_4_0);
方法算法:
for (n = 0; n < N; ++n)
C[n] = A[0] + (B[0] - A[0]) * n/(N-1);
矢量生成 vDSP_vgenp方法 生成外推和插值
注:M是A、B的长
extern void vDSP_vgenp(
const float *__A,
vDSP_Stride __IA,
const float *__B,
vDSP_Stride __IB,
float *__C,
vDSP_Stride __IC,
vDSP_Length __N,
vDSP_Length __M) // Length of A and of B.
__OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_4_0);
方法算法
for (n = 0; n < N; ++n)
If n <= B[0], then C[n] = A[0].
If B[M-1] < n, then C[n] = A[M-1].
Otherwise:
Let m be such that B[m] < n <= B[m+1].
C[n] = A[m] + (A[m+1]-A[m]) * (n-B[m]) / (B[m+1]-B[m]).
矢量生成 vDSP_vgenpD方法 生成外推和插值
注:M是A、B的长 A,B
extern void vDSP_vgenpD(
const double *__A,
vDSP_Stride __IA,
const double *__B,
vDSP_Stride __IB,
double *__C,
vDSP_Stride __IC,
vDSP_Length __N,
vDSP_Length __M) // Length of A and of B.
__OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_4_0);
方法算法
for (n = 0; n < N; ++n)
If n <= B[0], then C[n] = A[0].
If B[M-1] < n, then C[n] = A[M-1].
Otherwise:
Let m be such that B[m] < n <= B[m+1].
C[n] = A[m] + (A[m+1]-A[m]) * (n-B[m]) / (B[m+1]-B[m]).
矢量生成 vDSP_vtabi方法 矢量查表和插值
extern void vDSP_vtabi(
const float *__A,
vDSP_Stride __IA,
const float *__S1,
const float *__S2,
const float *__C,
vDSP_Length __M,
float *__D,
vDSP_Stride __ID,
vDSP_Length __N)
__OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_4_0);
方法算法:
for (n = 0; n < N; ++n){
p = S1[0] * A[n] + S2[0];
if (p < 0)
D[n] = C[0];
else if (p < M-1){
q = trunc(p);
r = p-q;
D[n] = (1-r)*C[q] + r*C[q+1];
}
else
D[n] = C[M-1];
}
矢量生成 vDSP_vtabiD方法 矢量查表和插值
extern void vDSP_vtabiD(
const double *__A,
vDSP_Stride __IA,
const double *__S1,
const double *__S2,
const double *__C,
vDSP_Length __M,
double *__ID,
vDSP_Stride __L,
vDSP_Length __N)
__OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_4_0);
方法算法:
for (n = 0; n < N; ++n){
p = S1[0] * A[n] + S2[0];
if (p < 0)
D[n] = C[0];
else if (p < M-1){
q = trunc(p);
r = p-q;
D[n] = (1-r)*C[q] + r*C[q+1];
}
else
D[n] = C[M-1];
}