/*
Multiplies the FFTed data held in the vector by another vector. The
behaviour depends on the size of the target vector:
* if it is the same size, it is assumed to be FFTed data
* if it is the same size of a power spectrum, then it is assumed that it
is multiplication by real values
* anything else won't make this function happy.
As a side note, if you only want multiplication by a scalar, the
standard #mul! should be what you look for.
*/
static VALUE dvector_fft_mul(VALUE self, VALUE m)
{
long len;
double * v1 = Dvector_Data_for_Write(self, &len);
long len2;
const double * v2 = Dvector_Data_for_Write(m, &len2);
if(len2 == len) { /* Full complex multiplication */
const double * m_img;
const double * m_real;
double * v_img;
double * v_real;
long i;
/* First, special cases */
v1[0] *= v2[0];
if(len % 2 == 0)
v1[len/2] *= v2[len/2];
for(i = 1, m_real = v2 + 1, m_img = v2 + len-1,
v_real = v1 + 1, v_img = v1 + len-1; i < (len+1)/2;
i++, m_real++, v_real++, m_img--, v_img--) {
double r = *m_real * *v_real - *m_img * *v_img;
*v_img = *m_real * *v_img + *v_real * *m_img;
*v_real = r;
}
return self;
}
else if(len2 == len/2+1) { /* Complex * real*/
const double * val;
double * v_img;
double * v_real;
long i;
/* First, special cases */
v1[0] *= v2[0];
if(len % 2 == 0)
v1[len/2] *= v2[len/2];
for(i = 1, val = v2 + 1,
v_real = v1 + 1, v_img = v1 + len-1; i < (len+1)/2;
i++, val++, v_real++, v_img--) {
*v_real *= *val;
*v_img *= *val;
}
return self;
}
else {
rb_raise(rb_eArgError, "incorrect Dvector size for fft_mul!");
}
}