/* 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!"); } }