static VALUE t_left_shift(VALUE self, VALUE obj) { Cmat *M = r2cmat(obj); LogCompressor *lc; VALUE lcv = rb_iv_get(self, "@log_compressor"); Data_Get_Struct(lcv, LogCompressor, lc); Cmat *N = log_compressor_apply(lc, M); VALUE result = cmat2r(N); cmat_free(N); cmat_free(M); return result; }
static VALUE t_left_shift(VALUE self, VALUE obj) { Cmat *M = r2cmat(obj); HammingWindow *hw; VALUE hwv = rb_iv_get(self, "@hw"); Data_Get_Struct(hwv, HammingWindow, hw); Cmat *N = hamming_window_apply(hw, M); VALUE result = cmat2r(N); cmat_free(N); cmat_free(M); return result; }
static VALUE t_left_shift(VALUE self, VALUE obj) { Carr *M = r2carr(obj); VALUE mfcc_16x8 = rb_iv_get(self, "@mfcc_16x8"); Mfcc16x8 *s; Data_Get_Struct(mfcc_16x8, Mfcc16x8, s); Cmat *N = mfcc_16x8_apply(s, M); VALUE result = cmat2r(N); cmat_free(N); carr_free(M); return result; }
Cmat *power_spectrum_apply(PowerSpectrum *self, Cmat *data) { Cmat *ps = cmat_new(data->rows, self->n_uniq_fft_points); int i,j; for (i=0;i<data->rows;++i) { Cmat * ffts = dft(data->data[i], data->cols, self->nfft); for (j=0;j<self->n_uniq_fft_points;++j) { ps->data[i][j] = pow(ffts->data[0][j],2) + pow(ffts->data[1][j],2); } cmat_free(ffts); } return ps; }
static VALUE t_left_shift(VALUE self, VALUE obj) { Cmat *M = r2cmat(obj); VALUE mel_filter = rb_iv_get(self, "@mel_filter"); MelFilter *s; Data_Get_Struct(mel_filter, MelFilter, s); Cmat *d = mel_filter_apply(s, M); cmat_free(M); if (d) { VALUE result = rb_ary_new2(d->rows); int i,j; for (i=0;i<d->rows;++i) { VALUE row = rb_ary_new2(d->cols); rb_ary_store(result, i, row); for (j=0;j<d->cols;++j) { rb_ary_store(row, j, rb_float_new(d->data[i][j])); } } cmat_free(d); return result; } return Qnil; }
static VALUE t_make_bank_parameters(VALUE self, VALUE srate, VALUE nfft, VALUE nfilt, VALUE lowerf, VALUE upperf) { Cmat *d = make_bank_parameters(NUM2INT(srate), NUM2INT(nfft), NUM2INT(nfilt), NUM2INT(lowerf), NUM2INT(upperf)); if (d) { VALUE result = rb_ary_new2(d->rows); int i,j; for (i=0;i<d->rows;++i) { VALUE row = rb_ary_new2(d->cols); rb_ary_store(result, i, row); for (j=0;j<d->cols;++j) { rb_ary_store(row, j, rb_float_new(d->data[i][j])); } } cmat_free(d); return result; } return Qnil; }
/** @brief 逆反復法で行列Aの固有ベクトルXを1個のみ計算. @param[in] n 行列サイズ. @param[in] A 固有値計算をする(n,n)型行列. @param[in] LDA Aの第1次元. @param[in] lambda 計算済みの固有値. @param[in] x 初期化済みのn次ベクトル. @param[out] x 計算された固有ベクトル. @param[in] debug デバッグ. */ void ceig_ii_1pair(int n, cmulti **x, cmulti **A, int LDA, cmulti *lambda, int debug) { int prec=53,*p=NULL,info,i; cmulti **B=NULL; rmulti *eps=NULL; // allocate p=ivec_allocate(n); prec=cvec_get_prec_max(n,x); B=cmat_allocate_prec(n,n,prec); // LU decomposition info=1; i=0; while(info){ // B=A-diag(lambda) cmat_diag_sub_c(n,n,B,n,A,LDA,lambda); // B=B+diag(i*eps) eps=rmepsilon(prec); rmul_si(eps,eps,i); cmat_diag_add_r(n,n,B,n,B,n,eps); eps=rfree(eps); // B=L*U csolve_lu_decomp(n,B,n,p,&info); // next if(debug>=1){ printf("[%s] LU: step=%02d\n",NAME_CEIGII_1PAIR,i); } i++; }; // compute cvec_set_rand(n,x,2,-1); cvec_normalize_sgn(n,x,x); for(i=0; i<2; i++){ csolve_lu_backsubs(n,1,x,n,B,n,p); cvec_normalize_sgn(n,x,x); if(debug>=1){ printf("[%s] II: step=%02d\n",NAME_CEIGII_1PAIR,i); } } // done p=ivec_free(p); B=cmat_free(n,n,B); }