C/C++实现合成地震记录

本实例将从波阻抗模型中获得与之对应的反射系数,再将反射系数与子波褶积得到合成地震记录。

1 由波阻抗获取反射系数

地震波在介质中传播时,作用于某个面积上的压力与单位时间内垂直通过此面积的质点流量(即面积乘质点振动速度)之比,具有阻力的含义,称为波阻抗,其数值等于介质密度\(\rho\)与波速\(v\)的乘积,即\(Z=\rho v\)。波阻抗差异形成地震反射,用反射系数表征上下界面差异,公式为

\[{r} = \frac{{{Z_2} - {Z_1}}}{{{Z_2} + {Z_1}}} = \frac{{{\rho _2}{v_2} - {\rho _1}{v_1}}}{{{\rho _2}{v_2} + {\rho _1}{v_1}}}\\Z_2=Z_1\frac{{1 + r}}{{1 - r}}\\
Z_{2}=Z_{1} \exp \left[\ln \left(\frac{1+r_{}}{1-r_{}}\right)\right]
\]

在实际情况下,反射系数\(r\)一般远远小于 1,即 \(r \ll 1\) 。则有如下关系:

\[\ln \left(\frac{1+r_{}}{1-r_{}}\right) \approx 2 r_{}
\]

上式可化为:

\[Z_{2} \approx Z_{1} e^{2 r}
\\ r_1=\frac{1}{2}(\ln Z_2-\ln Z_1)
\]

于是,通过对上下两层波阻抗的对数值作差,就能由此得到对应的反射系数。

将上式用矩阵的形式表示为:

\[{\left[ {\begin{array}{*{20}{c}}
{ - \frac{1}{2}}&{\frac{1}{2}}&{}&{}&{}&{}\\
{}&{ - \frac{1}{2}}&{\frac{1}{2}}&{}&{}&{}\\
{}&{}& \ddots & \ddots &{}&{}\\
{}&{}&{}&{ - \frac{1}{2}}&{\frac{1}{2}}&{}\\
{}&{}&{}&{}&{ - \frac{1}{2}}&{\frac{1}{2}}
\end{array}} \right]_{(n - 1) \times n}}\left[ {\begin{array}{*{20}{c}}
{\begin{array}{*{20}{c}}
{\begin{array}{*{20}{c}}
{{\ln Z_1}}\\
{{\ln Z_2}}
\end{array}}\\
\vdots \\
{{\ln Z_{n-1}}}
\end{array}}\\
{{\ln Z_{n}}}
\end{array}} \right]_{n\times 1} = \left[ {\begin{array}{*{20}{c}}
{\begin{array}{*{20}{c}}
{\begin{array}{*{20}{c}}
{{r_1}}\\
{{r_1}}
\end{array}}\\
\vdots \\
{{r_{n-2}}}
\end{array}}\\
{{r_{n-1}}}
\end{array}} \right]_{(n-1)\times 1}
\]

容易看出整个实现过程,先是对波阻抗序列求对数,之后左乘差分矩阵,便能够得到反射系数矩阵(长度=\(n-1\))

代码如下:

/*
输入:
波阻抗 float* Imp
波阻抗序列长度 int nt 输出:
反射系数 float* Rcs
*/ void Compute_Rcs(float *Imp, float* Rcs, int LenImp) { float **Diff = NULL;
float *LnImp = NULL; Diff = alloc2float(LenImp - 1, LenImp); //差分矩阵
LnImp = (float*)calloc(LenImp, sizeof(float)); //波阻抗对数值 for (int i = 0; i < LenImp - 1; i++) {
for (int j = 0; j < LenImp; j++) {
if (i == j) { //当矩阵行列下标相等(i=j)时,取值为-0.5
Diff[i][j] = -0.5;
}
else if (i == j - 1) { //当矩阵下标i=j-1时,取值为0.5
Diff[i][j] = 0.5;
}
else { //其他情况,值为0
Diff[i][j] = 0;
}
}
} for (int i = 0; i < LenImp; i++) {
LnImp[i] = log(Imp[i]); //取对数
} matrixMultilcation(Diff, LnImp, Rcs, LenImp, LenImp - 1); //矩阵乘法 }

2 褶积模型

地震道可以用褶积模型描述:

\[S(t) =w(t) *r(t)
\]

其中\(S(t)\)为地震道,\(w(t)\)为地震子波,\(r(t)\)为反射系数。震源在地表激发的时候震源在地表激发的时刻,地震子波被认为是一个尖脉冲信号。如果这个脉冲在传播过程中能量和波形均保持不变,那么地震记录就是反射系数剖面。而实际上子波在传播过程中,由于受球面扩散和吸收衰减的影响,并非严格的尖脉冲信号。

在本次实例中,使用的子波有以下三种:

/*
函数功能:
-由反射系数褶积地震子波,得到合成地震记录 输入:
-反射系数序列 float *Rcs
-反射系数长度 int LenRcs
-子波类型 int WaveletType
-子波长度 int WaveletLenTemp
-子波采样间隔 int WaveletInc 输出:
-合成地震记录 float *Syn
*/ void Rcs2Syn(float *Rcs, float *Syn, int LenRcs, int WaveletType, int WaveletLenTemp, int WaveletInc) { float WaveletAmp = 1.0;
int WaveletLen = WaveletLenTemp /WaveletInc;
float *WaveletValue = NULL;
float *WaveletTime = NULL;
WaveletValue = (float*)calloc(WaveletLen, sizeof(float));
WaveletTime = (float*)calloc(WaveletLen, sizeof(float)); switch (WaveletType) {
case 1:
// type==1 雷克子波
parameterRicker Ricker_para;
Ricker_para.DomainFreq = 30; Ricker(WaveletLen / 2, WaveletLen, WaveletInc / 1000.f,
Ricker_para.DomainFreq, WaveletValue, WaveletTime, WaveletAmp);
break;
case 2:
//type==2 Yu's子波
parameterYus Yus_para;
Yus_para.QFreq = 60.0;
Yus_para.PFreq = 10.0;
Double_Ricker(WaveletLen / 2, WaveletLen, WaveletInc / 1000.f, Yus_para.QFreq, Yus_para.PFreq,
WaveletValue, WaveletTime, WaveletAmp);
break;
case 3:
//type==3 双余弦子波
parameterDoubleCos DoubleCos_para;
DoubleCos_para.HighCut = 80;
DoubleCos_para.HighPass = 60;
DoubleCos_para.LowCut = 8;
DoubleCos_para.LowPass = 12; int nK = getK(WaveletLen);
int SpecLen = (int)pow(2.0, nK - 1);
float FreqInc = 1000.0 / (2.0 * WaveletInc * SpecLen);
int ThickRatio = 8;
int DoubleCosSpecLen = int(SpecLen * 2 * ThickRatio);
float *DoubleCosFreq = NULL;
float *DoubleCosSpec = NULL; DoubleCosFreq = (float*)calloc(DoubleCosSpecLen, sizeof(float));
DoubleCosSpec = (float*)calloc(DoubleCosSpecLen, sizeof(float)); DoubleCos_Spec(DoubleCosSpecLen, FreqInc / ThickRatio, DoubleCos_para.LowCut, DoubleCos_para.LowPass,
DoubleCos_para.HighPass, DoubleCos_para.HighCut, DoubleCosFreq, DoubleCosSpec, WaveletAmp); DoubleCos_Wavelet(DoubleCosSpec, DoubleCosSpecLen, nK, ThickRatio, WaveletLen / 2, WaveletLen, WaveletInc / 1000.0,
WaveletTime, WaveletValue, 1.0); free(DoubleCosFreq);
free(DoubleCosSpec);
break;
} float *Signal = NULL;
int lenSignal = WaveletLen + LenRcs - 1;
Signal = (float*)calloc(lenSignal, sizeof(float)); convolve_cwp(LenRcs, 0, Rcs, WaveletLen, 0, WaveletValue, lenSignal, 0, Signal); //卷积 memcpy(Syn, Signal + (WaveletLen - 1) / 2, (LenRcs) * sizeof(float)); //赋值 free(WaveletValue);
free(WaveletTime);
free(Signal); }

3 主函数

输入的波阻抗数据将被转换为合成记录:

int main(){

	const char *filenameInput = "Imp.segy";		//输入segy文件
const char *filenameOutput = "Syn.segy"; //输出segy文件 bhed fileheader;
segy traceheader;
unsigned int nt = 0;
unsigned int sizefileheader = sizeof(fileheader);
unsigned int sizetraceheader = sizeof(traceheader);
unsigned int ncdp = 0;
long long size_file = 0;
long long size_trace = 0; FILE *fpinput = NULL;
FILE *fpoutput = NULL;
float *dataInput = NULL;
float *dataOutput = NULL; fpinput = fopen(filenameInput, "rb");
fpoutput = fopen(filenameOutput, "wb"); if (fpinput == NULL) {
printf("can not open %s file\n", filenameInput);
return false;
} if (fpoutput == NULL) {
printf("can not open %s file\n", filenameOutput);
return false;
} fread(&fileheader, sizefileheader, 1, fpinput); nt = fileheader.hns;
_fseeki64(fpinput, 0, SEEK_END);
size_file = _ftelli64(fpinput);
size_trace = nt * sizeof(float) + sizetraceheader; ncdp = (size_file - (long long)sizefileheader) / size_trace; _fseeki64(fpinput, sizefileheader, SEEK_SET); fwrite(&fileheader, sizefileheader, 1, fpoutput); dataInput = (float*)calloc(nt, sizeof(float));
/****************以上为segy文件的读入*****************/ int WaveletLenTemp = 128; //子波长度
int WaveletInc = 1; //子波间隔
int WaveletType = 1; //选择子波类型,此处为Ricker //遍历每一道
for (int itrace = 0; itrace < ncdp; itrace++)
{
fread(&traceheader, sizetraceheader, 1, fpinput);
fread(dataInput, nt * sizeof(float), 1, fpinput); //预处理
int *start_end = NULL;
start_end = (int*)calloc(2, sizeof(int));
Preprocessing(dataInput, nt, start_end);//Preprocessing的作用是屏蔽0值和明显的异常值,读取有值的部分
int Start = 0;
int End = 0;
int LenImp = 0;
Start = start_end[0]; //获取有值部分的开始和结尾
End = start_end[1];
LenImp = End - Start + 1;
int Boundary = 3; //为了防止边界出现假轴,将波阻抗稍微延长出一部分
int LenImp_ex = LenImp + Boundary * 2; float *Imp = NULL;
float *Rcs = NULL;
float *syn = NULL; Imp = (float*)calloc(LenImp_ex , sizeof(float));
Rcs = (float*)calloc(LenImp_ex - 1, sizeof(float));
syn = (float*)calloc(LenImp_ex - 1, sizeof(float)); for (int i = Boundary; i < LenImp+Boundary; i++) {
Imp[i] = dataInput[Start-Boundary + i];
}
//上边界
for (int i = 0; i < Boundary; i++) {
Imp[i] = dataInput[Start];
}
//下边界
for (int i = LenImp+Boundary; i < LenImp + Boundary * 2; i++) {
Imp[i] = dataInput[End];
}
//第一步,计算反射系数
Compute_Rcs(Imp,Rcs,LenImp); //第二步,反射系数褶积子波,得到合成记录
Rcs2Syn(Rcs,syn, LenImp_ex - 1, WaveletType, WaveletLenTemp, WaveletInc); dataOutput = (float*)calloc(nt, sizeof(float));
for (int i = 0; i < LenImp; i++) {
dataOutput[Start + i] = syn[i + Boundary]; //传入合成记录
}
//写入segy
fwrite(&traceheader, sizetraceheader, 1, fpoutput);
fwrite(dataOutput, nt * sizeof(float), 1, fpoutput);
free(start_end);
free(Imp);
free(Rcs);
free(syn);
}
free(dataInput);
free(dataOutput); fclose(fpinput);
fclose(fpoutput); return 0;
}

完整代码

I fundamental.h

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h> #include<iostream>
#include<vector>
#include<algorithm> #include"complex.h"
#include"alloc.h" void matrixMultilcation(float **data1, float *data2, float *dataOut, int c, int m); //矩阵乘法
void convolve_cwp(int lx, int ifx, float *x,
int ly, int ify, float *y,
int lz, int ifz, float *z); //褶积
int getK(int N); //求2的K次方
void kkfft(float *pr, float *pi, int n, int k, float *fr, float *fi, int l, int il);//傅氏变换

II fundamental.cpp

#include "fundamental.h"

// 矩阵乘法
// data1 m行c列
//data2 c行1列
void matrixMultilcation(float **data1, float *data2, float *dataOut, int c, int m) { float sumTemp = 0;
for (int i = 0; i < m; i++) {
sumTemp = 0;
for (int k = 0; k < c; k++) {
sumTemp += data1[i][k] * data2[k];
}
dataOut[i] = sumTemp;
}
} // 满足2^k>=N的最小k值,返回k值
int getK(int N)
{
int k, temp = 1; for (k = 1; k < N; k++)
{
temp *= 2; if (temp >= N)
{
break;
}
} return k;
} void kkfft(float *pr, float *pi, int n, int k, float *fr, float *fi, int l, int il)
{
int it, m, is, i, j, nv, l0;
float p, q, s, vr, vi, poddr, poddi; for (it = 0; it <= n - 1; it++)
{
m = it;
is = 0; for (i = 0; i <= k - 1; i++)
{
j = m / 2;
is = 2 * is + (m - 2 * j);
m = j;
} fr[it] = pr[is];
fi[it] = pi[is];
} pr[0] = 1.0;
pi[0] = 0.0;
p = 6.283185306 / (1.0 * n);
pr[1] = cos(p);
pi[1] = -sin(p); if (l != 0)
{
pi[1] = -pi[1];
} for (i = 2; i <= n - 1; i++)
{
p = pr[i - 1] * pr[1];
q = pi[i - 1] * pi[1];
s = (pr[i - 1] + pi[i - 1]) * (pr[1] + pi[1]);
pr[i] = p - q;
pi[i] = s - p - q;
} for (it = 0; it <= n - 2; it = it + 2)
{
vr = fr[it];
vi = fi[it];
fr[it] = vr + fr[it + 1];
fi[it] = vi + fi[it + 1];
fr[it + 1] = vr - fr[it + 1];
fi[it + 1] = vi - fi[it + 1];
} m = n / 2;
nv = 2; for (l0 = k - 2; l0 >= 0; l0--)
{
m = m / 2;
nv = 2 * nv; for (it = 0; it <= (m - 1)*nv; it = it + nv)
{
for (j = 0; j <= (nv / 2) - 1; j++)
{
p = pr[m * j] * fr[it + j + nv / 2];
q = pi[m * j] * fi[it + j + nv / 2];
s = pr[m * j] + pi[m * j];
s = s * (fr[it + j + nv / 2] + fi[it + j + nv / 2]);
poddr = p - q;
poddi = s - p - q;
fr[it + j + nv / 2] = fr[it + j] - poddr;
fi[it + j + nv / 2] = fi[it + j] - poddi;
fr[it + j] = fr[it + j] + poddr;
fi[it + j] = fi[it + j] + poddi;
}
}
} if (l != 0)
{
for (i = 0; i <= n - 1; i++)
{
fr[i] = fr[i] / (1.0 * n);
fi[i] = fi[i] / (1.0 * n);
} if (il != 0)
{
for (i = 0; i <= n - 1; i++)
{
pr[i] = sqrt(fr[i] * fr[i] + fi[i] * fi[i]); if (fabs(fr[i]) < 0.000001 * fabs(fi[i]))
{
if ((fi[i] * fr[i]) > 0)
{
pi[i] = 90.0;
}
else
{
pi[i] = -90.0;
}
}
else
{
pi[i] = atan(fi[i] / fr[i]) * 360.0 / 6.283185306;
}
}
}
} return;
}

III convolution.cpp

/******************************************************************************
Input:
lx length of x array
ifx sample index of first x
x array[lx] to be convolved with y
ly length of y array
ify sample index of first y
y array[ly] with which x is to be convolved
lz length of z array
ifz sample index of first z Output:
z array[lz] containing x convolved with y ******************************************************************************/ #include"fundamental.h" /* prototype of function used internally */
static void convolve_cwp_s(int, int, float*, int, int, float*, int, int, float*); void convolve_cwp(int lx, int ifx, float *x,
int ly, int ify, float *y,
int lz, int ifz, float *z) #ifdef SIMPLE_CONV
{
int ilx = ifx + lx - 1, ily = ify + ly - 1, ilz = ifz + lz - 1, i, j, jlow, jhigh;
float sum; x -= ifx; y -= ify; z -= ifz;
for (i = ifz; i <= ilz; ++i) {
jlow = i - ily; if (jlow < ifx) jlow = ifx;
jhigh = i - ify; if (jhigh > ilx) jhigh = ilx;
for (j = jlow, sum = 0.0; j <= jhigh; ++j)
sum += x[j] * y[i - j];
z[i] = sum;
}
}
#else
{
int ilx = ifx + lx - 1, ily = ify + ly - 1, ilz = ifz + lz - 1,
i, j, ilow, ihigh, jlow, jhigh;
float sa, sb, xa, xb, ya, yb, *t; /* if x is longer than y, swap x and y */
if (lx > ly) {
i = ifx; ifx = ify; ify = i;
i = ilx; ilx = ily; ily = i;
i = lx; lx = ly; ly = i;
t = x; x = y; y = t;
} /* handle short x with special code */
if (lx >= 1 && lx <= 30) {
convolve_cwp_s(lx, ifx, x, ly, ify, y, lz, ifz, z);
return;
} /* adjust pointers for indices of first samples */
x -= ifx;
y -= ify;
z -= ifz; /* OFF LEFT: i < ify+ifx */ /* zero output for all i */
ilow = ifz;
ihigh = ify + ifx - 1; if (ihigh > ilz) ihigh = ilz;
for (i = ilow; i <= ihigh; ++i)
z[i] = 0.0; /* ROLLING ON: ify+ifx <= i < ify+ilx */ /* if necessary, do one i so that number of j in overlap is odd */
if (i < ify + ilx && i <= ilz) {
jlow = ifx;
jhigh = i - ify;
if ((jhigh - jlow) % 2) {
sa = 0.0;
for (j = jlow; j <= jhigh; ++j)
sa += x[j] * y[i - j];
z[i++] = sa;
}
} /* loop over pairs of i and j */
ilow = i;
ihigh = ilx + ify - 1; if (ihigh > ilz) ihigh = ilz;
jlow = ifx;
jhigh = ilow - ify;
for (i = ilow; i < ihigh; i += 2, jhigh += 2) {
sa = sb = 0.0;
xb = x[jhigh + 1];
yb = 0.0;
for (j = jhigh; j >= jlow; j -= 2) {
sa += xb * yb;
ya = y[i - j];
sb += xb * ya;
xa = x[j];
sa += xa * ya;
yb = y[i + 1 - j];
sb += xa * yb;
xb = x[j - 1];
}
z[i] = sa;
z[i + 1] = sb;
} /* if number of i is odd */
if (i == ihigh) {
jlow = ifx;
jhigh = i - ify;
sa = 0.0;
for (j = jlow; j <= jhigh; ++j)
sa += x[j] * y[i - j];
z[i++] = sa;
} /* MIDDLE: ify+ilx <= i <= ily+ifx */ /* determine limits for i and j */
ilow = i;
ihigh = ily + ifx; if (ihigh > ilz) ihigh = ilz;
jlow = ifx;
jhigh = ilx; /* if number of j is even, do j in pairs with no leftover */
if ((jhigh - jlow) % 2) {
for (i = ilow; i < ihigh; i += 2) {
sa = sb = 0.0;
yb = y[i + 1 - jlow];
xa = x[jlow];
for (j = jlow; j < jhigh; j += 2) {
sb += xa * yb;
ya = y[i - j];
sa += xa * ya;
xb = x[j + 1];
sb += xb * ya;
yb = y[i - 1 - j];
sa += xb * yb;
xa = x[j + 2];
}
z[i] = sa;
z[i + 1] = sb;
} /* else, number of j is odd, so do j in pairs with leftover */
}
else {
for (i = ilow; i < ihigh; i += 2) {
sa = sb = 0.0;
yb = y[i + 1 - jlow];
xa = x[jlow];
for (j = jlow; j < jhigh; j += 2) {
sb += xa * yb;
ya = y[i - j];
sa += xa * ya;
xb = x[j + 1];
sb += xb * ya;
yb = y[i - 1 - j];
sa += xb * yb;
xa = x[j + 2];
}
z[i] = sa + x[jhigh] * y[i - jhigh];
z[i + 1] = sb + x[jhigh] * y[i + 1 - jhigh];
}
} /* if number of i is odd */
if (i == ihigh) {
sa = 0.0;
for (j = jlow; j <= jhigh; ++j)
sa += x[j] * y[i - j];
z[i++] = sa;
} /* ROLLING OFF: ily+ifx < i <= ily+ilx */ /* if necessary, do one i so that number of j in overlap is even */
if (i <= ily + ilx && i <= ilz) {
jlow = i - ily;
jhigh = ilx;
if (!((jhigh - jlow) % 2)) {
sa = 0.0;
for (j = jlow; j <= jhigh; ++j)
sa += x[j] * y[i - j];
z[i++] = sa;
}
} /* number of j is now even, so loop over both i and j in pairs */
ilow = i;
ihigh = ily + ilx; if (ihigh > ilz) ihigh = ilz;
jlow = ilow - ily;
jhigh = ilx - 2; /* Dave's new patch */
for (i = ilow; i < ihigh; i += 2, jlow += 2) {
sa = sb = 0.0;
xa = x[jlow];
yb = 0.0;
for (j = jlow; j < jhigh; j += 2) {
sb += xa * yb;
ya = y[i - j];
sa += xa * ya;
xb = x[j + 1];
sb += xb * ya;
yb = y[i - 1 - j];
sa += xb * yb;
xa = x[j + 2];
}
sb += xa * yb;
ya = y[i - j];
sa += xa * ya;
xb = x[j + 1];
sb += xb * ya;
yb = y[i - 1 - j];
sa += xb * yb;
z[i] = sa;
z[i + 1] = sb;
} /* if number of i is odd */
if (i == ihigh) {
jlow = i - ily;
jhigh = ilx;
sa = 0.0;
for (j = jlow; j <= jhigh; ++j)
sa += x[j] * y[i - j];
z[i++] = sa;
} /* OFF RIGHT: ily+ilx < i */ /* zero output for all i */
ilow = i;
ihigh = ilz;
for (i = ilow; i <= ihigh; ++i)
z[i] = 0.0;
} /* internal function optimized for short x */
static void convolve_cwp_s(int lx, int ifx, float *x,
int ly, int ify, float *y,
int lz, int ifz, float *z)
{
int ilx = ifx + lx - 1, ily = ify + ly - 1, ilz = ifz + lz - 1,
i, j, ilow, ihigh, jlow, jhigh;
float x0, x1, x2, x3, x4, x5, x6, x7, x8, x9,
x10, x11, x12, x13, x14, x15, x16, x17, x18, x19,
x20, x21, x22, x23, x24, x25, x26, x27, x28, x29,
ya, yb, z0, z1, sum; x -= ifx;
y -= ify;
z -= ifz; /* OFF LEFT: i < ifx+ify */
ilow = ifz;
ihigh = ify + ifx - 1; if (ihigh > ilz) ihigh = ilz;
for (i = ilow; i <= ihigh; ++i)
z[i] = 0.0; /* ROLLING ON: ify+ifx <= i < ify+ilx */
ilow = ify + ifx; if (ilow < ifz) ilow = ifz;
ihigh = ify + ilx - 1; if (ihigh > ilz) ihigh = ilz;
jlow = ifx;
jhigh = ilow - ify;
for (i = ilow; i <= ihigh; ++i, ++jhigh) {
for (j = jlow, sum = 0.0; j <= jhigh; ++j)
sum += x[j] * y[i - j];
z[i] = sum;
} /* MIDDLE: ify+ilx <= i <= ily+ifx */
ilow = ify + ilx; if (ilow < ifz) ilow = ifz;
ihigh = ily + ifx; if (ihigh > ilz) ihigh = ilz;
if (lx == 1) {
x0 = x[ifx];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb;
z[i + 1] = z1;
z[i] = z0;
}
}
else if (lx == 2) {
x0 = x[ifx];
x1 = x[ifx + 1];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb; z1 += x1 * yb;
ya = y[i - ifx - 1]; z0 += x1 * ya;
z[i + 1] = z1;
z[i] = z0;
}
}
else if (lx == 3) {
x0 = x[ifx];
x1 = x[ifx + 1];
x2 = x[ifx + 2];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb; z1 += x1 * yb;
ya = y[i - ifx - 1]; z0 += x1 * ya; z1 += x2 * ya;
yb = y[i - ifx - 2]; z0 += x2 * yb;
z[i + 1] = z1;
z[i] = z0;
}
}
else if (lx == 4) {
x0 = x[ifx];
x1 = x[ifx + 1];
x2 = x[ifx + 2];
x3 = x[ifx + 3];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb; z1 += x1 * yb;
ya = y[i - ifx - 1]; z0 += x1 * ya; z1 += x2 * ya;
yb = y[i - ifx - 2]; z0 += x2 * yb; z1 += x3 * yb;
ya = y[i - ifx - 3]; z0 += x3 * ya;
z[i + 1] = z1;
z[i] = z0;
}
}
else if (lx == 5) {
x0 = x[ifx];
x1 = x[ifx + 1];
x2 = x[ifx + 2];
x3 = x[ifx + 3];
x4 = x[ifx + 4];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb; z1 += x1 * yb;
ya = y[i - ifx - 1]; z0 += x1 * ya; z1 += x2 * ya;
yb = y[i - ifx - 2]; z0 += x2 * yb; z1 += x3 * yb;
ya = y[i - ifx - 3]; z0 += x3 * ya; z1 += x4 * ya;
yb = y[i - ifx - 4]; z0 += x4 * yb;
z[i + 1] = z1;
z[i] = z0;
}
}
else if (lx == 6) {
x0 = x[ifx];
x1 = x[ifx + 1];
x2 = x[ifx + 2];
x3 = x[ifx + 3];
x4 = x[ifx + 4];
x5 = x[ifx + 5];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb; z1 += x1 * yb;
ya = y[i - ifx - 1]; z0 += x1 * ya; z1 += x2 * ya;
yb = y[i - ifx - 2]; z0 += x2 * yb; z1 += x3 * yb;
ya = y[i - ifx - 3]; z0 += x3 * ya; z1 += x4 * ya;
yb = y[i - ifx - 4]; z0 += x4 * yb; z1 += x5 * yb;
ya = y[i - ifx - 5]; z0 += x5 * ya;
z[i + 1] = z1;
z[i] = z0;
}
}
else if (lx == 7) {
x0 = x[ifx];
x1 = x[ifx + 1];
x2 = x[ifx + 2];
x3 = x[ifx + 3];
x4 = x[ifx + 4];
x5 = x[ifx + 5];
x6 = x[ifx + 6];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb; z1 += x1 * yb;
ya = y[i - ifx - 1]; z0 += x1 * ya; z1 += x2 * ya;
yb = y[i - ifx - 2]; z0 += x2 * yb; z1 += x3 * yb;
ya = y[i - ifx - 3]; z0 += x3 * ya; z1 += x4 * ya;
yb = y[i - ifx - 4]; z0 += x4 * yb; z1 += x5 * yb;
ya = y[i - ifx - 5]; z0 += x5 * ya; z1 += x6 * ya;
yb = y[i - ifx - 6]; z0 += x6 * yb;
z[i + 1] = z1;
z[i] = z0;
}
}
else if (lx == 8) {
x0 = x[ifx];
x1 = x[ifx + 1];
x2 = x[ifx + 2];
x3 = x[ifx + 3];
x4 = x[ifx + 4];
x5 = x[ifx + 5];
x6 = x[ifx + 6];
x7 = x[ifx + 7];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb; z1 += x1 * yb;
ya = y[i - ifx - 1]; z0 += x1 * ya; z1 += x2 * ya;
yb = y[i - ifx - 2]; z0 += x2 * yb; z1 += x3 * yb;
ya = y[i - ifx - 3]; z0 += x3 * ya; z1 += x4 * ya;
yb = y[i - ifx - 4]; z0 += x4 * yb; z1 += x5 * yb;
ya = y[i - ifx - 5]; z0 += x5 * ya; z1 += x6 * ya;
yb = y[i - ifx - 6]; z0 += x6 * yb; z1 += x7 * yb;
ya = y[i - ifx - 7]; z0 += x7 * ya;
z[i + 1] = z1;
z[i] = z0;
}
}
else if (lx == 9) {
x0 = x[ifx];
x1 = x[ifx + 1];
x2 = x[ifx + 2];
x3 = x[ifx + 3];
x4 = x[ifx + 4];
x5 = x[ifx + 5];
x6 = x[ifx + 6];
x7 = x[ifx + 7];
x8 = x[ifx + 8];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb; z1 += x1 * yb;
ya = y[i - ifx - 1]; z0 += x1 * ya; z1 += x2 * ya;
yb = y[i - ifx - 2]; z0 += x2 * yb; z1 += x3 * yb;
ya = y[i - ifx - 3]; z0 += x3 * ya; z1 += x4 * ya;
yb = y[i - ifx - 4]; z0 += x4 * yb; z1 += x5 * yb;
ya = y[i - ifx - 5]; z0 += x5 * ya; z1 += x6 * ya;
yb = y[i - ifx - 6]; z0 += x6 * yb; z1 += x7 * yb;
ya = y[i - ifx - 7]; z0 += x7 * ya; z1 += x8 * ya;
yb = y[i - ifx - 8]; z0 += x8 * yb;
z[i + 1] = z1;
z[i] = z0;
}
}
else if (lx == 10) {
x0 = x[ifx];
x1 = x[ifx + 1];
x2 = x[ifx + 2];
x3 = x[ifx + 3];
x4 = x[ifx + 4];
x5 = x[ifx + 5];
x6 = x[ifx + 6];
x7 = x[ifx + 7];
x8 = x[ifx + 8];
x9 = x[ifx + 9];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb; z1 += x1 * yb;
ya = y[i - ifx - 1]; z0 += x1 * ya; z1 += x2 * ya;
yb = y[i - ifx - 2]; z0 += x2 * yb; z1 += x3 * yb;
ya = y[i - ifx - 3]; z0 += x3 * ya; z1 += x4 * ya;
yb = y[i - ifx - 4]; z0 += x4 * yb; z1 += x5 * yb;
ya = y[i - ifx - 5]; z0 += x5 * ya; z1 += x6 * ya;
yb = y[i - ifx - 6]; z0 += x6 * yb; z1 += x7 * yb;
ya = y[i - ifx - 7]; z0 += x7 * ya; z1 += x8 * ya;
yb = y[i - ifx - 8]; z0 += x8 * yb; z1 += x9 * yb;
ya = y[i - ifx - 9]; z0 += x9 * ya;
z[i + 1] = z1;
z[i] = z0;
}
}
else if (lx == 11) {
x0 = x[ifx];
x1 = x[ifx + 1];
x2 = x[ifx + 2];
x3 = x[ifx + 3];
x4 = x[ifx + 4];
x5 = x[ifx + 5];
x6 = x[ifx + 6];
x7 = x[ifx + 7];
x8 = x[ifx + 8];
x9 = x[ifx + 9];
x10 = x[ifx + 10];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb; z1 += x1 * yb;
ya = y[i - ifx - 1]; z0 += x1 * ya; z1 += x2 * ya;
yb = y[i - ifx - 2]; z0 += x2 * yb; z1 += x3 * yb;
ya = y[i - ifx - 3]; z0 += x3 * ya; z1 += x4 * ya;
yb = y[i - ifx - 4]; z0 += x4 * yb; z1 += x5 * yb;
ya = y[i - ifx - 5]; z0 += x5 * ya; z1 += x6 * ya;
yb = y[i - ifx - 6]; z0 += x6 * yb; z1 += x7 * yb;
ya = y[i - ifx - 7]; z0 += x7 * ya; z1 += x8 * ya;
yb = y[i - ifx - 8]; z0 += x8 * yb; z1 += x9 * yb;
ya = y[i - ifx - 9]; z0 += x9 * ya; z1 += x10 * ya;
yb = y[i - ifx - 10]; z0 += x10 * yb;
z[i + 1] = z1;
z[i] = z0;
}
}
else if (lx == 12) {
x0 = x[ifx];
x1 = x[ifx + 1];
x2 = x[ifx + 2];
x3 = x[ifx + 3];
x4 = x[ifx + 4];
x5 = x[ifx + 5];
x6 = x[ifx + 6];
x7 = x[ifx + 7];
x8 = x[ifx + 8];
x9 = x[ifx + 9];
x10 = x[ifx + 10];
x11 = x[ifx + 11];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb; z1 += x1 * yb;
ya = y[i - ifx - 1]; z0 += x1 * ya; z1 += x2 * ya;
yb = y[i - ifx - 2]; z0 += x2 * yb; z1 += x3 * yb;
ya = y[i - ifx - 3]; z0 += x3 * ya; z1 += x4 * ya;
yb = y[i - ifx - 4]; z0 += x4 * yb; z1 += x5 * yb;
ya = y[i - ifx - 5]; z0 += x5 * ya; z1 += x6 * ya;
yb = y[i - ifx - 6]; z0 += x6 * yb; z1 += x7 * yb;
ya = y[i - ifx - 7]; z0 += x7 * ya; z1 += x8 * ya;
yb = y[i - ifx - 8]; z0 += x8 * yb; z1 += x9 * yb;
ya = y[i - ifx - 9]; z0 += x9 * ya; z1 += x10 * ya;
yb = y[i - ifx - 10]; z0 += x10 * yb; z1 += x11 * yb;
ya = y[i - ifx - 11]; z0 += x11 * ya;
z[i + 1] = z1;
z[i] = z0;
}
}
else if (lx == 13) {
x0 = x[ifx];
x1 = x[ifx + 1];
x2 = x[ifx + 2];
x3 = x[ifx + 3];
x4 = x[ifx + 4];
x5 = x[ifx + 5];
x6 = x[ifx + 6];
x7 = x[ifx + 7];
x8 = x[ifx + 8];
x9 = x[ifx + 9];
x10 = x[ifx + 10];
x11 = x[ifx + 11];
x12 = x[ifx + 12];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb; z1 += x1 * yb;
ya = y[i - ifx - 1]; z0 += x1 * ya; z1 += x2 * ya;
yb = y[i - ifx - 2]; z0 += x2 * yb; z1 += x3 * yb;
ya = y[i - ifx - 3]; z0 += x3 * ya; z1 += x4 * ya;
yb = y[i - ifx - 4]; z0 += x4 * yb; z1 += x5 * yb;
ya = y[i - ifx - 5]; z0 += x5 * ya; z1 += x6 * ya;
yb = y[i - ifx - 6]; z0 += x6 * yb; z1 += x7 * yb;
ya = y[i - ifx - 7]; z0 += x7 * ya; z1 += x8 * ya;
yb = y[i - ifx - 8]; z0 += x8 * yb; z1 += x9 * yb;
ya = y[i - ifx - 9]; z0 += x9 * ya; z1 += x10 * ya;
yb = y[i - ifx - 10]; z0 += x10 * yb; z1 += x11 * yb;
ya = y[i - ifx - 11]; z0 += x11 * ya; z1 += x12 * ya;
yb = y[i - ifx - 12]; z0 += x12 * yb;
z[i + 1] = z1;
z[i] = z0;
}
}
else if (lx == 14) {
x0 = x[ifx];
x1 = x[ifx + 1];
x2 = x[ifx + 2];
x3 = x[ifx + 3];
x4 = x[ifx + 4];
x5 = x[ifx + 5];
x6 = x[ifx + 6];
x7 = x[ifx + 7];
x8 = x[ifx + 8];
x9 = x[ifx + 9];
x10 = x[ifx + 10];
x11 = x[ifx + 11];
x12 = x[ifx + 12];
x13 = x[ifx + 13];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb; z1 += x1 * yb;
ya = y[i - ifx - 1]; z0 += x1 * ya; z1 += x2 * ya;
yb = y[i - ifx - 2]; z0 += x2 * yb; z1 += x3 * yb;
ya = y[i - ifx - 3]; z0 += x3 * ya; z1 += x4 * ya;
yb = y[i - ifx - 4]; z0 += x4 * yb; z1 += x5 * yb;
ya = y[i - ifx - 5]; z0 += x5 * ya; z1 += x6 * ya;
yb = y[i - ifx - 6]; z0 += x6 * yb; z1 += x7 * yb;
ya = y[i - ifx - 7]; z0 += x7 * ya; z1 += x8 * ya;
yb = y[i - ifx - 8]; z0 += x8 * yb; z1 += x9 * yb;
ya = y[i - ifx - 9]; z0 += x9 * ya; z1 += x10 * ya;
yb = y[i - ifx - 10]; z0 += x10 * yb; z1 += x11 * yb;
ya = y[i - ifx - 11]; z0 += x11 * ya; z1 += x12 * ya;
yb = y[i - ifx - 12]; z0 += x12 * yb; z1 += x13 * yb;
ya = y[i - ifx - 13]; z0 += x13 * ya;
z[i + 1] = z1;
z[i] = z0;
}
}
else if (lx == 15) {
x0 = x[ifx];
x1 = x[ifx + 1];
x2 = x[ifx + 2];
x3 = x[ifx + 3];
x4 = x[ifx + 4];
x5 = x[ifx + 5];
x6 = x[ifx + 6];
x7 = x[ifx + 7];
x8 = x[ifx + 8];
x9 = x[ifx + 9];
x10 = x[ifx + 10];
x11 = x[ifx + 11];
x12 = x[ifx + 12];
x13 = x[ifx + 13];
x14 = x[ifx + 14];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb; z1 += x1 * yb;
ya = y[i - ifx - 1]; z0 += x1 * ya; z1 += x2 * ya;
yb = y[i - ifx - 2]; z0 += x2 * yb; z1 += x3 * yb;
ya = y[i - ifx - 3]; z0 += x3 * ya; z1 += x4 * ya;
yb = y[i - ifx - 4]; z0 += x4 * yb; z1 += x5 * yb;
ya = y[i - ifx - 5]; z0 += x5 * ya; z1 += x6 * ya;
yb = y[i - ifx - 6]; z0 += x6 * yb; z1 += x7 * yb;
ya = y[i - ifx - 7]; z0 += x7 * ya; z1 += x8 * ya;
yb = y[i - ifx - 8]; z0 += x8 * yb; z1 += x9 * yb;
ya = y[i - ifx - 9]; z0 += x9 * ya; z1 += x10 * ya;
yb = y[i - ifx - 10]; z0 += x10 * yb; z1 += x11 * yb;
ya = y[i - ifx - 11]; z0 += x11 * ya; z1 += x12 * ya;
yb = y[i - ifx - 12]; z0 += x12 * yb; z1 += x13 * yb;
ya = y[i - ifx - 13]; z0 += x13 * ya; z1 += x14 * ya;
yb = y[i - ifx - 14]; z0 += x14 * yb;
z[i + 1] = z1;
z[i] = z0;
}
}
else if (lx == 16) {
x0 = x[ifx];
x1 = x[ifx + 1];
x2 = x[ifx + 2];
x3 = x[ifx + 3];
x4 = x[ifx + 4];
x5 = x[ifx + 5];
x6 = x[ifx + 6];
x7 = x[ifx + 7];
x8 = x[ifx + 8];
x9 = x[ifx + 9];
x10 = x[ifx + 10];
x11 = x[ifx + 11];
x12 = x[ifx + 12];
x13 = x[ifx + 13];
x14 = x[ifx + 14];
x15 = x[ifx + 15];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb; z1 += x1 * yb;
ya = y[i - ifx - 1]; z0 += x1 * ya; z1 += x2 * ya;
yb = y[i - ifx - 2]; z0 += x2 * yb; z1 += x3 * yb;
ya = y[i - ifx - 3]; z0 += x3 * ya; z1 += x4 * ya;
yb = y[i - ifx - 4]; z0 += x4 * yb; z1 += x5 * yb;
ya = y[i - ifx - 5]; z0 += x5 * ya; z1 += x6 * ya;
yb = y[i - ifx - 6]; z0 += x6 * yb; z1 += x7 * yb;
ya = y[i - ifx - 7]; z0 += x7 * ya; z1 += x8 * ya;
yb = y[i - ifx - 8]; z0 += x8 * yb; z1 += x9 * yb;
ya = y[i - ifx - 9]; z0 += x9 * ya; z1 += x10 * ya;
yb = y[i - ifx - 10]; z0 += x10 * yb; z1 += x11 * yb;
ya = y[i - ifx - 11]; z0 += x11 * ya; z1 += x12 * ya;
yb = y[i - ifx - 12]; z0 += x12 * yb; z1 += x13 * yb;
ya = y[i - ifx - 13]; z0 += x13 * ya; z1 += x14 * ya;
yb = y[i - ifx - 14]; z0 += x14 * yb; z1 += x15 * yb;
ya = y[i - ifx - 15]; z0 += x15 * ya;
z[i + 1] = z1;
z[i] = z0;
}
}
else if (lx == 17) {
x0 = x[ifx];
x1 = x[ifx + 1];
x2 = x[ifx + 2];
x3 = x[ifx + 3];
x4 = x[ifx + 4];
x5 = x[ifx + 5];
x6 = x[ifx + 6];
x7 = x[ifx + 7];
x8 = x[ifx + 8];
x9 = x[ifx + 9];
x10 = x[ifx + 10];
x11 = x[ifx + 11];
x12 = x[ifx + 12];
x13 = x[ifx + 13];
x14 = x[ifx + 14];
x15 = x[ifx + 15];
x16 = x[ifx + 16];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb; z1 += x1 * yb;
ya = y[i - ifx - 1]; z0 += x1 * ya; z1 += x2 * ya;
yb = y[i - ifx - 2]; z0 += x2 * yb; z1 += x3 * yb;
ya = y[i - ifx - 3]; z0 += x3 * ya; z1 += x4 * ya;
yb = y[i - ifx - 4]; z0 += x4 * yb; z1 += x5 * yb;
ya = y[i - ifx - 5]; z0 += x5 * ya; z1 += x6 * ya;
yb = y[i - ifx - 6]; z0 += x6 * yb; z1 += x7 * yb;
ya = y[i - ifx - 7]; z0 += x7 * ya; z1 += x8 * ya;
yb = y[i - ifx - 8]; z0 += x8 * yb; z1 += x9 * yb;
ya = y[i - ifx - 9]; z0 += x9 * ya; z1 += x10 * ya;
yb = y[i - ifx - 10]; z0 += x10 * yb; z1 += x11 * yb;
ya = y[i - ifx - 11]; z0 += x11 * ya; z1 += x12 * ya;
yb = y[i - ifx - 12]; z0 += x12 * yb; z1 += x13 * yb;
ya = y[i - ifx - 13]; z0 += x13 * ya; z1 += x14 * ya;
yb = y[i - ifx - 14]; z0 += x14 * yb; z1 += x15 * yb;
ya = y[i - ifx - 15]; z0 += x15 * ya; z1 += x16 * ya;
yb = y[i - ifx - 16]; z0 += x16 * yb;
z[i + 1] = z1;
z[i] = z0;
}
}
else if (lx == 18) {
x0 = x[ifx];
x1 = x[ifx + 1];
x2 = x[ifx + 2];
x3 = x[ifx + 3];
x4 = x[ifx + 4];
x5 = x[ifx + 5];
x6 = x[ifx + 6];
x7 = x[ifx + 7];
x8 = x[ifx + 8];
x9 = x[ifx + 9];
x10 = x[ifx + 10];
x11 = x[ifx + 11];
x12 = x[ifx + 12];
x13 = x[ifx + 13];
x14 = x[ifx + 14];
x15 = x[ifx + 15];
x16 = x[ifx + 16];
x17 = x[ifx + 17];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb; z1 += x1 * yb;
ya = y[i - ifx - 1]; z0 += x1 * ya; z1 += x2 * ya;
yb = y[i - ifx - 2]; z0 += x2 * yb; z1 += x3 * yb;
ya = y[i - ifx - 3]; z0 += x3 * ya; z1 += x4 * ya;
yb = y[i - ifx - 4]; z0 += x4 * yb; z1 += x5 * yb;
ya = y[i - ifx - 5]; z0 += x5 * ya; z1 += x6 * ya;
yb = y[i - ifx - 6]; z0 += x6 * yb; z1 += x7 * yb;
ya = y[i - ifx - 7]; z0 += x7 * ya; z1 += x8 * ya;
yb = y[i - ifx - 8]; z0 += x8 * yb; z1 += x9 * yb;
ya = y[i - ifx - 9]; z0 += x9 * ya; z1 += x10 * ya;
yb = y[i - ifx - 10]; z0 += x10 * yb; z1 += x11 * yb;
ya = y[i - ifx - 11]; z0 += x11 * ya; z1 += x12 * ya;
yb = y[i - ifx - 12]; z0 += x12 * yb; z1 += x13 * yb;
ya = y[i - ifx - 13]; z0 += x13 * ya; z1 += x14 * ya;
yb = y[i - ifx - 14]; z0 += x14 * yb; z1 += x15 * yb;
ya = y[i - ifx - 15]; z0 += x15 * ya; z1 += x16 * ya;
yb = y[i - ifx - 16]; z0 += x16 * yb; z1 += x17 * yb;
ya = y[i - ifx - 17]; z0 += x17 * ya;
z[i + 1] = z1;
z[i] = z0;
}
}
else if (lx == 19) {
x0 = x[ifx];
x1 = x[ifx + 1];
x2 = x[ifx + 2];
x3 = x[ifx + 3];
x4 = x[ifx + 4];
x5 = x[ifx + 5];
x6 = x[ifx + 6];
x7 = x[ifx + 7];
x8 = x[ifx + 8];
x9 = x[ifx + 9];
x10 = x[ifx + 10];
x11 = x[ifx + 11];
x12 = x[ifx + 12];
x13 = x[ifx + 13];
x14 = x[ifx + 14];
x15 = x[ifx + 15];
x16 = x[ifx + 16];
x17 = x[ifx + 17];
x18 = x[ifx + 18];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb; z1 += x1 * yb;
ya = y[i - ifx - 1]; z0 += x1 * ya; z1 += x2 * ya;
yb = y[i - ifx - 2]; z0 += x2 * yb; z1 += x3 * yb;
ya = y[i - ifx - 3]; z0 += x3 * ya; z1 += x4 * ya;
yb = y[i - ifx - 4]; z0 += x4 * yb; z1 += x5 * yb;
ya = y[i - ifx - 5]; z0 += x5 * ya; z1 += x6 * ya;
yb = y[i - ifx - 6]; z0 += x6 * yb; z1 += x7 * yb;
ya = y[i - ifx - 7]; z0 += x7 * ya; z1 += x8 * ya;
yb = y[i - ifx - 8]; z0 += x8 * yb; z1 += x9 * yb;
ya = y[i - ifx - 9]; z0 += x9 * ya; z1 += x10 * ya;
yb = y[i - ifx - 10]; z0 += x10 * yb; z1 += x11 * yb;
ya = y[i - ifx - 11]; z0 += x11 * ya; z1 += x12 * ya;
yb = y[i - ifx - 12]; z0 += x12 * yb; z1 += x13 * yb;
ya = y[i - ifx - 13]; z0 += x13 * ya; z1 += x14 * ya;
yb = y[i - ifx - 14]; z0 += x14 * yb; z1 += x15 * yb;
ya = y[i - ifx - 15]; z0 += x15 * ya; z1 += x16 * ya;
yb = y[i - ifx - 16]; z0 += x16 * yb; z1 += x17 * yb;
ya = y[i - ifx - 17]; z0 += x17 * ya; z1 += x18 * ya;
yb = y[i - ifx - 18]; z0 += x18 * yb;
z[i + 1] = z1;
z[i] = z0;
}
}
else if (lx == 20) {
x0 = x[ifx];
x1 = x[ifx + 1];
x2 = x[ifx + 2];
x3 = x[ifx + 3];
x4 = x[ifx + 4];
x5 = x[ifx + 5];
x6 = x[ifx + 6];
x7 = x[ifx + 7];
x8 = x[ifx + 8];
x9 = x[ifx + 9];
x10 = x[ifx + 10];
x11 = x[ifx + 11];
x12 = x[ifx + 12];
x13 = x[ifx + 13];
x14 = x[ifx + 14];
x15 = x[ifx + 15];
x16 = x[ifx + 16];
x17 = x[ifx + 17];
x18 = x[ifx + 18];
x19 = x[ifx + 19];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb; z1 += x1 * yb;
ya = y[i - ifx - 1]; z0 += x1 * ya; z1 += x2 * ya;
yb = y[i - ifx - 2]; z0 += x2 * yb; z1 += x3 * yb;
ya = y[i - ifx - 3]; z0 += x3 * ya; z1 += x4 * ya;
yb = y[i - ifx - 4]; z0 += x4 * yb; z1 += x5 * yb;
ya = y[i - ifx - 5]; z0 += x5 * ya; z1 += x6 * ya;
yb = y[i - ifx - 6]; z0 += x6 * yb; z1 += x7 * yb;
ya = y[i - ifx - 7]; z0 += x7 * ya; z1 += x8 * ya;
yb = y[i - ifx - 8]; z0 += x8 * yb; z1 += x9 * yb;
ya = y[i - ifx - 9]; z0 += x9 * ya; z1 += x10 * ya;
yb = y[i - ifx - 10]; z0 += x10 * yb; z1 += x11 * yb;
ya = y[i - ifx - 11]; z0 += x11 * ya; z1 += x12 * ya;
yb = y[i - ifx - 12]; z0 += x12 * yb; z1 += x13 * yb;
ya = y[i - ifx - 13]; z0 += x13 * ya; z1 += x14 * ya;
yb = y[i - ifx - 14]; z0 += x14 * yb; z1 += x15 * yb;
ya = y[i - ifx - 15]; z0 += x15 * ya; z1 += x16 * ya;
yb = y[i - ifx - 16]; z0 += x16 * yb; z1 += x17 * yb;
ya = y[i - ifx - 17]; z0 += x17 * ya; z1 += x18 * ya;
yb = y[i - ifx - 18]; z0 += x18 * yb; z1 += x19 * yb;
ya = y[i - ifx - 19]; z0 += x19 * ya;
z[i + 1] = z1;
z[i] = z0;
}
}
else if (lx == 21) {
x0 = x[ifx];
x1 = x[ifx + 1];
x2 = x[ifx + 2];
x3 = x[ifx + 3];
x4 = x[ifx + 4];
x5 = x[ifx + 5];
x6 = x[ifx + 6];
x7 = x[ifx + 7];
x8 = x[ifx + 8];
x9 = x[ifx + 9];
x10 = x[ifx + 10];
x11 = x[ifx + 11];
x12 = x[ifx + 12];
x13 = x[ifx + 13];
x14 = x[ifx + 14];
x15 = x[ifx + 15];
x16 = x[ifx + 16];
x17 = x[ifx + 17];
x18 = x[ifx + 18];
x19 = x[ifx + 19];
x20 = x[ifx + 20];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb; z1 += x1 * yb;
ya = y[i - ifx - 1]; z0 += x1 * ya; z1 += x2 * ya;
yb = y[i - ifx - 2]; z0 += x2 * yb; z1 += x3 * yb;
ya = y[i - ifx - 3]; z0 += x3 * ya; z1 += x4 * ya;
yb = y[i - ifx - 4]; z0 += x4 * yb; z1 += x5 * yb;
ya = y[i - ifx - 5]; z0 += x5 * ya; z1 += x6 * ya;
yb = y[i - ifx - 6]; z0 += x6 * yb; z1 += x7 * yb;
ya = y[i - ifx - 7]; z0 += x7 * ya; z1 += x8 * ya;
yb = y[i - ifx - 8]; z0 += x8 * yb; z1 += x9 * yb;
ya = y[i - ifx - 9]; z0 += x9 * ya; z1 += x10 * ya;
yb = y[i - ifx - 10]; z0 += x10 * yb; z1 += x11 * yb;
ya = y[i - ifx - 11]; z0 += x11 * ya; z1 += x12 * ya;
yb = y[i - ifx - 12]; z0 += x12 * yb; z1 += x13 * yb;
ya = y[i - ifx - 13]; z0 += x13 * ya; z1 += x14 * ya;
yb = y[i - ifx - 14]; z0 += x14 * yb; z1 += x15 * yb;
ya = y[i - ifx - 15]; z0 += x15 * ya; z1 += x16 * ya;
yb = y[i - ifx - 16]; z0 += x16 * yb; z1 += x17 * yb;
ya = y[i - ifx - 17]; z0 += x17 * ya; z1 += x18 * ya;
yb = y[i - ifx - 18]; z0 += x18 * yb; z1 += x19 * yb;
ya = y[i - ifx - 19]; z0 += x19 * ya; z1 += x20 * ya;
yb = y[i - ifx - 20]; z0 += x20 * yb;
z[i + 1] = z1;
z[i] = z0;
}
}
else if (lx == 22) {
x0 = x[ifx];
x1 = x[ifx + 1];
x2 = x[ifx + 2];
x3 = x[ifx + 3];
x4 = x[ifx + 4];
x5 = x[ifx + 5];
x6 = x[ifx + 6];
x7 = x[ifx + 7];
x8 = x[ifx + 8];
x9 = x[ifx + 9];
x10 = x[ifx + 10];
x11 = x[ifx + 11];
x12 = x[ifx + 12];
x13 = x[ifx + 13];
x14 = x[ifx + 14];
x15 = x[ifx + 15];
x16 = x[ifx + 16];
x17 = x[ifx + 17];
x18 = x[ifx + 18];
x19 = x[ifx + 19];
x20 = x[ifx + 20];
x21 = x[ifx + 21];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb; z1 += x1 * yb;
ya = y[i - ifx - 1]; z0 += x1 * ya; z1 += x2 * ya;
yb = y[i - ifx - 2]; z0 += x2 * yb; z1 += x3 * yb;
ya = y[i - ifx - 3]; z0 += x3 * ya; z1 += x4 * ya;
yb = y[i - ifx - 4]; z0 += x4 * yb; z1 += x5 * yb;
ya = y[i - ifx - 5]; z0 += x5 * ya; z1 += x6 * ya;
yb = y[i - ifx - 6]; z0 += x6 * yb; z1 += x7 * yb;
ya = y[i - ifx - 7]; z0 += x7 * ya; z1 += x8 * ya;
yb = y[i - ifx - 8]; z0 += x8 * yb; z1 += x9 * yb;
ya = y[i - ifx - 9]; z0 += x9 * ya; z1 += x10 * ya;
yb = y[i - ifx - 10]; z0 += x10 * yb; z1 += x11 * yb;
ya = y[i - ifx - 11]; z0 += x11 * ya; z1 += x12 * ya;
yb = y[i - ifx - 12]; z0 += x12 * yb; z1 += x13 * yb;
ya = y[i - ifx - 13]; z0 += x13 * ya; z1 += x14 * ya;
yb = y[i - ifx - 14]; z0 += x14 * yb; z1 += x15 * yb;
ya = y[i - ifx - 15]; z0 += x15 * ya; z1 += x16 * ya;
yb = y[i - ifx - 16]; z0 += x16 * yb; z1 += x17 * yb;
ya = y[i - ifx - 17]; z0 += x17 * ya; z1 += x18 * ya;
yb = y[i - ifx - 18]; z0 += x18 * yb; z1 += x19 * yb;
ya = y[i - ifx - 19]; z0 += x19 * ya; z1 += x20 * ya;
yb = y[i - ifx - 20]; z0 += x20 * yb; z1 += x21 * yb;
ya = y[i - ifx - 21]; z0 += x21 * ya;
z[i + 1] = z1;
z[i] = z0;
}
}
else if (lx == 23) {
x0 = x[ifx];
x1 = x[ifx + 1];
x2 = x[ifx + 2];
x3 = x[ifx + 3];
x4 = x[ifx + 4];
x5 = x[ifx + 5];
x6 = x[ifx + 6];
x7 = x[ifx + 7];
x8 = x[ifx + 8];
x9 = x[ifx + 9];
x10 = x[ifx + 10];
x11 = x[ifx + 11];
x12 = x[ifx + 12];
x13 = x[ifx + 13];
x14 = x[ifx + 14];
x15 = x[ifx + 15];
x16 = x[ifx + 16];
x17 = x[ifx + 17];
x18 = x[ifx + 18];
x19 = x[ifx + 19];
x20 = x[ifx + 20];
x21 = x[ifx + 21];
x22 = x[ifx + 22];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb; z1 += x1 * yb;
ya = y[i - ifx - 1]; z0 += x1 * ya; z1 += x2 * ya;
yb = y[i - ifx - 2]; z0 += x2 * yb; z1 += x3 * yb;
ya = y[i - ifx - 3]; z0 += x3 * ya; z1 += x4 * ya;
yb = y[i - ifx - 4]; z0 += x4 * yb; z1 += x5 * yb;
ya = y[i - ifx - 5]; z0 += x5 * ya; z1 += x6 * ya;
yb = y[i - ifx - 6]; z0 += x6 * yb; z1 += x7 * yb;
ya = y[i - ifx - 7]; z0 += x7 * ya; z1 += x8 * ya;
yb = y[i - ifx - 8]; z0 += x8 * yb; z1 += x9 * yb;
ya = y[i - ifx - 9]; z0 += x9 * ya; z1 += x10 * ya;
yb = y[i - ifx - 10]; z0 += x10 * yb; z1 += x11 * yb;
ya = y[i - ifx - 11]; z0 += x11 * ya; z1 += x12 * ya;
yb = y[i - ifx - 12]; z0 += x12 * yb; z1 += x13 * yb;
ya = y[i - ifx - 13]; z0 += x13 * ya; z1 += x14 * ya;
yb = y[i - ifx - 14]; z0 += x14 * yb; z1 += x15 * yb;
ya = y[i - ifx - 15]; z0 += x15 * ya; z1 += x16 * ya;
yb = y[i - ifx - 16]; z0 += x16 * yb; z1 += x17 * yb;
ya = y[i - ifx - 17]; z0 += x17 * ya; z1 += x18 * ya;
yb = y[i - ifx - 18]; z0 += x18 * yb; z1 += x19 * yb;
ya = y[i - ifx - 19]; z0 += x19 * ya; z1 += x20 * ya;
yb = y[i - ifx - 20]; z0 += x20 * yb; z1 += x21 * yb;
ya = y[i - ifx - 21]; z0 += x21 * ya; z1 += x22 * ya;
yb = y[i - ifx - 22]; z0 += x22 * yb;
z[i + 1] = z1;
z[i] = z0;
}
}
else if (lx == 24) {
x0 = x[ifx];
x1 = x[ifx + 1];
x2 = x[ifx + 2];
x3 = x[ifx + 3];
x4 = x[ifx + 4];
x5 = x[ifx + 5];
x6 = x[ifx + 6];
x7 = x[ifx + 7];
x8 = x[ifx + 8];
x9 = x[ifx + 9];
x10 = x[ifx + 10];
x11 = x[ifx + 11];
x12 = x[ifx + 12];
x13 = x[ifx + 13];
x14 = x[ifx + 14];
x15 = x[ifx + 15];
x16 = x[ifx + 16];
x17 = x[ifx + 17];
x18 = x[ifx + 18];
x19 = x[ifx + 19];
x20 = x[ifx + 20];
x21 = x[ifx + 21];
x22 = x[ifx + 22];
x23 = x[ifx + 23];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb; z1 += x1 * yb;
ya = y[i - ifx - 1]; z0 += x1 * ya; z1 += x2 * ya;
yb = y[i - ifx - 2]; z0 += x2 * yb; z1 += x3 * yb;
ya = y[i - ifx - 3]; z0 += x3 * ya; z1 += x4 * ya;
yb = y[i - ifx - 4]; z0 += x4 * yb; z1 += x5 * yb;
ya = y[i - ifx - 5]; z0 += x5 * ya; z1 += x6 * ya;
yb = y[i - ifx - 6]; z0 += x6 * yb; z1 += x7 * yb;
ya = y[i - ifx - 7]; z0 += x7 * ya; z1 += x8 * ya;
yb = y[i - ifx - 8]; z0 += x8 * yb; z1 += x9 * yb;
ya = y[i - ifx - 9]; z0 += x9 * ya; z1 += x10 * ya;
yb = y[i - ifx - 10]; z0 += x10 * yb; z1 += x11 * yb;
ya = y[i - ifx - 11]; z0 += x11 * ya; z1 += x12 * ya;
yb = y[i - ifx - 12]; z0 += x12 * yb; z1 += x13 * yb;
ya = y[i - ifx - 13]; z0 += x13 * ya; z1 += x14 * ya;
yb = y[i - ifx - 14]; z0 += x14 * yb; z1 += x15 * yb;
ya = y[i - ifx - 15]; z0 += x15 * ya; z1 += x16 * ya;
yb = y[i - ifx - 16]; z0 += x16 * yb; z1 += x17 * yb;
ya = y[i - ifx - 17]; z0 += x17 * ya; z1 += x18 * ya;
yb = y[i - ifx - 18]; z0 += x18 * yb; z1 += x19 * yb;
ya = y[i - ifx - 19]; z0 += x19 * ya; z1 += x20 * ya;
yb = y[i - ifx - 20]; z0 += x20 * yb; z1 += x21 * yb;
ya = y[i - ifx - 21]; z0 += x21 * ya; z1 += x22 * ya;
yb = y[i - ifx - 22]; z0 += x22 * yb; z1 += x23 * yb;
ya = y[i - ifx - 23]; z0 += x23 * ya;
z[i + 1] = z1;
z[i] = z0;
}
}
else if (lx == 25) {
x0 = x[ifx];
x1 = x[ifx + 1];
x2 = x[ifx + 2];
x3 = x[ifx + 3];
x4 = x[ifx + 4];
x5 = x[ifx + 5];
x6 = x[ifx + 6];
x7 = x[ifx + 7];
x8 = x[ifx + 8];
x9 = x[ifx + 9];
x10 = x[ifx + 10];
x11 = x[ifx + 11];
x12 = x[ifx + 12];
x13 = x[ifx + 13];
x14 = x[ifx + 14];
x15 = x[ifx + 15];
x16 = x[ifx + 16];
x17 = x[ifx + 17];
x18 = x[ifx + 18];
x19 = x[ifx + 19];
x20 = x[ifx + 20];
x21 = x[ifx + 21];
x22 = x[ifx + 22];
x23 = x[ifx + 23];
x24 = x[ifx + 24];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb; z1 += x1 * yb;
ya = y[i - ifx - 1]; z0 += x1 * ya; z1 += x2 * ya;
yb = y[i - ifx - 2]; z0 += x2 * yb; z1 += x3 * yb;
ya = y[i - ifx - 3]; z0 += x3 * ya; z1 += x4 * ya;
yb = y[i - ifx - 4]; z0 += x4 * yb; z1 += x5 * yb;
ya = y[i - ifx - 5]; z0 += x5 * ya; z1 += x6 * ya;
yb = y[i - ifx - 6]; z0 += x6 * yb; z1 += x7 * yb;
ya = y[i - ifx - 7]; z0 += x7 * ya; z1 += x8 * ya;
yb = y[i - ifx - 8]; z0 += x8 * yb; z1 += x9 * yb;
ya = y[i - ifx - 9]; z0 += x9 * ya; z1 += x10 * ya;
yb = y[i - ifx - 10]; z0 += x10 * yb; z1 += x11 * yb;
ya = y[i - ifx - 11]; z0 += x11 * ya; z1 += x12 * ya;
yb = y[i - ifx - 12]; z0 += x12 * yb; z1 += x13 * yb;
ya = y[i - ifx - 13]; z0 += x13 * ya; z1 += x14 * ya;
yb = y[i - ifx - 14]; z0 += x14 * yb; z1 += x15 * yb;
ya = y[i - ifx - 15]; z0 += x15 * ya; z1 += x16 * ya;
yb = y[i - ifx - 16]; z0 += x16 * yb; z1 += x17 * yb;
ya = y[i - ifx - 17]; z0 += x17 * ya; z1 += x18 * ya;
yb = y[i - ifx - 18]; z0 += x18 * yb; z1 += x19 * yb;
ya = y[i - ifx - 19]; z0 += x19 * ya; z1 += x20 * ya;
yb = y[i - ifx - 20]; z0 += x20 * yb; z1 += x21 * yb;
ya = y[i - ifx - 21]; z0 += x21 * ya; z1 += x22 * ya;
yb = y[i - ifx - 22]; z0 += x22 * yb; z1 += x23 * yb;
ya = y[i - ifx - 23]; z0 += x23 * ya; z1 += x24 * ya;
yb = y[i - ifx - 24]; z0 += x24 * yb;
z[i + 1] = z1;
z[i] = z0;
}
}
else if (lx == 26) {
x0 = x[ifx];
x1 = x[ifx + 1];
x2 = x[ifx + 2];
x3 = x[ifx + 3];
x4 = x[ifx + 4];
x5 = x[ifx + 5];
x6 = x[ifx + 6];
x7 = x[ifx + 7];
x8 = x[ifx + 8];
x9 = x[ifx + 9];
x10 = x[ifx + 10];
x11 = x[ifx + 11];
x12 = x[ifx + 12];
x13 = x[ifx + 13];
x14 = x[ifx + 14];
x15 = x[ifx + 15];
x16 = x[ifx + 16];
x17 = x[ifx + 17];
x18 = x[ifx + 18];
x19 = x[ifx + 19];
x20 = x[ifx + 20];
x21 = x[ifx + 21];
x22 = x[ifx + 22];
x23 = x[ifx + 23];
x24 = x[ifx + 24];
x25 = x[ifx + 25];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb; z1 += x1 * yb;
ya = y[i - ifx - 1]; z0 += x1 * ya; z1 += x2 * ya;
yb = y[i - ifx - 2]; z0 += x2 * yb; z1 += x3 * yb;
ya = y[i - ifx - 3]; z0 += x3 * ya; z1 += x4 * ya;
yb = y[i - ifx - 4]; z0 += x4 * yb; z1 += x5 * yb;
ya = y[i - ifx - 5]; z0 += x5 * ya; z1 += x6 * ya;
yb = y[i - ifx - 6]; z0 += x6 * yb; z1 += x7 * yb;
ya = y[i - ifx - 7]; z0 += x7 * ya; z1 += x8 * ya;
yb = y[i - ifx - 8]; z0 += x8 * yb; z1 += x9 * yb;
ya = y[i - ifx - 9]; z0 += x9 * ya; z1 += x10 * ya;
yb = y[i - ifx - 10]; z0 += x10 * yb; z1 += x11 * yb;
ya = y[i - ifx - 11]; z0 += x11 * ya; z1 += x12 * ya;
yb = y[i - ifx - 12]; z0 += x12 * yb; z1 += x13 * yb;
ya = y[i - ifx - 13]; z0 += x13 * ya; z1 += x14 * ya;
yb = y[i - ifx - 14]; z0 += x14 * yb; z1 += x15 * yb;
ya = y[i - ifx - 15]; z0 += x15 * ya; z1 += x16 * ya;
yb = y[i - ifx - 16]; z0 += x16 * yb; z1 += x17 * yb;
ya = y[i - ifx - 17]; z0 += x17 * ya; z1 += x18 * ya;
yb = y[i - ifx - 18]; z0 += x18 * yb; z1 += x19 * yb;
ya = y[i - ifx - 19]; z0 += x19 * ya; z1 += x20 * ya;
yb = y[i - ifx - 20]; z0 += x20 * yb; z1 += x21 * yb;
ya = y[i - ifx - 21]; z0 += x21 * ya; z1 += x22 * ya;
yb = y[i - ifx - 22]; z0 += x22 * yb; z1 += x23 * yb;
ya = y[i - ifx - 23]; z0 += x23 * ya; z1 += x24 * ya;
yb = y[i - ifx - 24]; z0 += x24 * yb; z1 += x25 * yb;
ya = y[i - ifx - 25]; z0 += x25 * ya;
z[i + 1] = z1;
z[i] = z0;
}
}
else if (lx == 27) {
x0 = x[ifx];
x1 = x[ifx + 1];
x2 = x[ifx + 2];
x3 = x[ifx + 3];
x4 = x[ifx + 4];
x5 = x[ifx + 5];
x6 = x[ifx + 6];
x7 = x[ifx + 7];
x8 = x[ifx + 8];
x9 = x[ifx + 9];
x10 = x[ifx + 10];
x11 = x[ifx + 11];
x12 = x[ifx + 12];
x13 = x[ifx + 13];
x14 = x[ifx + 14];
x15 = x[ifx + 15];
x16 = x[ifx + 16];
x17 = x[ifx + 17];
x18 = x[ifx + 18];
x19 = x[ifx + 19];
x20 = x[ifx + 20];
x21 = x[ifx + 21];
x22 = x[ifx + 22];
x23 = x[ifx + 23];
x24 = x[ifx + 24];
x25 = x[ifx + 25];
x26 = x[ifx + 26];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb; z1 += x1 * yb;
ya = y[i - ifx - 1]; z0 += x1 * ya; z1 += x2 * ya;
yb = y[i - ifx - 2]; z0 += x2 * yb; z1 += x3 * yb;
ya = y[i - ifx - 3]; z0 += x3 * ya; z1 += x4 * ya;
yb = y[i - ifx - 4]; z0 += x4 * yb; z1 += x5 * yb;
ya = y[i - ifx - 5]; z0 += x5 * ya; z1 += x6 * ya;
yb = y[i - ifx - 6]; z0 += x6 * yb; z1 += x7 * yb;
ya = y[i - ifx - 7]; z0 += x7 * ya; z1 += x8 * ya;
yb = y[i - ifx - 8]; z0 += x8 * yb; z1 += x9 * yb;
ya = y[i - ifx - 9]; z0 += x9 * ya; z1 += x10 * ya;
yb = y[i - ifx - 10]; z0 += x10 * yb; z1 += x11 * yb;
ya = y[i - ifx - 11]; z0 += x11 * ya; z1 += x12 * ya;
yb = y[i - ifx - 12]; z0 += x12 * yb; z1 += x13 * yb;
ya = y[i - ifx - 13]; z0 += x13 * ya; z1 += x14 * ya;
yb = y[i - ifx - 14]; z0 += x14 * yb; z1 += x15 * yb;
ya = y[i - ifx - 15]; z0 += x15 * ya; z1 += x16 * ya;
yb = y[i - ifx - 16]; z0 += x16 * yb; z1 += x17 * yb;
ya = y[i - ifx - 17]; z0 += x17 * ya; z1 += x18 * ya;
yb = y[i - ifx - 18]; z0 += x18 * yb; z1 += x19 * yb;
ya = y[i - ifx - 19]; z0 += x19 * ya; z1 += x20 * ya;
yb = y[i - ifx - 20]; z0 += x20 * yb; z1 += x21 * yb;
ya = y[i - ifx - 21]; z0 += x21 * ya; z1 += x22 * ya;
yb = y[i - ifx - 22]; z0 += x22 * yb; z1 += x23 * yb;
ya = y[i - ifx - 23]; z0 += x23 * ya; z1 += x24 * ya;
yb = y[i - ifx - 24]; z0 += x24 * yb; z1 += x25 * yb;
ya = y[i - ifx - 25]; z0 += x25 * ya; z1 += x26 * ya;
yb = y[i - ifx - 26]; z0 += x26 * yb;
z[i + 1] = z1;
z[i] = z0;
}
}
else if (lx == 28) {
x0 = x[ifx];
x1 = x[ifx + 1];
x2 = x[ifx + 2];
x3 = x[ifx + 3];
x4 = x[ifx + 4];
x5 = x[ifx + 5];
x6 = x[ifx + 6];
x7 = x[ifx + 7];
x8 = x[ifx + 8];
x9 = x[ifx + 9];
x10 = x[ifx + 10];
x11 = x[ifx + 11];
x12 = x[ifx + 12];
x13 = x[ifx + 13];
x14 = x[ifx + 14];
x15 = x[ifx + 15];
x16 = x[ifx + 16];
x17 = x[ifx + 17];
x18 = x[ifx + 18];
x19 = x[ifx + 19];
x20 = x[ifx + 20];
x21 = x[ifx + 21];
x22 = x[ifx + 22];
x23 = x[ifx + 23];
x24 = x[ifx + 24];
x25 = x[ifx + 25];
x26 = x[ifx + 26];
x27 = x[ifx + 27];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb; z1 += x1 * yb;
ya = y[i - ifx - 1]; z0 += x1 * ya; z1 += x2 * ya;
yb = y[i - ifx - 2]; z0 += x2 * yb; z1 += x3 * yb;
ya = y[i - ifx - 3]; z0 += x3 * ya; z1 += x4 * ya;
yb = y[i - ifx - 4]; z0 += x4 * yb; z1 += x5 * yb;
ya = y[i - ifx - 5]; z0 += x5 * ya; z1 += x6 * ya;
yb = y[i - ifx - 6]; z0 += x6 * yb; z1 += x7 * yb;
ya = y[i - ifx - 7]; z0 += x7 * ya; z1 += x8 * ya;
yb = y[i - ifx - 8]; z0 += x8 * yb; z1 += x9 * yb;
ya = y[i - ifx - 9]; z0 += x9 * ya; z1 += x10 * ya;
yb = y[i - ifx - 10]; z0 += x10 * yb; z1 += x11 * yb;
ya = y[i - ifx - 11]; z0 += x11 * ya; z1 += x12 * ya;
yb = y[i - ifx - 12]; z0 += x12 * yb; z1 += x13 * yb;
ya = y[i - ifx - 13]; z0 += x13 * ya; z1 += x14 * ya;
yb = y[i - ifx - 14]; z0 += x14 * yb; z1 += x15 * yb;
ya = y[i - ifx - 15]; z0 += x15 * ya; z1 += x16 * ya;
yb = y[i - ifx - 16]; z0 += x16 * yb; z1 += x17 * yb;
ya = y[i - ifx - 17]; z0 += x17 * ya; z1 += x18 * ya;
yb = y[i - ifx - 18]; z0 += x18 * yb; z1 += x19 * yb;
ya = y[i - ifx - 19]; z0 += x19 * ya; z1 += x20 * ya;
yb = y[i - ifx - 20]; z0 += x20 * yb; z1 += x21 * yb;
ya = y[i - ifx - 21]; z0 += x21 * ya; z1 += x22 * ya;
yb = y[i - ifx - 22]; z0 += x22 * yb; z1 += x23 * yb;
ya = y[i - ifx - 23]; z0 += x23 * ya; z1 += x24 * ya;
yb = y[i - ifx - 24]; z0 += x24 * yb; z1 += x25 * yb;
ya = y[i - ifx - 25]; z0 += x25 * ya; z1 += x26 * ya;
yb = y[i - ifx - 26]; z0 += x26 * yb; z1 += x27 * yb;
ya = y[i - ifx - 27]; z0 += x27 * ya;
z[i + 1] = z1;
z[i] = z0;
}
}
else if (lx == 29) {
x0 = x[ifx];
x1 = x[ifx + 1];
x2 = x[ifx + 2];
x3 = x[ifx + 3];
x4 = x[ifx + 4];
x5 = x[ifx + 5];
x6 = x[ifx + 6];
x7 = x[ifx + 7];
x8 = x[ifx + 8];
x9 = x[ifx + 9];
x10 = x[ifx + 10];
x11 = x[ifx + 11];
x12 = x[ifx + 12];
x13 = x[ifx + 13];
x14 = x[ifx + 14];
x15 = x[ifx + 15];
x16 = x[ifx + 16];
x17 = x[ifx + 17];
x18 = x[ifx + 18];
x19 = x[ifx + 19];
x20 = x[ifx + 20];
x21 = x[ifx + 21];
x22 = x[ifx + 22];
x23 = x[ifx + 23];
x24 = x[ifx + 24];
x25 = x[ifx + 25];
x26 = x[ifx + 26];
x27 = x[ifx + 27];
x28 = x[ifx + 28];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb; z1 += x1 * yb;
ya = y[i - ifx - 1]; z0 += x1 * ya; z1 += x2 * ya;
yb = y[i - ifx - 2]; z0 += x2 * yb; z1 += x3 * yb;
ya = y[i - ifx - 3]; z0 += x3 * ya; z1 += x4 * ya;
yb = y[i - ifx - 4]; z0 += x4 * yb; z1 += x5 * yb;
ya = y[i - ifx - 5]; z0 += x5 * ya; z1 += x6 * ya;
yb = y[i - ifx - 6]; z0 += x6 * yb; z1 += x7 * yb;
ya = y[i - ifx - 7]; z0 += x7 * ya; z1 += x8 * ya;
yb = y[i - ifx - 8]; z0 += x8 * yb; z1 += x9 * yb;
ya = y[i - ifx - 9]; z0 += x9 * ya; z1 += x10 * ya;
yb = y[i - ifx - 10]; z0 += x10 * yb; z1 += x11 * yb;
ya = y[i - ifx - 11]; z0 += x11 * ya; z1 += x12 * ya;
yb = y[i - ifx - 12]; z0 += x12 * yb; z1 += x13 * yb;
ya = y[i - ifx - 13]; z0 += x13 * ya; z1 += x14 * ya;
yb = y[i - ifx - 14]; z0 += x14 * yb; z1 += x15 * yb;
ya = y[i - ifx - 15]; z0 += x15 * ya; z1 += x16 * ya;
yb = y[i - ifx - 16]; z0 += x16 * yb; z1 += x17 * yb;
ya = y[i - ifx - 17]; z0 += x17 * ya; z1 += x18 * ya;
yb = y[i - ifx - 18]; z0 += x18 * yb; z1 += x19 * yb;
ya = y[i - ifx - 19]; z0 += x19 * ya; z1 += x20 * ya;
yb = y[i - ifx - 20]; z0 += x20 * yb; z1 += x21 * yb;
ya = y[i - ifx - 21]; z0 += x21 * ya; z1 += x22 * ya;
yb = y[i - ifx - 22]; z0 += x22 * yb; z1 += x23 * yb;
ya = y[i - ifx - 23]; z0 += x23 * ya; z1 += x24 * ya;
yb = y[i - ifx - 24]; z0 += x24 * yb; z1 += x25 * yb;
ya = y[i - ifx - 25]; z0 += x25 * ya; z1 += x26 * ya;
yb = y[i - ifx - 26]; z0 += x26 * yb; z1 += x27 * yb;
ya = y[i - ifx - 27]; z0 += x27 * ya; z1 += x28 * ya;
yb = y[i - ifx - 28]; z0 += x28 * yb;
z[i + 1] = z1;
z[i] = z0;
}
}
else if (lx == 30) {
x0 = x[ifx];
x1 = x[ifx + 1];
x2 = x[ifx + 2];
x3 = x[ifx + 3];
x4 = x[ifx + 4];
x5 = x[ifx + 5];
x6 = x[ifx + 6];
x7 = x[ifx + 7];
x8 = x[ifx + 8];
x9 = x[ifx + 9];
x10 = x[ifx + 10];
x11 = x[ifx + 11];
x12 = x[ifx + 12];
x13 = x[ifx + 13];
x14 = x[ifx + 14];
x15 = x[ifx + 15];
x16 = x[ifx + 16];
x17 = x[ifx + 17];
x18 = x[ifx + 18];
x19 = x[ifx + 19];
x20 = x[ifx + 20];
x21 = x[ifx + 21];
x22 = x[ifx + 22];
x23 = x[ifx + 23];
x24 = x[ifx + 24];
x25 = x[ifx + 25];
x26 = x[ifx + 26];
x27 = x[ifx + 27];
x28 = x[ifx + 28];
x29 = x[ifx + 29];
for (i = ilow; i <= ihigh - 1; i += 2) {
ya = y[i + 1 - ifx]; z1 = x0 * ya;
yb = y[i - ifx]; z0 = x0 * yb; z1 += x1 * yb;
ya = y[i - ifx - 1]; z0 += x1 * ya; z1 += x2 * ya;
yb = y[i - ifx - 2]; z0 += x2 * yb; z1 += x3 * yb;
ya = y[i - ifx - 3]; z0 += x3 * ya; z1 += x4 * ya;
yb = y[i - ifx - 4]; z0 += x4 * yb; z1 += x5 * yb;
ya = y[i - ifx - 5]; z0 += x5 * ya; z1 += x6 * ya;
yb = y[i - ifx - 6]; z0 += x6 * yb; z1 += x7 * yb;
ya = y[i - ifx - 7]; z0 += x7 * ya; z1 += x8 * ya;
yb = y[i - ifx - 8]; z0 += x8 * yb; z1 += x9 * yb;
ya = y[i - ifx - 9]; z0 += x9 * ya; z1 += x10 * ya;
yb = y[i - ifx - 10]; z0 += x10 * yb; z1 += x11 * yb;
ya = y[i - ifx - 11]; z0 += x11 * ya; z1 += x12 * ya;
yb = y[i - ifx - 12]; z0 += x12 * yb; z1 += x13 * yb;
ya = y[i - ifx - 13]; z0 += x13 * ya; z1 += x14 * ya;
yb = y[i - ifx - 14]; z0 += x14 * yb; z1 += x15 * yb;
ya = y[i - ifx - 15]; z0 += x15 * ya; z1 += x16 * ya;
yb = y[i - ifx - 16]; z0 += x16 * yb; z1 += x17 * yb;
ya = y[i - ifx - 17]; z0 += x17 * ya; z1 += x18 * ya;
yb = y[i - ifx - 18]; z0 += x18 * yb; z1 += x19 * yb;
ya = y[i - ifx - 19]; z0 += x19 * ya; z1 += x20 * ya;
yb = y[i - ifx - 20]; z0 += x20 * yb; z1 += x21 * yb;
ya = y[i - ifx - 21]; z0 += x21 * ya; z1 += x22 * ya;
yb = y[i - ifx - 22]; z0 += x22 * yb; z1 += x23 * yb;
ya = y[i - ifx - 23]; z0 += x23 * ya; z1 += x24 * ya;
yb = y[i - ifx - 24]; z0 += x24 * yb; z1 += x25 * yb;
ya = y[i - ifx - 25]; z0 += x25 * ya; z1 += x26 * ya;
yb = y[i - ifx - 26]; z0 += x26 * yb; z1 += x27 * yb;
ya = y[i - ifx - 27]; z0 += x27 * ya; z1 += x28 * ya;
yb = y[i - ifx - 28]; z0 += x28 * yb; z1 += x29 * yb;
ya = y[i - ifx - 29]; z0 += x29 * ya;
z[i + 1] = z1;
z[i] = z0;
}
}
if (ihigh >= ilow && (ihigh - ilow) % 2 == 0) {
ilow = ihigh;
jlow = ifx;
jhigh = ilx;
for (i = ilow; i <= ihigh; ++i) {
for (j = jlow, sum = 0.0; j <= jhigh; ++j)
sum += x[j] * y[i - j];
z[i] = sum;
}
} /* ROLLING OFF: ily+ifx < i <= ily+ilx */
ilow = ily + ifx + 1; if (ilow < ifz) ilow = ifz;
ihigh = ily + ilx; if (ihigh > ilz) ihigh = ilz;
jlow = ilow - ily;
jhigh = ilx;
for (i = ilow; i <= ihigh; ++i, ++jlow) {
for (j = jlow, sum = 0.0; j <= jhigh; ++j)
sum += x[j] * y[i - j];
z[i] = sum;
} /* OFF RIGHT: ily+ilx < i */
ilow = ily + ilx + 1; if (ilow < ifz) ilow = ifz;
ihigh = ilz;
for (i = ilow; i <= ihigh; ++i)
z[i] = 0.0;
}
#endif #ifdef TEST
static void convolve_cwp1(int lx, int ifx, float *x,
int ly, int ify, float *y,
int lz, int ifz, float *z)
{
int ilx = ifx + lx - 1, ily = ify + ly - 1, ilz = ifz + lz - 1, i, j, jlow, jhigh;
float sum; x -= ifx; y -= ify; z -= ifz;
for (i = ifz; i <= ilz; ++i) {
jlow = i - ily; if (jlow < ifx) jlow = ifx;
jhigh = i - ify; if (jhigh > ilx) jhigh = ilx;
for (j = jlow, sum = 0.0; j <= jhigh; ++j)
sum += x[j] * y[i - j];
z[i] = sum;
}
}
#include "cwp.h"
main()
{
int lx, ly, lz, ifx, ify, ifz, i;
float *x, *y, *z, *z1; /* loop over tests */
while (1) { /* make parameters */
lx = 1 + 100 * franuni();
ly = 1 + 100 * franuni();
lz = 1 + 100 * franuni();
ifx = -100 + 200 * franuni();
ify = -100 + 200 * franuni();
ifz = -100 + 200 * franuni(); /* allocate space */
x = alloc1float(lx);
y = alloc1float(ly);
z = alloc1float(lz);
z1 = alloc1float(lz); /* fill x and y arrays */
for (i = 0; i < lx; i++)
x[i] = i + 1;
for (i = 0; i < ly; i++)
y[i] = i + 1; /* convolve and check */
convolve_cwp1(lx, ifx, x, ly, ify, y, lz, ifz, z1);
convolve_cwp(lx, ifx, x, ly, ify, y, lz, ifz, z);
for (i = 0; i < lz; ++i)
if (z[i] != z1[i]) break;
if (i < lz) {
printf("%10d %10d %10d %10d %10d %10d\n",
lx, ifx, ly, ify, lz, ifz);
printf("z1[%d]=%g != z[%d]=%g\n",
i + ifz, z1[i], i + ifz, z[i]);
pp1d(stdout, "simple", lz, ifz, z1);
pp1d(stdout, "optimized", lz, ifz, z);
exit(-1);
} /* free space */
free1float(x);
free1float(y);
free1float(z);
free1float(z1);
}
}
#endif

IV ImpToSyn.h

#include"fundamental.h"
using namespace std; //雷克子波
void Ricker(int Lr, //中心点
int L, //子波长度
float dalt, //采样间隔,单位:s
float fp, //主频
float *w, //子波数组
float *time,//横轴数组
float amp); //最大振幅
void Double_Ricker(int Lr, int L, float dalt, float fq, float fp, float *w, float *time, float amp);//Yu'S
void DoubleCos_Spec(int L, float dalf, float fLowCut, float fLowPass, float fHighPass, float fHighCut, float *pFreq, float *pSpec, float amp);//双余弦
void DoubleCos_Wavelet(float *pSpec, int nFreqLen, int nK,int nThickRatio,int Lr,int L,float dalt,float *pTime, float *pValue, float amp);
void Compute_Rcs(float *Imp, float* Rcs,int LenImp); //计算反射系数
void Rcs2Syn(float *Rcs, float *Syn, int LenRcs, int WaveletType, int WaveletLenTemp,int WaveletInc); //反射系数褶积子波得到合成记录
void Preprocessing(float *Imp_in, unsigned int LenImp, int *start_end); //对输入地震道进行预处理
typedef struct parameterwavelet {
int type; // 子波类型
int WaveletLen;
int WaveletInc;
}parameterwavelet; typedef struct parameterRicker { // 雷克子波参数
int DomainFreq;
}parameterRicker; typedef struct parameterYus { // Yu's子波参数
float QFreq;
float PFreq;
}parameterYus; typedef struct parameterDoubleCos { // DoubleCos子波参数
float LowCut;
float LowPass;
float HighPass;
float HighCut; }parameterDoubleCos;

