Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * File: coupled_plca.c
- *
- * MATLAB Coder version : 2.8
- * C/C++ source code generated on : 15-Jul-2015 06:42:26
- */
- /* Include Files */
- #include "rt_nonfinite.h"
- #include "coupled_plca.h"
- #include "coupled_plca_emxutil.h"
- #include "sum.h"
- #include "bsxfun.h"
- #include "diag.h"
- #include "conv2.h"
- #include "mrdivide.h"
- #include "rand.h"
- #include "randperm.h"
- /* Function Declarations */
- static void eml_xgemm(int m, const emxArray_real_T *A, int lda, const double B
- [257275], emxArray_real_T *C, int ldc);
- /* Function Definitions */
- /*
- * Arguments : int m
- * const emxArray_real_T *A
- * int lda
- * const double B[257275]
- * emxArray_real_T *C
- * int ldc
- * Return Type : void
- */
- static void eml_xgemm(int m, const emxArray_real_T *A, int lda, const double B
- [257275], emxArray_real_T *C, int ldc)
- {
- int c;
- int cr;
- int i6;
- int ic;
- int br;
- int ar;
- int ib;
- int ia;
- if (m == 0) {
- } else {
- c = ldc * 250;
- cr = 0;
- while ((ldc > 0) && (cr <= c)) {
- i6 = cr + m;
- for (ic = cr; ic + 1 <= i6; ic++) {
- C->data[ic] = 0.0;
- }
- cr += ldc;
- }
- br = 0;
- cr = 0;
- while ((ldc > 0) && (cr <= c)) {
- ar = -1;
- for (ib = br; ib + 1 <= br + 1025; ib++) {
- if (B[ib] != 0.0) {
- ia = ar;
- i6 = cr + m;
- for (ic = cr; ic + 1 <= i6; ic++) {
- ia++;
- C->data[ic] += B[ib] * A->data[ia];
- }
- }
- ar += lda;
- }
- br += 1025;
- cr += ldc;
- }
- }
- }
- /*
- * Perform coupled PLCA
- *
- * [w zf zt h] = coupled_plca(spec_f, spec_t, Bs, Bt, R, iter)
- *
- * spec_f: spectrogram with high spectral resolution
- * spec_t: spectrogram with high time resolution
- * Bs = blurring function for spectral components
- * Bt = blurring function for temporal components
- * R = number of components
- * iter = number of EM iterations
- *
- * Output parameters
- * w = spectral basis vectors (hi-res)
- * zf = component weights for spectral vectors
- * zt = component weights for temporal vectors
- * h = temporal vectors (hi-res too!)
- *
- * Juhan Nam
- * Apr-11-2010: initial version
- * Mar-11-2013: normalizing blur_h and blur_w right after blurring
- * Arguments : const double spec_f[257275]
- * const double spec_t[257275]
- * double Bs[257]
- * const double Bt[7]
- * double R
- * double iter
- * emxArray_real_T *w
- * emxArray_real_T *zf
- * emxArray_real_T *zt
- * emxArray_real_T *h
- * Return Type : void
- */
- void coupled_plca(const double spec_f[257275], const double spec_t[257275],
- double Bs[257], const double Bt[7], double R, double iter,
- emxArray_real_T *w, emxArray_real_T *zf, emxArray_real_T *zt,
- emxArray_real_T *h)
- {
- double ind[251];
- int br;
- int i;
- int firstRowA;
- emxArray_real_T *b_w;
- int tmp_size[2];
- double tmp_data[251];
- emxArray_real_T *a;
- emxArray_real_T *b_h;
- emxArray_real_T *r0;
- emxArray_real_T *b_zf;
- emxArray_real_T *b_zt;
- int it;
- emxArray_real_T *blur_h;
- emxArray_real_T *zfh;
- emxArray_real_T *blur_w;
- emxArray_real_T *nw;
- emxArray_real_T *nh;
- emxArray_real_T *C;
- emxArray_real_T *b;
- emxArray_real_T *b_a;
- emxArray_real_T *b_blur_w;
- emxArray_real_T *c_a;
- emxArray_real_T *b_blur_h;
- static double Rf[257275];
- int ar;
- int k;
- int iB;
- int ib;
- int ia;
- short unnamed_idx_1;
- boolean_T b0;
- int na;
- int lastColB;
- int lastColA;
- int c;
- int b_i;
- int a_length;
- double b_tmp_data[251];
- int b_tmp_size[2];
- static double y[257275];
- unsigned int b_unnamed_idx_1;
- static double b_spec_t[257275];
- int nzf_size[2];
- double nzf_data[251];
- int nzt_size[2];
- double nzt_data[251];
- int c_tmp_size[2];
- double a_data[251];
- int a_size[1];
- emxArray_real_T b_a_data;
- double b_nzf_data[251];
- int b_nzf_size[2];
- double B;
- double b_nzt_data[251];
- int b_nzt_size[2];
- /* size check */
- /* initializations */
- /* spectral basis vectors, */
- /* w = rand(m, R)+1; */
- randperm(ind);
- if (1.0 > R) {
- br = 0;
- } else {
- br = (int)R;
- }
- i = w->size[0] * w->size[1];
- w->size[0] = 1025;
- w->size[1] = br;
- emxEnsureCapacity((emxArray__common *)w, i, (int)sizeof(double));
- for (i = 0; i < br; i++) {
- for (firstRowA = 0; firstRowA < 1025; firstRowA++) {
- w->data[firstRowA + w->size[0] * i] = spec_f[firstRowA + 1025 * ((int)
- ind[i] - 1)] + 2.2204460492503131E-16;
- }
- }
- emxInit_real_T(&b_w, 2);
- sum(w, tmp_data, tmp_size);
- i = b_w->size[0] * b_w->size[1];
- b_w->size[0] = 1025;
- b_w->size[1] = w->size[1];
- emxEnsureCapacity((emxArray__common *)b_w, i, (int)sizeof(double));
- br = w->size[0] * w->size[1];
- for (i = 0; i < br; i++) {
- b_w->data[i] = w->data[i];
- }
- bsxfun(b_w, tmp_data, tmp_size, w);
- /* temporal basis vectors */
- c_rand(R, h);
- i = h->size[0] * h->size[1];
- h->size[1] = 251;
- emxEnsureCapacity((emxArray__common *)h, i, (int)sizeof(double));
- br = h->size[0];
- firstRowA = h->size[1];
- br *= firstRowA;
- emxFree_real_T(&b_w);
- for (i = 0; i < br; i++) {
- h->data[i]++;
- }
- b_emxInit_real_T(&a, 1);
- emxInit_real_T(&b_h, 2);
- b_sum(h, a);
- i = b_h->size[0] * b_h->size[1];
- b_h->size[0] = h->size[0];
- b_h->size[1] = 251;
- emxEnsureCapacity((emxArray__common *)b_h, i, (int)sizeof(double));
- br = h->size[0] * h->size[1];
- for (i = 0; i < br; i++) {
- b_h->data[i] = h->data[i];
- }
- b_bsxfun(b_h, a, h);
- d_rand(R, zf);
- i = zf->size[0] * zf->size[1];
- emxEnsureCapacity((emxArray__common *)zf, i, (int)sizeof(double));
- br = zf->size[0];
- firstRowA = zf->size[1];
- br *= firstRowA;
- emxFree_real_T(&b_h);
- for (i = 0; i < br; i++) {
- zf->data[i]++;
- }
- emxInit_real_T(&r0, 2);
- emxInit_real_T(&b_zf, 2);
- /* weights vector for good freq res plca */
- c_sum(zf, r0);
- i = b_zf->size[0] * b_zf->size[1];
- b_zf->size[0] = zf->size[0];
- b_zf->size[1] = zf->size[1];
- emxEnsureCapacity((emxArray__common *)b_zf, i, (int)sizeof(double));
- br = zf->size[0] * zf->size[1];
- for (i = 0; i < br; i++) {
- b_zf->data[i] = zf->data[i];
- }
- mrdivide(b_zf, r0, zf);
- /* normalize */
- d_rand(R, zt);
- i = zt->size[0] * zt->size[1];
- emxEnsureCapacity((emxArray__common *)zt, i, (int)sizeof(double));
- br = zt->size[0];
- firstRowA = zt->size[1];
- br *= firstRowA;
- emxFree_real_T(&b_zf);
- for (i = 0; i < br; i++) {
- zt->data[i]++;
- }
- emxInit_real_T(&b_zt, 2);
- /* weights vector for good time res plca */
- c_sum(zt, r0);
- i = b_zt->size[0] * b_zt->size[1];
- b_zt->size[0] = zt->size[0];
- b_zt->size[1] = zt->size[1];
- emxEnsureCapacity((emxArray__common *)b_zt, i, (int)sizeof(double));
- br = zt->size[0] * zt->size[1];
- for (i = 0; i < br; i++) {
- b_zt->data[i] = zt->data[i];
- }
- mrdivide(b_zt, r0, zt);
- /* normalize */
- emxFree_real_T(&b_zt);
- emxFree_real_T(&r0);
- /* vertical */
- /* horizontal */
- /* EM iterations */
- it = 0;
- emxInit_real_T(&blur_h, 2);
- emxInit_real_T(&zfh, 2);
- emxInit_real_T(&blur_w, 2);
- emxInit_real_T(&nw, 2);
- emxInit_real_T(&nh, 2);
- emxInit_real_T(&C, 2);
- emxInit_real_T(&b, 2);
- emxInit_real_T(&b_a, 2);
- emxInit_real_T(&b_blur_w, 2);
- b_emxInit_real_T(&c_a, 1);
- emxInit_real_T(&b_blur_h, 2);
- while (it <= (int)iter - 1) {
- /* E-step for high frequency resolution spectrogram */
- conv2(h, Bt, blur_h);
- b_sum(blur_h, a);
- i = c_a->size[0];
- c_a->size[0] = a->size[0];
- emxEnsureCapacity((emxArray__common *)c_a, i, (int)sizeof(double));
- br = a->size[0];
- for (i = 0; i < br; i++) {
- c_a->data[i] = a->data[i] + 2.2204460492503131E-16;
- }
- i = b_blur_h->size[0] * b_blur_h->size[1];
- b_blur_h->size[0] = blur_h->size[0];
- b_blur_h->size[1] = 251;
- emxEnsureCapacity((emxArray__common *)b_blur_h, i, (int)sizeof(double));
- br = blur_h->size[0] * blur_h->size[1];
- for (i = 0; i < br; i++) {
- b_blur_h->data[i] = blur_h->data[i];
- }
- b_bsxfun(b_blur_h, c_a, blur_h);
- diag(zf, a);
- i = zfh->size[0] * zfh->size[1];
- zfh->size[0] = a->size[0];
- zfh->size[1] = 251;
- emxEnsureCapacity((emxArray__common *)zfh, i, (int)sizeof(double));
- br = a->size[0];
- for (i = 0; i < br; i++) {
- for (firstRowA = 0; firstRowA < 251; firstRowA++) {
- zfh->data[i + zfh->size[0] * firstRowA] = a->data[i] * blur_h->
- data[firstRowA];
- }
- }
- if ((w->size[1] == 1) || (zfh->size[0] == 1)) {
- for (i = 0; i < 1025; i++) {
- for (firstRowA = 0; firstRowA < 251; firstRowA++) {
- Rf[i + 1025 * firstRowA] = 0.0;
- br = w->size[1];
- for (ar = 0; ar < br; ar++) {
- Rf[i + 1025 * firstRowA] += w->data[i + w->size[0] * ar] * zfh->
- data[ar + zfh->size[0] * firstRowA];
- }
- }
- }
- } else {
- k = w->size[1];
- memset(&Rf[0], 0, 257275U * sizeof(double));
- for (firstRowA = 0; firstRowA < 256252; firstRowA += 1025) {
- for (iB = firstRowA; iB + 1 <= firstRowA + 1025; iB++) {
- Rf[iB] = 0.0;
- }
- }
- br = 0;
- for (firstRowA = 0; firstRowA < 256252; firstRowA += 1025) {
- ar = 0;
- i = br + k;
- for (ib = br; ib + 1 <= i; ib++) {
- if (zfh->data[ib] != 0.0) {
- ia = ar;
- for (iB = firstRowA; iB + 1 <= firstRowA + 1025; iB++) {
- ia++;
- Rf[iB] += zfh->data[ib] * w->data[ia - 1];
- }
- }
- ar += 1025;
- }
- br += k;
- }
- }
- for (i = 0; i < 257275; i++) {
- Rf[i] = spec_f[i] / Rf[i];
- }
- /* E for high time resolution spectrogram */
- diag(zt, a);
- i = blur_h->size[0] * blur_h->size[1];
- blur_h->size[0] = a->size[0];
- blur_h->size[1] = 251;
- emxEnsureCapacity((emxArray__common *)blur_h, i, (int)sizeof(double));
- br = a->size[0];
- for (i = 0; i < br; i++) {
- for (firstRowA = 0; firstRowA < 251; firstRowA++) {
- blur_h->data[i + blur_h->size[0] * firstRowA] = a->data[i] * h->
- data[firstRowA];
- }
- }
- unnamed_idx_1 = (short)w->size[1];
- i = blur_w->size[0] * blur_w->size[1];
- blur_w->size[0] = 1025;
- emxEnsureCapacity((emxArray__common *)blur_w, i, (int)sizeof(double));
- i = blur_w->size[0] * blur_w->size[1];
- blur_w->size[1] = unnamed_idx_1;
- emxEnsureCapacity((emxArray__common *)blur_w, i, (int)sizeof(double));
- br = 1025 * unnamed_idx_1;
- for (i = 0; i < br; i++) {
- blur_w->data[i] = 0.0;
- }
- if ((w->size[1] == 0) || (unnamed_idx_1 == 0)) {
- b0 = true;
- } else {
- b0 = false;
- }
- if (!b0) {
- na = w->size[1];
- if (1 <= unnamed_idx_1 - 1) {
- lastColB = 1;
- } else {
- lastColB = unnamed_idx_1;
- }
- br = 0;
- while (br <= lastColB - 1) {
- if (na - 1 < unnamed_idx_1 - 1) {
- lastColA = na;
- } else {
- lastColA = unnamed_idx_1;
- }
- for (k = 0; k < lastColA; k++) {
- if (k >= 0) {
- firstRowA = k;
- } else {
- firstRowA = 0;
- }
- ia = firstRowA * 1025;
- c = k * 1025;
- iB = 0;
- for (i = 0; i < 257; i++) {
- if (i < 128) {
- firstRowA = 128 - i;
- } else {
- firstRowA = 0;
- }
- if (i + 1025 <= 1152) {
- b_i = 1025;
- } else {
- b_i = 1153 - i;
- }
- a_length = b_i - firstRowA;
- br = c + firstRowA;
- ar = ia;
- for (ib = 1; ib <= a_length; ib++) {
- blur_w->data[ar] += Bs[iB] * w->data[br];
- br++;
- ar++;
- }
- iB++;
- if (i >= 128) {
- ia++;
- }
- }
- }
- br = 1;
- }
- }
- sum(blur_w, tmp_data, tmp_size);
- b_tmp_size[0] = 1;
- b_tmp_size[1] = tmp_size[1];
- br = tmp_size[0] * tmp_size[1];
- for (i = 0; i < br; i++) {
- b_tmp_data[i] = tmp_data[i] + 2.2204460492503131E-16;
- }
- i = b_blur_w->size[0] * b_blur_w->size[1];
- b_blur_w->size[0] = 1025;
- b_blur_w->size[1] = blur_w->size[1];
- emxEnsureCapacity((emxArray__common *)b_blur_w, i, (int)sizeof(double));
- br = blur_w->size[0] * blur_w->size[1];
- for (i = 0; i < br; i++) {
- b_blur_w->data[i] = blur_w->data[i];
- }
- bsxfun(b_blur_w, b_tmp_data, b_tmp_size, blur_w);
- if ((blur_w->size[1] == 1) || (blur_h->size[0] == 1)) {
- for (i = 0; i < 1025; i++) {
- for (firstRowA = 0; firstRowA < 251; firstRowA++) {
- y[i + 1025 * firstRowA] = 0.0;
- br = blur_w->size[1];
- for (ar = 0; ar < br; ar++) {
- y[i + 1025 * firstRowA] += blur_w->data[i + blur_w->size[0] * ar] *
- blur_h->data[ar + blur_h->size[0] * firstRowA];
- }
- }
- }
- } else {
- k = blur_w->size[1];
- memset(&y[0], 0, 257275U * sizeof(double));
- for (firstRowA = 0; firstRowA < 256252; firstRowA += 1025) {
- for (iB = firstRowA; iB + 1 <= firstRowA + 1025; iB++) {
- y[iB] = 0.0;
- }
- }
- br = 0;
- for (firstRowA = 0; firstRowA < 256252; firstRowA += 1025) {
- ar = 0;
- i = br + k;
- for (ib = br; ib + 1 <= i; ib++) {
- if (blur_h->data[ib] != 0.0) {
- ia = ar;
- for (iB = firstRowA; iB + 1 <= firstRowA + 1025; iB++) {
- ia++;
- y[iB] += blur_h->data[ib] * blur_w->data[ia - 1];
- }
- }
- ar += 1025;
- }
- br += k;
- }
- }
- /* M-step */
- i = b->size[0] * b->size[1];
- b->size[0] = 251;
- b->size[1] = zfh->size[0];
- emxEnsureCapacity((emxArray__common *)b, i, (int)sizeof(double));
- br = zfh->size[0];
- for (i = 0; i < br; i++) {
- for (firstRowA = 0; firstRowA < 251; firstRowA++) {
- b->data[firstRowA + b->size[0] * i] = zfh->data[i + zfh->size[0] *
- firstRowA];
- }
- }
- b_unnamed_idx_1 = (unsigned int)b->size[1];
- i = C->size[0] * C->size[1];
- C->size[0] = 1025;
- emxEnsureCapacity((emxArray__common *)C, i, (int)sizeof(double));
- i = C->size[0] * C->size[1];
- C->size[1] = (int)b_unnamed_idx_1;
- emxEnsureCapacity((emxArray__common *)C, i, (int)sizeof(double));
- br = 1025 * (int)b_unnamed_idx_1;
- for (i = 0; i < br; i++) {
- C->data[i] = 0.0;
- }
- if (b->size[1] == 0) {
- } else {
- c = 1025 * (b->size[1] - 1);
- for (firstRowA = 0; firstRowA <= c; firstRowA += 1025) {
- for (iB = firstRowA; iB + 1 <= firstRowA + 1025; iB++) {
- C->data[iB] = 0.0;
- }
- }
- br = 0;
- for (firstRowA = 0; firstRowA <= c; firstRowA += 1025) {
- ar = 0;
- for (ib = br; ib + 1 <= br + 251; ib++) {
- if (b->data[ib] != 0.0) {
- ia = ar;
- for (iB = firstRowA; iB + 1 <= firstRowA + 1025; iB++) {
- ia++;
- C->data[iB] += b->data[ib] * Rf[ia - 1];
- }
- }
- ar += 1025;
- }
- br += 251;
- }
- }
- i = nw->size[0] * nw->size[1];
- nw->size[0] = 1025;
- nw->size[1] = w->size[1];
- emxEnsureCapacity((emxArray__common *)nw, i, (int)sizeof(double));
- br = w->size[0] * w->size[1];
- for (i = 0; i < br; i++) {
- nw->data[i] = w->data[i] * C->data[i];
- }
- i = b_a->size[0] * b_a->size[1];
- b_a->size[0] = w->size[1];
- b_a->size[1] = 1025;
- emxEnsureCapacity((emxArray__common *)b_a, i, (int)sizeof(double));
- for (i = 0; i < 1025; i++) {
- br = w->size[1];
- for (firstRowA = 0; firstRowA < br; firstRowA++) {
- b_a->data[firstRowA + b_a->size[0] * i] = w->data[i + w->size[0] *
- firstRowA];
- }
- }
- b_unnamed_idx_1 = (unsigned int)b_a->size[0];
- i = nh->size[0] * nh->size[1];
- nh->size[0] = (int)b_unnamed_idx_1;
- nh->size[1] = 251;
- emxEnsureCapacity((emxArray__common *)nh, i, (int)sizeof(double));
- br = (int)b_unnamed_idx_1 * 251;
- for (i = 0; i < br; i++) {
- nh->data[i] = 0.0;
- }
- for (i = 0; i < 257275; i++) {
- b_spec_t[i] = spec_t[i] / y[i];
- }
- eml_xgemm(b_a->size[0], b_a, b_a->size[0], b_spec_t, nh, b_a->size[0]);
- i = nh->size[0] * nh->size[1];
- nh->size[0] = blur_h->size[0];
- nh->size[1] = 251;
- emxEnsureCapacity((emxArray__common *)nh, i, (int)sizeof(double));
- br = blur_h->size[0] * blur_h->size[1];
- for (i = 0; i < br; i++) {
- nh->data[i] *= blur_h->data[i];
- }
- sum(nw, nzf_data, nzf_size);
- sum(blur_w, nzt_data, nzt_size);
- /* normalize */
- sum(nw, tmp_data, tmp_size);
- c_tmp_size[0] = 1;
- c_tmp_size[1] = tmp_size[1];
- br = tmp_size[0] * tmp_size[1];
- for (i = 0; i < br; i++) {
- b_tmp_data[i] = tmp_data[i] + 2.2204460492503131E-16;
- }
- bsxfun(nw, b_tmp_data, c_tmp_size, w);
- b_sum(nh, a);
- a_size[0] = a->size[0];
- br = a->size[0];
- for (i = 0; i < br; i++) {
- a_data[i] = a->data[i] + 2.2204460492503131E-16;
- }
- b_a_data.data = (double *)&a_data;
- b_a_data.size = (int *)&a_size;
- b_a_data.allocatedSize = 251;
- b_a_data.numDimensions = 1;
- b_a_data.canFreeData = false;
- b_bsxfun(nh, &b_a_data, h);
- b_nzf_size[0] = 1;
- b_nzf_size[1] = nzf_size[1];
- br = nzf_size[0] * nzf_size[1];
- for (i = 0; i < br; i++) {
- b_nzf_data[i] = nzf_data[i] + 2.2204460492503131E-16;
- }
- B = d_sum(b_nzf_data, b_nzf_size);
- i = zf->size[0] * zf->size[1];
- zf->size[0] = 1;
- zf->size[1] = nzf_size[1];
- emxEnsureCapacity((emxArray__common *)zf, i, (int)sizeof(double));
- br = nzf_size[0] * nzf_size[1];
- for (i = 0; i < br; i++) {
- zf->data[i] = nzf_data[i] / B;
- }
- b_nzt_size[0] = 1;
- b_nzt_size[1] = nzt_size[1];
- br = nzt_size[0] * nzt_size[1];
- for (i = 0; i < br; i++) {
- b_nzt_data[i] = nzt_data[i] + 2.2204460492503131E-16;
- }
- B = d_sum(b_nzt_data, b_nzt_size);
- i = zt->size[0] * zt->size[1];
- zt->size[0] = 1;
- zt->size[1] = nzt_size[1];
- emxEnsureCapacity((emxArray__common *)zt, i, (int)sizeof(double));
- br = nzt_size[0] * nzt_size[1];
- for (i = 0; i < br; i++) {
- zt->data[i] = nzt_data[i] / B;
- }
- it++;
- }
- emxFree_real_T(&b_blur_h);
- emxFree_real_T(&c_a);
- emxFree_real_T(&b_blur_w);
- emxFree_real_T(&b_a);
- emxFree_real_T(&b);
- emxFree_real_T(&a);
- emxFree_real_T(&C);
- emxFree_real_T(&nh);
- emxFree_real_T(&nw);
- emxFree_real_T(&blur_w);
- emxFree_real_T(&zfh);
- emxFree_real_T(&blur_h);
- }
- /*
- * File trailer for coupled_plca.c
- *
- * [EOF]
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement