56 void InvDLTSemi(
double* coeffs,
const int bw,
const int m,
double* result,
double* trans_cos_pml_table,
57 double* sin_values,
double* workspace, fftw_plan* plan) {
61 memset(workspace, 0,
sizeof(
double) * size);
62 memset(result, 0,
sizeof(
double) * size);
64 double* fcos = workspace;
65 double* trans_tableptr = trans_cos_pml_table;
67 double coeff = 0.5 / sqrt(bw);
74 for (
int i = 0; i < bw; ++i) {
75 if (i == (bw - 1) && m % 2) {
82 assoc_offset = coeffs + (i - m) + (m % 2);
84 assoc_offset = coeffs + (i % 2);
89 for (
int j = 0; j < rowsize; ++j)
90 value += assoc_offset[2 * j] * trans_tableptr[j];
92 fcos[i] = value * coeff;
94 trans_tableptr += rowsize;
98 fcos[0] /= (sqrt(size) * coeff);
107 fftw_execute_r2r(*plan, fcos, result);
113 for (
int i = 0; i < size; ++i)
114 result[i] *= sin_values[i];
153 void DLTSemi(
double* data,
const int bw,
const int m,
double* result,
double* workspace,
double* cos_pml_table,
154 double* weights, fftw_plan* plan) {
158 double* weighted_data = workspace;
159 double* cos_data = weighted_data + size;
163 for (
int i = 0; i < size; ++i)
164 weighted_data[i] = data[i] * weights[2 * bw + i];
166 for (
int i = 0; i < size; ++i)
167 weighted_data[i] = data[i] * weights[i];
170 fftw_execute_r2r(*plan, weighted_data, cos_data);
173 cos_data[0] *= M_SQRT1_2;
174 double coeff = 1. / sqrt(2. * size);
175 for (
int i = 0; i < size; ++i)
176 cos_data[i] *= coeff;
184 for (
int i = m; i < bw; ++i) {
185 double* pml_ptr = cos_pml_table +
TableOffset(m, i);
188 for (
int j = 0; j < (i / 2); ++j)
189 value += cos_data[(2 * j) + toggle] * pml_ptr[j];
191 if (!((i - m) % 2) || !(m % 2))
192 value += cos_data[(2 * (i / 2)) + toggle] * pml_ptr[(i / 2)];
194 result[i - m] = value;
196 toggle = (toggle + 1) % 2;