V ImpToSyn.cpp


#include"ImpToSyn.h" #define Min_Imp 1000.0 /*雷克子波*/
void Ricker(int Lr, //中心点
int L, //子波长度
float dalt, //采样间隔,单位:s
float fp, //主频
float *w, //子波数组
float *time,//横轴数组
float amp) //最大振幅
{
double temp;
double pi;
int Ll;
int k, i;
Ll = L - Lr - 1;
pi = 4.0 * atan(1.0); for (i = -Lr; i <= Ll; i++)
{
k = i + Lr;
temp = pi * fp * (dalt * i);
temp = temp * temp;
time[k] = (float)i * dalt * 1000.0;
w[k] = amp * (1.0 - 2.0 * temp) * exp(-temp);
} return;
} /*Yu's子波*/
void Double_Ricker(int Lr, int L, float dalt, float fq, float fp, float *w, float *time, float amp) //与Ricker相同,有Q,P两个频率
{
double temp1, temp2;
double pi;
int Ll;
int k, i;
Ll = L - Lr - 1;
pi = 4.0 * atan(1.0); for (i = -Lr; i <= Ll; i++)
{ k = i + Lr;
temp1 = pi * fq * (dalt * i);
temp2 = pi * fp * (dalt * i);
temp1 = temp1 * temp1;
temp2 = temp2 * temp2;
time[k] = (float)i * dalt * 1000.0;
w[k] = amp * (1.0 / (fq - fp)) * (fq * exp(-temp1) - fp * exp(-temp2));
} return;
} //计算双余弦子波频谱
void DoubleCos_Spec(int L, float dalf, float fLowCut, float fLowPass, float fHighPass, float fHighCut, float *pFreq, float *pSpec, float amp)
{
//------ bak ------
int i, j;
float fqe_temp;
float PI;
float xishu = 0; if (L % 2 > 0)
{
L--;
} PI = 4.0 * atan(1.0); for (i = 0; i < L / 2; i++)
{
fqe_temp = i * dalf;
pFreq[i] = fqe_temp; if (fqe_temp <= fLowCut)
{
pSpec[i] = 0.0;
}
else if (fLowCut < fLowPass && fqe_temp > fLowCut && fqe_temp < fLowPass)
{
pSpec[i] = 1.0 * ((xishu + 1.0) / (1.0 - xishu)
+ cos((fqe_temp - fLowCut) * PI / (fLowPass - fLowCut) + PI))
/ ((xishu + 1.0) / (1.0 - xishu) + 1.0);
pSpec[i] *= amp;
}
else if (fqe_temp >= fLowPass && fqe_temp <= fHighPass)
{
pSpec[i] = 1.0;
pSpec[i] *= amp;
}
else if (fHighPass < fHighCut && fqe_temp > fHighPass && fqe_temp < fHighCut)
{
pSpec[i] = 1.0 * ((xishu + 1.0) / (1.0 - xishu)
+ cos((fqe_temp - fHighPass) * PI / (fHighCut - fHighPass)))
/ ((xishu + 1.0) / (1.0 - xishu) + 1.0);
pSpec[i] *= amp;
}
else
{
pSpec[i] = 0.0;
}
} if (fLowPass == 0 && fLowPass == fLowCut)
{
pSpec[0] = amp;
} // 对称
j = L / 2 - 1; for (i = L / 2; i < L; i++)
{
if (j < 0)
{
break;
} fqe_temp = i * dalf;
pFreq[i] = fqe_temp;
pSpec[i] = pSpec[j];
j--;
} return;
} void DoubleCos_Wavelet(float *pSpec, int nFreqLen, int nK,
int nThickRatio,
int Lr, //中心点
int L, //子波长度
float dalt, //采样间隔 s
float *pTime, float *pValue, float amp)
{
//=========================先在频率域抽稀============================= int tFreqLen;
float fMaxValue = -1999.0;
tFreqLen = nFreqLen / nThickRatio;
float *pr = new float[tFreqLen]; // 振幅谱
float *pi = new float[tFreqLen]; // 相位谱
float *fr = new float[tFreqLen];
float *fi = new float[tFreqLen];
memset(pr, 0, sizeof(float)*tFreqLen); int i = 0, j, iCnt = 0;
int Ll, k; for (i = 0; i < nFreqLen; i += nThickRatio)
{
if (iCnt == tFreqLen)
{
break;
} pr[iCnt] = pSpec[i];
pi[iCnt] = 0.0;
iCnt++;
} //float *pr,float *pi,int n,int k,float *fr,float *fi,int l,int il
kkfft(pr, pi, tFreqLen, nK, fr, fi, 1, 0);
Ll = L - Lr - 1; j = Lr; for (i = -Lr; i <= 0; i++)
{
k = i + Lr;
pTime[k] = (float)i * dalt * 1000.0;
pValue[k] = amp * fr[j]; if (fMaxValue < pValue[k])
{
fMaxValue = pValue[k];
}
j--;
} j = L - 1; for (i = 1; i <= Ll; i++)
{
k = i + Lr;
pTime[k] = (float)i * dalt * 1000.0;
pValue[k] = amp * fr[j]; if (fMaxValue < pValue[k])
{
fMaxValue = pValue[k];
} j--;
} if (fMaxValue != 0)
{
for (i = 0; i < L; i++)
{
pValue[i] /= fMaxValue;
}
} delete[] pr;
delete[] pi;
delete[] fr;
delete[] fi;
return;
} void Preprocessing(float *Imp_in, unsigned int LenImp, int *start_end) { for (int i = 0; i < LenImp-1; i++)
{
//出现大于1000的部分记下来
if (Imp_in[i] > Min_Imp) {
start_end[0] = i;
break;
}
}
for (int j = LenImp-1; j >= 0; j--)
{
if (Imp_in[j] > Min_Imp) {
start_end[1] = j;
break;
}
} } //计算反射系数
void Compute_Rcs(float *Imp, float* Rcs, int LenImp) { float **Diff = NULL;
float *LnImp = NULL; Diff = alloc2float(LenImp - 1, LenImp); //差分矩阵
LnImp = (float*)calloc(LenImp, sizeof(float)); //波阻抗对数值 for (int i = 0; i < LenImp - 1; i++) {
for (int j = 0; j < LenImp; j++) {
if (i == j) { //当矩阵行列下标相等(i=j)时,取值为-0.5
Diff[i][j] = -0.5;
}
else if (i == j - 1) { //当矩阵下标i=j-1时,取值为0.5
Diff[i][j] = 0.5;
}
else { //其他情况,值为0
Diff[i][j] = 0;
}
}
} for (int i = 0; i < LenImp; i++) {
LnImp[i] = log(Imp[i]); //取对数
} matrixMultilcation(Diff, LnImp, Rcs, LenImp, LenImp - 1); //矩阵乘法 } //反射系数褶积子波得到合成记录
void Rcs2Syn(float *Rcs, float *Syn, int LenRcs, int WaveletType, int WaveletLenTemp, int WaveletInc) { float WaveletAmp = 1.0;
int WaveletLen = WaveletLenTemp /WaveletInc;
float *WaveletValue = NULL;
float *WaveletTime = NULL;
WaveletValue = (float*)calloc(WaveletLen, sizeof(float));
WaveletTime = (float*)calloc(WaveletLen, sizeof(float)); switch (WaveletType) {
case 1:
// type==1 雷克子波
parameterRicker Ricker_para;
Ricker_para.DomainFreq = 30; Ricker(WaveletLen / 2, WaveletLen, WaveletInc / 1000.f,
Ricker_para.DomainFreq, WaveletValue, WaveletTime, WaveletAmp);
break;
case 2:
//type==2 Yu's子波
parameterYus Yus_para;
Yus_para.QFreq = 60.0;
Yus_para.PFreq = 10.0;
Double_Ricker(WaveletLen / 2, WaveletLen, WaveletInc / 1000.f, Yus_para.QFreq, Yus_para.PFreq,
WaveletValue, WaveletTime, WaveletAmp);
break;
case 3:
//type==3 双余弦子波
parameterDoubleCos DoubleCos_para;
DoubleCos_para.HighCut = 80;
DoubleCos_para.HighPass = 60;
DoubleCos_para.LowCut = 8;
DoubleCos_para.LowPass = 12; int nK = getK(WaveletLen);
int SpecLen = (int)pow(2.0, nK - 1);
float FreqInc = 1000.0 / (2.0 * WaveletInc * SpecLen);
int ThickRatio = 8;
int DoubleCosSpecLen = int(SpecLen * 2 * ThickRatio);
float *DoubleCosFreq = NULL;
float *DoubleCosSpec = NULL; DoubleCosFreq = (float*)calloc(DoubleCosSpecLen, sizeof(float));
DoubleCosSpec = (float*)calloc(DoubleCosSpecLen, sizeof(float)); DoubleCos_Spec(DoubleCosSpecLen, FreqInc / ThickRatio, DoubleCos_para.LowCut, DoubleCos_para.LowPass,
DoubleCos_para.HighPass, DoubleCos_para.HighCut, DoubleCosFreq, DoubleCosSpec, WaveletAmp); DoubleCos_Wavelet(DoubleCosSpec, DoubleCosSpecLen, nK, ThickRatio, WaveletLen / 2, WaveletLen, WaveletInc / 1000.0,
WaveletTime, WaveletValue, 1.0); free(DoubleCosFreq);
free(DoubleCosSpec);
break;
} float *Signal = NULL;
int lenSignal = WaveletLen + LenRcs - 1;
Signal = (float*)calloc(lenSignal, sizeof(float)); convolve_cwp(LenRcs, 0, Rcs, WaveletLen, 0, WaveletValue, lenSignal, 0, Signal); memcpy(Syn, Signal + (WaveletLen - 1) / 2, (LenRcs) * sizeof(float)); free(WaveletValue);
free(WaveletTime);
free(Signal); }

VI main.cpp

#include "ImpToSyn.h"
#include"segy.h" int main(){ const char *filenameInput = "test.segy";
const char *filenameOutput = "Output66.segy"; bhed fileheader;
segy traceheader;
unsigned int nt = 0;
unsigned int sizefileheader = sizeof(fileheader);
unsigned int sizetraceheader = sizeof(traceheader);
unsigned int ncdp = 0;
long long size_file = 0;
long long size_trace = 0; FILE *fpinput = NULL;
FILE *fpoutput = NULL;
float *dataInput = NULL;
float *dataOutput = NULL; fpinput = fopen(filenameInput, "rb");
fpoutput = fopen(filenameOutput, "wb"); if (fpinput == NULL) {
printf("can not open %s file\n", filenameInput);
return false;
} if (fpoutput == NULL) {
printf("can not open %s file\n", filenameOutput);
return false;
} fread(&fileheader, sizefileheader, 1, fpinput); nt = fileheader.hns;
_fseeki64(fpinput, 0, SEEK_END);
size_file = _ftelli64(fpinput);
size_trace = nt * sizeof(float) + sizetraceheader; ncdp = (size_file - (long long)sizefileheader) / size_trace; _fseeki64(fpinput, sizefileheader, SEEK_SET); fwrite(&fileheader, sizefileheader, 1, fpoutput); dataInput = (float*)calloc(nt, sizeof(float)); int WaveletLenTemp = 128;
int WaveletInc = 1;
int WaveletType = 1; //选择子波类型 //遍历每一道
for (int itrace = 0; itrace < ncdp; itrace++)
{
fread(&traceheader, sizetraceheader, 1, fpinput);
fread(dataInput, nt * sizeof(float), 1, fpinput); //预处理
int *start_end = NULL;
start_end = (int*)calloc(2, sizeof(int));
Preprocessing(dataInput, nt, start_end);
int Start = 0;
int End = 0;
int LenImp = 0;
Start = start_end[0]; //获取有值的部分的起止位置
End = start_end[1];
LenImp = End - Start + 1;
int Boundary = 3; //边界
int LenImp_ex = LenImp + Boundary * 2; float *Imp = NULL;
float *Rcs = NULL;
float *syn = NULL;
//延展边界2个点
Imp = (float*)calloc(LenImp_ex , sizeof(float));
Rcs = (float*)calloc(LenImp_ex - 1, sizeof(float));
syn = (float*)calloc(LenImp_ex - 1, sizeof(float)); for (int i = Boundary; i < LenImp+Boundary; i++) {
Imp[i] = dataInput[Start-Boundary + i];
}
//上边界
for (int i = 0; i < Boundary; i++) {
Imp[i] = dataInput[Start];
}
//下边界
for (int i = LenImp+Boundary; i < LenImp + Boundary * 2; i++) {
Imp[i] = dataInput[End];
}
//第一步,计算反射系数
Compute_Rcs(Imp,Rcs,LenImp); //第二步,反射系数褶积子波 Rcs2Syn(Rcs,syn, LenImp_ex - 1, WaveletType, WaveletLenTemp, WaveletInc); dataOutput = (float*)calloc(nt, sizeof(float));
for (int i = 0; i < LenImp; i++) {
dataOutput[Start + i] = syn[i + Boundary];
// if ((itrace==250)&&(i==250))
// {
// printf("%f", dataOutput[Start+i]);
// }
} fwrite(&traceheader, sizetraceheader, 1, fpoutput);
fwrite(dataOutput, nt * sizeof(float), 1, fpoutput);
free(start_end);
free(Imp);
free(Rcs);
free(syn);
}
free(dataInput);
free(dataOutput); fclose(fpinput);
fclose(fpoutput); return 0;
}

