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

1 由波阻抗获取反射系数
地震波在介质中传播时,作用于某个面积上的压力与单位时间内垂直通过此面积的质点流量(即面积乘质点振动速度)之比,具有阻力的含义,称为波阻抗,其数值等于介质密度\(\rho\)与波速\(v\)的乘积,即\(Z=\rho v\)。波阻抗差异形成地震反射,用反射系数表征上下界面差异,公式为
Z_{2}=Z_{1} \exp \left[\ln \left(\frac{1+r_{}}{1-r_{}}\right)\right]
\]
在实际情况下,反射系数\(r\)一般远远小于 1,即 \(r \ll 1\) 。则有如下关系:
\]
上式可化为:
\\ r_1=\frac{1}{2}(\ln Z_2-\ln Z_1)
\]
于是,通过对上下两层波阻抗的对数值作差,就能由此得到对应的反射系数。
将上式用矩阵的形式表示为:
{ - \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)\)为反射系数。震源在地表激发的时候震源在地表激发的时刻,地震子波被认为是一个尖脉冲信号。如果这个脉冲在传播过程中能量和波形均保持不变,那么地震记录就是反射系数剖面。而实际上子波在传播过程中,由于受球面扩散和吸收衰减的影响,并非严格的尖脉冲信号。

在本次实例中,使用的子波有以下三种:
/*
函数功能:
-由反射系数褶积地震子波,得到合成地震记录
输入:
-反射系数序列 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++实现合成地震记录的更多相关文章
- Python 包:
分享一波油藏描述方面的Python开源包 前一阵去捷克参加了数学地质年会(IAMG2018),听完汇报,发现在数学地质领域用python的越来越多了,他们的很多成果都是用python做出来的.不管喜不 ...
- H5项目开发分享——用Canvas合成文字
以前曾用Canvas合成.裁剪.图片等<用H5中的Canvas等技术制作海报>.这次用Canvas来画文字. 下图中"老王考到驾照后"这几个字是画在Canvas上的,与 ...
- 设计模式之合成/聚合利用原则(CARP)
一.概念 CARP:CompositionAggregation Principle 合成聚合复用原则,尽量使用合成/聚合,尽量不使用类继承.合成聚合是“has a”的关系,而继承是“is a”的 ...
- .a静态库构架合成
一.如果类库生成的构架和对应设备的构架不一致,会链接报错 如果项目中使用类库后,遇到形似Undefined symbols for architecture x86_64(x86_64架构下有未定义的 ...
- 二维码合成,将苹果和安卓(ios和android)合成一个二维码,让用户扫描一个二维码就可以分别下载苹果和安卓的应用
因为公司推广的原因,没有合适的将苹果和安卓(ios和android)合成一个二维码的工具. 因为这个不难,主要是根据浏览器的UA进行判断,所以就自己开发了一个网站 网站名称叫:好推二维码 https ...
- UWP图片编辑器(涂鸦、裁剪、合成)
一.编辑器简介 写这个控件之前总想找一找开源的,可以偷下懒省点事.可是各种地方都搜遍了也没有找到. 于是,那就做第一个吃螃蟹的人吧! 控件主要有三个功能:涂鸦.裁剪.合成. 涂鸦:主要是用到了InkT ...
- compass Sprites 雪碧图 小图片合成[Sass和compass学习笔记]
demo 源码 地址 https://github.com/qqqzhch/webfans 什么是雪碧图? CSS雪碧 即CSS Sprites,也有人叫它CSS精灵,是一种CSS图像合并技术,该方法 ...
- C# 图片的裁剪,两个图片合成一个图片
图片的裁剪,两个图片合成一个图片(这是从网上摘的) /// <summary> /// 图片裁剪,生成新图,保存在同一目录下,名字加_new,格式1.png 新图1_ne ...
- 动画animation的三个应用(漂浮的白云、旋转的星球、正方体合成)
× 目录 [1]漂浮的白云 [2]旋转的星球 [3]正方体合成 前面的话 前面介绍过动画animation的详细用法,本文主要介绍动画animation的三个效果 漂浮的白云 [效果演示] [简要介绍 ...
- .framework使用注意、静态库配置及构架合成
使用注意: 1.项目中使用的framework中包含了资源文件时,需要手动添加该framework中的资源文件 2.由于动态库(framework默认生成为动态库)不能上架,我们在生成的时候需要修改为 ...
随机推荐
- 【EasyPR】Linux安装使用EasyPR开源车牌识别系统
[EasyPR]Linux安装使用EasyPR开源车牌识别系统 零.安装OpenCV - 3.2.0 我使用的是Kali系统,基于Debian的一个Linux发行版本. 1.配置系统的软件源(配置正确 ...
- 『Plotly实战指南』--饼图绘制高级篇
在数据可视化的世界里,饼图是最直观的展示比例关系的工具之一. 然而,传统的静态饼图已经无法满足现代数据分析的需求.Plotly作为一款强大的可视化库,不仅提供了饼图丰富的基础功能,还支持交互效果和动态 ...
- AI时代:本地运行大模型vllm
https://docs.vllm.ai/en/latest/index.html 高吞吐量.高内存效率的 LLMs 推理和服务引擎(快速搭建本地大模型,且openAI API 兼容) vLLM is ...
- Web前端入门第 30 问:CSS 文本与字体样式常用属性
CSS 盒模型是基石,文本和字体则是盒子内容的重要组成部分.毕竟清水房有了,软装也得跟上啊. 字体常用属性 font-family 定义字体类型(如: Arial, "Microsoft Y ...
- CPU 和GPUskinning对比
CPU: 比如广泛的设备兼容性,比如上面说的精确逻辑处理,比如可以根据距离对Skinning进行LOD(如近距离角色每秒30帧Skinning,远距离角色每秒15帧Skinning),比如多Pass渲 ...
- 延迟补偿在C/S架构游戏协议设计和优化中的应用
延迟补偿在C/S架构游戏协议设计和优化中的应用 1 分钟读完 1.综述Permalink 第一人称角色网络游戏的设计是一项很有挑战性的工作.网络环境下的健壮性,是动作游戏能否成功的一个重要因素.另外, ...
- 【电子DIY神器】通吃各种5线步进电机!I2C接口控制28BYJ-48五线四相步进电机
总线单极性步进电机驱动板 摘要 总线单极性步进电机扩展板采用紧凑型设计,兼容XIAO系列主控板直连或独立使用,支持级联16个模块.板载ULN2003达林顿管驱动芯片(单通道500mA/整片2.5A), ...
- TGCTF2025 部分题目WP
TGCTF 2025 Web AAA偷渡阴平 ?tgctf2025=eval(end(current(get_defined_vars())));&b=system('cat /flag'); ...
- web自动化的鼠标操作
有些场景不适合点击或进行某些操作,可运用action类模拟鼠标操作.在操作一个页面元素时有时需要一连串的动作来配合的时候,可以使用action来完成. Actions actions= new Act ...
- 查阅相关资料, 了解什么是scrum中的3355?
在Scrum中,3355是一个用于描述其核心组成部分的模型,具体包括三个核心角色.三个工件.五个关键事件和五个价值观.下面是对Scrum中3355的详细解释: 三个核心角色 产品负责人(Product ...