Changeset 685412e
 Timestamp:
 Nov 3, 2007, 4:59:04 PM (13 years ago)
 Branches:
 feature/autosink, feature/constantq, feature/pitchshift, feature/pydocstrings, feature/timestretch, master, pitchshift, sampler, timestretch, yinfft+
 Children:
 5c0662a
 Parents:
 6ef7f67
 File:

 1 edited
Legend:
 Unmodified
 Added
 Removed

src/phasevoc.c
r6ef7f67 r685412e 26 26 /** phasevocoder internal object */ 27 27 struct _aubio_pvoc_t { 28 /** grain length */ 29 uint_t win_s; 30 /** overlap step */ 31 uint_t hop_s; 32 /** number of channels */ 33 uint_t channels; 34 /** spectral data */ 35 aubio_mfft_t * fft; 36 /**cur output grain [win_s] */ 37 fvec_t * synth; 38 /**last input frame [win_shop_s] */ 39 fvec_t * synthold; 40 /**current input grain [win_s] */ 41 fvec_t * data; 42 /**last input frame [win_shop_s] */ 43 fvec_t * dataold; 44 /** grain window [win_s] */ 45 float * w; 28 uint_t win_s; /** grain length */ 29 uint_t hop_s; /** overlap step */ 30 uint_t channels; /** number of channels */ 31 aubio_mfft_t * fft; /** spectral data */ 32 fvec_t * synth; /**cur output grain [win_s] */ 33 fvec_t * synthold; /**last input frame [win_shop_s] */ 34 fvec_t * data; /**current input grain [win_s] */ 35 fvec_t * dataold; /**last input frame [win_shop_s] */ 36 float * w; /** grain window [win_s] */ 46 37 }; 47 38 48 39 49 40 /** returns data and dataold slided by hop_s */ 50 static void aubio_pvoc_swapbuffers( 51 smpl_t * data, 52 smpl_t * dataold, 53 const smpl_t * datanew, 54 uint_t win_s, uint_t hop_s); 41 static void aubio_pvoc_swapbuffers(smpl_t * data, smpl_t * dataold, const 42 smpl_t * datanew, uint_t win_s, uint_t hop_s); 43 55 44 /** do additive synthesis from 'old' and 'cur' */ 56 static void aubio_pvoc_addsynth( 57 const smpl_t * synth, 58 smpl_t * synthold, 59 smpl_t * synthnew, 60 uint_t win_s, uint_t hop_s); 61 45 static void aubio_pvoc_addsynth(const smpl_t * synth, smpl_t * synthold, 46 smpl_t * synthnew, uint_t win_s, uint_t hop_s); 62 47 63 48 void aubio_pvoc_do(aubio_pvoc_t *pv, fvec_t * datanew, cvec_t *fftgrain) { 64 65 66 67 68 69 70 71 72 73 74 75 49 uint_t i,j; 50 for (i=0; i<pv>channels; i++) { 51 /* slide */ 52 aubio_pvoc_swapbuffers(pv>data>data[i],pv>dataold>data[i], 53 datanew>data[i],pv>win_s,pv>hop_s); 54 /* windowing */ 55 for (j=0; j<pv>win_s; j++) pv>data>data[i][j] *= pv>w[j]; 56 } 57 /* shift */ 58 vec_shift(pv>data); 59 /* calculate fft */ 60 aubio_mfft_do (pv>fft,pv>data,fftgrain); 76 61 } 77 62 78 63 void aubio_pvoc_rdo(aubio_pvoc_t *pv,cvec_t * fftgrain, fvec_t * synthnew) { 79 80 81 82 83 84 85 86 87 64 uint_t i; 65 /* calculate rfft */ 66 aubio_mfft_rdo(pv>fft,fftgrain,pv>synth); 67 /* unshift */ 68 vec_shift(pv>synth); 69 for (i=0; i<pv>channels; i++) { 70 aubio_pvoc_addsynth(pv>synth>data[i],pv>synthold>data[i], 71 synthnew>data[i],pv>win_s,pv>hop_s); 72 } 88 73 } 89 74 90 75 aubio_pvoc_t * new_aubio_pvoc (uint_t win_s, uint_t hop_s, uint_t channels) { 91 76 aubio_pvoc_t * pv = AUBIO_NEW(aubio_pvoc_t); 92 77 93 94 95 96 97 78 if (win_s < 2*hop_s) { 79 AUBIO_ERR("Hop size bigger than half the window size!\n"); 80 AUBIO_ERR("Resetting hop size to half the window size.\n"); 81 hop_s = win_s / 2; 82 } 98 83 99 if (hop_s < 1) { 100 AUBIO_ERR("Hop size is smaller than 1!\n"); 101 AUBIO_ERR("Resetting hop size to half the window size.\n"); 102 hop_s = win_s / 2; 103 } 104 105 pv>fft = new_aubio_mfft(win_s,channels); 84 if (hop_s < 1) { 85 AUBIO_ERR("Hop size is smaller than 1!\n"); 86 AUBIO_ERR("Resetting hop size to half the window size.\n"); 87 hop_s = win_s / 2; 88 } 106 89 107 /* remember old */ 108 pv>data = new_fvec (win_s, channels); 109 pv>synth = new_fvec (win_s, channels); 90 pv>fft = new_aubio_mfft(win_s,channels); 110 91 111 /* new input output */ 112 pv>dataold = new_fvec (win_shop_s, channels); 113 pv>synthold = new_fvec (win_shop_s, channels); 114 pv>w = AUBIO_ARRAY(smpl_t,win_s); 115 aubio_window(pv>w,win_s,aubio_win_hanningz); 92 /* remember old */ 93 pv>data = new_fvec (win_s, channels); 94 pv>synth = new_fvec (win_s, channels); 116 95 117 pv>channels = channels; 118 pv>hop_s = hop_s; 119 pv>win_s = win_s; 96 /* new input output */ 97 pv>dataold = new_fvec (win_shop_s, channels); 98 pv>synthold = new_fvec (win_shop_s, channels); 99 pv>w = AUBIO_ARRAY(smpl_t,win_s); 100 aubio_window(pv>w,win_s,aubio_win_hanningz); 120 101 121 return pv; 102 pv>channels = channels; 103 pv>hop_s = hop_s; 104 pv>win_s = win_s; 105 106 return pv; 122 107 } 123 108 124 109 void del_aubio_pvoc(aubio_pvoc_t *pv) { 125 126 127 128 129 130 131 110 del_fvec(pv>data); 111 del_fvec(pv>synth); 112 del_fvec(pv>dataold); 113 del_fvec(pv>synthold); 114 del_aubio_mfft(pv>fft); 115 AUBIO_FREE(pv>w); 116 AUBIO_FREE(pv); 132 117 } 133 118 134 119 static void aubio_pvoc_swapbuffers(smpl_t * data, smpl_t * dataold, 135 120 const smpl_t * datanew, uint_t win_s, uint_t hop_s) 136 121 { 137 138 139 140 141 142 143 122 uint_t i; 123 for (i=0;i<win_shop_s;i++) 124 data[i] = dataold[i]; 125 for (i=0;i<hop_s;i++) 126 data[win_shop_s+i] = datanew[i]; 127 for (i=0;i<win_shop_s;i++) 128 dataold[i] = data[i+hop_s]; 144 129 } 145 130 … … 147 132 smpl_t * synthnew, uint_t win_s, uint_t hop_s) 148 133 { 149 150 151 152 for (i=0;i<hop_s;i++) 153 154 155 for (i=0;i<win_s2*hop_s;i++) 156 157 158 for (i=win_shop_s;i<win_s;i++) 159 160 161 for (i=0;i<win_shop_s;i++) 162 134 uint_t i; 135 smpl_t scale = 2*hop_s/(win_s+.0); 136 /* add new synth to old one and put result in synthnew */ 137 for (i=0;i<hop_s;i++) 138 synthnew[i] = synthold[i]+synth[i]*scale; 139 /* shift synthold */ 140 for (i=0;i<win_s2*hop_s;i++) 141 synthold[i] = synthold[i+hop_s]; 142 /* erase last frame in synthold */ 143 for (i=win_shop_s;i<win_s;i++) 144 synthold[ihop_s]=0.; 145 /* additive synth */ 146 for (i=0;i<win_shop_s;i++) 147 synthold[i] += synth[i+hop_s]*scale; 163 148 } 164 149
Note: See TracChangeset
for help on using the changeset viewer.