C/C++实现合成地震记录的更多相关文章

  1. Python 包:

    分享一波油藏描述方面的Python开源包 前一阵去捷克参加了数学地质年会(IAMG2018),听完汇报,发现在数学地质领域用python的越来越多了,他们的很多成果都是用python做出来的.不管喜不 ...

  2. H5项目开发分享——用Canvas合成文字

    以前曾用Canvas合成.裁剪.图片等<用H5中的Canvas等技术制作海报>.这次用Canvas来画文字. 下图中"老王考到驾照后"这几个字是画在Canvas上的,与 ...

  3. 设计模式之合成/聚合利用原则(CARP)

    一.概念 CARP:CompositionAggregation Principle 合成聚合复用原则,尽量使用合成/聚合,尽量不使用类继承.合成聚合是“has  a”的关系,而继承是“is  a”的 ...

  4. .a静态库构架合成

    一.如果类库生成的构架和对应设备的构架不一致,会链接报错 如果项目中使用类库后,遇到形似Undefined symbols for architecture x86_64(x86_64架构下有未定义的 ...

  5. 二维码合成,将苹果和安卓(ios和android)合成一个二维码,让用户扫描一个二维码就可以分别下载苹果和安卓的应用

    因为公司推广的原因,没有合适的将苹果和安卓(ios和android)合成一个二维码的工具. 因为这个不难,主要是根据浏览器的UA进行判断,所以就自己开发了一个网站 网站名称叫:好推二维码  https ...

  6. UWP图片编辑器(涂鸦、裁剪、合成)

    一.编辑器简介 写这个控件之前总想找一找开源的,可以偷下懒省点事.可是各种地方都搜遍了也没有找到. 于是,那就做第一个吃螃蟹的人吧! 控件主要有三个功能:涂鸦.裁剪.合成. 涂鸦:主要是用到了InkT ...

  7. compass Sprites 雪碧图 小图片合成[Sass和compass学习笔记]

    demo 源码 地址 https://github.com/qqqzhch/webfans 什么是雪碧图? CSS雪碧 即CSS Sprites,也有人叫它CSS精灵,是一种CSS图像合并技术,该方法 ...

  8. C# 图片的裁剪,两个图片合成一个图片

    图片的裁剪,两个图片合成一个图片(这是从网上摘的) /// <summary>         /// 图片裁剪,生成新图,保存在同一目录下,名字加_new,格式1.png  新图1_ne ...

  9. 动画animation的三个应用(漂浮的白云、旋转的星球、正方体合成)

    × 目录 [1]漂浮的白云 [2]旋转的星球 [3]正方体合成 前面的话 前面介绍过动画animation的详细用法,本文主要介绍动画animation的三个效果 漂浮的白云 [效果演示] [简要介绍 ...

  10. .framework使用注意、静态库配置及构架合成

    使用注意: 1.项目中使用的framework中包含了资源文件时,需要手动添加该framework中的资源文件 2.由于动态库(framework默认生成为动态库)不能上架,我们在生成的时候需要修改为 ...

随机推荐

  1. 理解tomcat中的BIO、NIO、AIO、ARP

    理解tomcat中的BIO.NIO.AIO.ARP tomcat作为springboot中默认的web容器,了解tomcat的运转可以帮助我们更好的去调整tomcat的参数达到更好的性能 前置知识 I ...

  2. [开源] .NetCore 使用 ORM FreeSql 访问 Sqlite

    1.创建项目 我们以 console 类型项目试验 插入.删除.更新.查询 等功能,创建控制台项目,使用命令: dotnet new console dotnet add package FreeSq ...

  3. 需要的效果它都有,让AI对话开发效率翻倍!这款Ant Design扩展组件库绝了

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 ant-design-x-vue 是基于 Ant Design Vue 的扩展组件库,专注于 ...

  4. rider的xamarin环境安装

    自从用上rider后,vs就再也没有安装过了.最近要做apk开发,就安装xamarin环境,但是总是报错: Show Log->idea.log 发现下面错误: ERROR | Environm ...

  5. 使用IDEA管理服务器Docker及远程仓库

    目录 配置连接Docker服务器及远程仓库 连接服务器Docker 远程仓库(可选) IDEA管理 确保docker服务器已经开启了远程守护进程访问.[1] 配置连接Docker服务器及远程仓库 连接 ...

  6. Java--通过jdbc访问mysql数据库(mysql v8.0.11)

    由于mysql的更新,原来的连接数据库方法改变了 参考:http://www.cnblogs.com/rainbow70626/p/9005852.html package demo; import ...

  7. 【记录】ChatGPT|使用技巧(更新至2023年2月8日)

      昨天,2022年12月13日,在下午和晚上,ChatGPT 就开始因为请求过多而写到一半就崩溃,出现network error,可见它的关注度确实是越来越可观了.   正好最近世界杯,有博客活动, ...

  8. 【Uber 面试真题】SQL :每个星期连续5星评价最多的司机

    大家好,我是"蒋点数分",多年以来一直从事数据分析工作.从今天开始,与大家持续分享关于数据分析的学习内容. 本文是第一篇,也是[SQL 周周练]系列的第一篇.该系列是挑选或自编具有 ...

  9. MySQL中create_time 和 update_time实现自动更新时间

    也是最近在捣鼓前后端分离项目, 在写后端接口的时候便设计到数据库表建设, 这里规范显得很重要. 通常的建表规范, 必备三字段:id,create_time,update_time. id 必为主键,类 ...

  10. Pandas 批量处理文本表

    就是一个批量读取文件, 然后计算指标的过程. 难度到是没啥, 只是想记录一把, 毕竟这类的需求, 其实还是蛮多的. 但涉及一些数据的安全, 和指标这块也是不能透露的, 因此只能是贴上代码, 目的还是给 ...