part way through indexes_model refactoring
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 12 Jan 2017 00:46:37 +0000 (00:46 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 12 Jan 2017 00:46:37 +0000 (00:46 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@2958 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/tnewamp1.m
codec2-dev/src/newamp1.c
codec2-dev/src/newamp1.h
codec2-dev/unittest/tnewamp1.c

index 2f9ba7d9dffc01cfbb41bca7f117d3e87ce7bede..d405090f1e082f5279ec6f93c89bcef753bc0476 100644 (file)
@@ -95,8 +95,7 @@ function tnewamp1(input_prefix)
   Nfft_phase = 128;
   model_ = zeros(frames, max_amp+2);
   voicing_ = zeros(1,frames);
-  Hm = zeros(frames, max_amp);
-  phi = zeros(1,max_amp);
+  H = zeros(frames, max_amp);
   for f=1:M:frames   
     if voicing(f)
       index = encode_log_Wo(model(f,1), 6);
@@ -129,8 +128,7 @@ function tnewamp1(input_prefix)
         phase = determine_phase(model_, k, Nfft_phase);
         for m=1:model_(k,2)
           b = round(m*model_(k,1)*Nfft_phase/(2*pi));  % map harmonic centre to DFT bin
-          phi(m) = phase(b+1);
-          Hm(k,m) = exp(-j*phi(m));
+          H(k,m) = exp(-j*phase(b+1));
         end  
    
       end
@@ -150,11 +148,11 @@ function tnewamp1(input_prefix)
   %Hm(2,:) - Hm_c(2,:)
   
   figure(1);
-  mesh(angle(Hm));
+  mesh(angle(H));
   figure(2);
-  mesh(angle(Hm_c));
+  mesh(angle(H_c));
   figure(3);
-  mesh(abs(Hm - Hm_c));
+  mesh(abs(H - H_c));
 
   check(rate_K_surface, rate_K_surface_c, 'rate_K_surface', 0.01);
   check(mean_f, mean_c, 'mean', 0.01);
@@ -162,8 +160,8 @@ function tnewamp1(input_prefix)
   check(interpolated_surface_, interpolated_surface__c, 'interpolated_surface_', 0.01);
   check(model_(:,1), model__c(:,1), 'interpolated Wo_', 0.001);
   check(voicing_, voicing__c, 'interpolated voicing');
-  check(model_(:,3:max_amp+2), model__c(:,3:max_amp+2), 'rate L surface at dec', 0.1);
-  check(Hm, Hm_c, 'phase surface');
+  check(model_(:,3:max_amp+2), model__c(:,3:max_amp+2), 'rate L Am surface ', 0.1);
+  check(H, H_c, 'phase surface');
 
   #{
 
index a1f1a397c4b87467ba0ecf205b63a6fbc210cdca..6736adb5042d9a90aa7f1ea6c2cff406bfa7d7d6 100644 (file)
@@ -278,10 +278,10 @@ void post_filter_newamp1(float vec[], float sample_freq_kHz[], int K, float pf_g
 
 \*---------------------------------------------------------------------------*/
 
-void interp_Wo_v(float Wo_[], int voicing_[], float Wo1, float Wo2, int voicing1, int voicing2)
+void interp_Wo_v(float Wo_[], int L_[], int voicing_[], float Wo1, float Wo2, int voicing1, int voicing2)
 {
     int i;
-    int M = 4;
+    int M = 4;  /* interpolation rate */
 
     for(i=0; i<M; i++)
         voicing_[i] = 0;
@@ -310,6 +310,10 @@ void interp_Wo_v(float Wo_[], int voicing_[], float Wo1, float Wo2, int voicing1
             voicing_[i] = 1;
         }
     }
+
+    for(i=0; i<M; i++) {
+        L_[i] = floorf(M_PI/Wo_[i]);
+    }
 }
 
 
@@ -365,7 +369,7 @@ void resample_rate_L(MODEL *model, float rate_K_vec[], float rate_K_sample_freqs
 
 \*---------------------------------------------------------------------------*/
 
-void determine_phase(MODEL *model, int Nfft, codec2_fft_cfg fwd_cfg, codec2_fft_cfg inv_cfg)
+void determine_phase(COMP H[], MODEL *model, int Nfft, codec2_fft_cfg fwd_cfg, codec2_fft_cfg inv_cfg)
 {
     int i,m,b;
     int Ns = Nfft/2+1;
@@ -387,7 +391,7 @@ void determine_phase(MODEL *model, int Nfft, codec2_fft_cfg fwd_cfg, codec2_fft_
 
     for(m=1; m<=model->L; m++) {
         b = floorf(0.5+m*model->Wo*Nfft/(2.0*M_PI));
-        model->phi[m] = phase[b];
+        H[m].real = cos(phase[b]); H[m].imag = -sin(phase[b]);
     }
 }
 
@@ -459,21 +463,45 @@ void newamp1_model_to_indexes(int    indexes[],
 
 /*---------------------------------------------------------------------------*\
 
-  FUNCTION....: newamp1_indexes_to_model
+  FUNCTION....: newamp1_interpolate
+  AUTHOR......: David Rowe
+  DATE CREATED: Jan 2017
+
+\*---------------------------------------------------------------------------*/
+
+void newamp1_interpolate(float interpolated_surface_[], float left_vec[], float right_vec[], int K)
+{
+    int  i, k;
+    int  M = 4;
+    float c;
+
+    /* (linearly) interpolate 25Hz amplitude vectors back to 100Hz */
+
+    for(i=0,c=1.0; i<M; i++,c-=1.0/M) {
+        for(k=0; k<K; k++) {
+            interpolated_surface_[i*K+k] = left_vec[k]*c + right_vec[k]*(1.0-c);
+        }
+    }
+}
+
+
+/*---------------------------------------------------------------------------*\
+
+  FUNCTION....: newamp1_indexes_to_rate_K_vec
   AUTHOR......: David Rowe
   DATE CREATED: Jan 2017
 
   newamp1 decoder for amplitudes {Am}.  Given the rate K VQ and energy
-  indexes at a 25Hz sample rate, outputs 4 100Hz rate L model structures.
+  indexes, outputs rate K vector.
 
 \*---------------------------------------------------------------------------*/
 
-void newamp1_indexes_to_model(float  rate_K_vec_[],  
-                              float  rate_K_vec_no_mean_[],
-                              float  rate_K_sample_freqs_kHz[], 
-                              int    K,
-                              float *mean_,
-                              int    indexes[])
+void newamp1_indexes_to_rate_K_vec(float  rate_K_vec_[],  
+                                   float  rate_K_vec_no_mean_[],
+                                   float  rate_K_sample_freqs_kHz[], 
+                                   int    K,
+                                   float *mean_,
+                                   int    indexes[])
 {
     int   k;
     const float *codebook1 = newamp1vq_cb[0].cb;
@@ -494,3 +522,85 @@ void newamp1_indexes_to_model(float  rate_K_vec_[],
     }
 }
 
+
+/*---------------------------------------------------------------------------*\
+
+  FUNCTION....: newamp1_indexes_to_model
+  AUTHOR......: David Rowe
+  DATE CREATED: Jan 2017
+
+  newamp1 decoder.
+
+\*---------------------------------------------------------------------------*/
+
+void newamp1_indexes_to_model(MODEL  model_[],
+                              COMP   H[],
+                              float *interpolated_surface_,
+                              float  prev_rate_K_vec_[],
+                              float  *Wo_left,
+                              int    *voicing_left,
+                              float  rate_K_sample_freqs_kHz[], 
+                              int    K,
+                              codec2_fft_cfg fwd_cfg, 
+                              codec2_fft_cfg inv_cfg,
+                              int    indexes[])
+{
+    float rate_K_vec_[K], rate_K_vec_no_mean_[K], mean_, Wo_right;
+    int   voicing_right, k;
+    int   M = 4;
+
+    /* extract latest rate K vector */
+
+    newamp1_indexes_to_rate_K_vec(rate_K_vec_, 
+                                  rate_K_vec_no_mean_,
+                                  rate_K_sample_freqs_kHz, 
+                                  K,
+                                  &mean_,
+                                  indexes);
+
+
+    /* decode latest Wo and voicing */
+
+    if (indexes[3]) {
+        Wo_right = decode_log_Wo(indexes[3], 6);
+        voicing_right = 1;
+    }
+    else {
+        Wo_right  = 2.0*M_PI/100.0;
+        voicing_right = 0;
+    }
+
+    /* interpolate 25Hz rate K vec back to 100Hz */
+
+    float *left_vec = prev_rate_K_vec_;
+    float *right_vec = rate_K_vec_;
+    newamp1_interpolate(interpolated_surface_, left_vec, right_vec, K);
+
+    /* interpolate 25Hz v and Wo back to 100Hz */
+
+    float aWo_[M];
+    int avoicing_[M], aL_[M], i;
+
+    interp_Wo_v(aWo_, aL_, avoicing_, *Wo_left, Wo_right, *voicing_left, voicing_right);
+
+    /* back to rate L amplitudes, synthesis phase for each frame */
+
+    for(i=0; i<M; i++) {
+        model_[i].Wo = aWo_[i];
+        model_[i].L  = aL_[i];
+        model_[i].voiced = avoicing_[i];
+
+        resample_rate_L(&model_[i], &interpolated_surface_[K*i], rate_K_sample_freqs_kHz, K);
+        determine_phase(&H[(MAX_AMP+1)*i], &model_[i], NEWAMP1_PHASE_NFFT, fwd_cfg, inv_cfg);
+    }
+
+    /* update memories for next time */
+
+    for(k=0; k<K; k++) {
+        prev_rate_K_vec_[k] = rate_K_vec_[k];
+    }
+    *Wo_left = Wo_right;
+    *voicing_left = voicing_right;
+
+}
+
index 058d0c5c34aecf34900bced0c14a570bbe3295e2..a2609ddb5e5b1fec6cc1f575701215e02ebcb3e3 100644 (file)
@@ -30,7 +30,8 @@
 #ifndef __NEWAMP1__
 #define __NEWAMP1__
 
-#define NEWAMP1_N_INDEXES 4 /* Number of indexes to pack: vq1, vq2, energy, Wo */
+#define NEWAMP1_N_INDEXES    4  /* Number of indexes to pack: vq1, vq2, energy, Wo */
+#define NEWAMP1_PHASE_NFFT 128  /* size of FFT used for phase synthesis            */
 
 #include "codec2_fft.h"
 #include "comp.h"
@@ -41,9 +42,9 @@ void mel_sample_freqs_kHz(float rate_K_sample_freqs_kHz[], int K);
 void resample_const_rate_f(MODEL *model, float rate_K_vec[], float rate_K_sample_freqs_kHz[], int K);
 float rate_K_mbest_encode(int *indexes, float *x, float *xq, int ndim, int mbest_entries);
 void post_filter_newamp1(float vec[], float sample_freq_kHz[], int K, float pf_gain);
-void interp_Wo_v(float Wo_[], int voicing_[], float Wo1, float Wo2, int voicing1, int voicing2);
+void interp_Wo_v(float Wo_[], int L_[], int voicing_[], float Wo1, float Wo2, int voicing1, int voicing2);
 void resample_rate_L(MODEL *model, float rate_K_vec[], float rate_K_sample_freqs_kHz[], int K);
-void determine_phase(MODEL *model, int Nfft, codec2_fft_cfg fwd_cfg, codec2_fft_cfg inv_cfg);
+void determine_phase(COMP H[], MODEL *model, int Nfft, codec2_fft_cfg fwd_cfg, codec2_fft_cfg inv_cfg);
 void newamp1_model_to_indexes(int    indexes[], 
                               MODEL *model, 
                               float  rate_K_vec[], 
@@ -53,11 +54,24 @@ void newamp1_model_to_indexes(int    indexes[],
                               float  rate_K_vec_no_mean[], 
                               float  rate_K_vec_no_mean_[]
                               );
-void newamp1_indexes_to_model(float  rate_K_vec_[],  
-                              float  rate_K_vec_no_mean_[],
+void newamp1_indexes_to_rate_K_vec(float  rate_K_vec_[],  
+                                   float  rate_K_vec_no_mean_[],
+                                   float  rate_K_sample_freqs_kHz[], 
+                                   int    K,
+                                   float *mean_,
+                                   int    indexes[]);
+void newamp1_interpolate(float interpolated_surface_[], float left_vec[], float right_vec[], int K);
+
+void newamp1_indexes_to_model(MODEL  model_[],
+                              COMP   H[],
+                              float  interpolated_surface_[],
+                              float  prev_rate_K_vec_[],
+                              float  *Wo_left,
+                              int    *voicing_left,
                               float  rate_K_sample_freqs_kHz[], 
                               int    K,
-                              float *mean_,
+                              codec2_fft_cfg fwd_cfg, 
+                              codec2_fft_cfg inv_cfg,
                               int    indexes[]);
 
 #endif
index ad5d52bd7f531c439209cd57f4651b33b8682fdb..1baa3ec53c256e804e573059cf60baf190277186 100644 (file)
@@ -38,7 +38,6 @@
 #include "quantise.h"
 
 #define FRAMES 100
-#define PHASE_NFFT 128
 
 int main(int argc, char *argv[]) {
     short buf[N_SAMP];         /* input/output buffer                   */
@@ -62,8 +61,8 @@ int main(int argc, char *argv[]) {
     fft_fwd_cfg = codec2_fft_alloc(FFT_ENC, 0, NULL, NULL); 
     make_analysis_window(fft_fwd_cfg, w, W);
 
-    phase_fft_fwd_cfg = codec2_fft_alloc(PHASE_NFFT, 0, NULL, NULL);
-    phase_fft_inv_cfg = codec2_fft_alloc(PHASE_NFFT, 1, NULL, NULL);
+    phase_fft_fwd_cfg = codec2_fft_alloc(NEWAMP1_PHASE_NFFT, 0, NULL, NULL);
+    phase_fft_inv_cfg = codec2_fft_alloc(NEWAMP1_PHASE_NFFT, 1, NULL, NULL);
 
     for(i=0; i<M_PITCH; i++) {
        Sn[i] = 1.0;
@@ -82,7 +81,7 @@ int main(int argc, char *argv[]) {
     int   voicing[FRAMES];
     int   voicing_[FRAMES];
     float model_octave_[FRAMES][MAX_AMP+2];
-    COMP  Hm[FRAMES][MAX_AMP];
+    COMP  H[FRAMES][MAX_AMP];
     int indexes[FRAMES][NEWAMP1_N_INDEXES];
 
     for(f=0; f<FRAMES; f++) {
@@ -91,8 +90,8 @@ int main(int argc, char *argv[]) {
             model_octave_[f][m] = 0.0;
         }
         for(m=0; m<MAX_AMP; m++) {
-            Hm[f][m].real = 0.0;
-            Hm[f][m].imag = 0.0;
+            H[f][m].real = 0.0;
+            H[f][m].imag = 0.0;
         }
         for(k=0; m<K; k++)
             interpolated_surface_[f][k] = 0.0;
@@ -146,12 +145,12 @@ int main(int argc, char *argv[]) {
                                  &rate_K_surface_no_mean[f][0],
                                  &rate_K_surface_no_mean_[f][0]);
 
-        newamp1_indexes_to_model(&rate_K_surface_[f][0],
-                                 &rate_K_surface_no_mean_[f][0],
-                                 rate_K_sample_freqs_kHz,
-                                 K,
-                                 &mean_[f],
-                                 &indexes[f][0]);
+        newamp1_indexes_to_rate_K_vec(&rate_K_surface_[f][0],
+                                      &rate_K_surface_no_mean_[f][0],
+                                      rate_K_sample_freqs_kHz,
+                                      K,
+                                      &mean_[f],
+                                      &indexes[f][0]);
 
         /* log vectors */
  
@@ -165,7 +164,14 @@ int main(int argc, char *argv[]) {
  
     /* Decoder */
 
-    MODEL model_;
+    MODEL model__[M];
+    float prev_rate_K_vec_[K];
+    COMP  HH[M][MAX_AMP+1];
+    float Wo_left;
+    int   voicing_left;
+
+    for(k=0; k<K; k++)
+        prev_rate_K_vec_[k] = rate_K_surface_[0][k];
 
     for(f=0; f<FRAMES; f+=M) {
 
@@ -197,59 +203,71 @@ int main(int argc, char *argv[]) {
           pass in left and right rate K vectors, Wo, v
           interpolate at rate K
           convert to rate L
-          output 4 model parameters
+          indexes for current plus decoded rate K, Wo, v from frame[0], model[4] out parameters,
+          then plug them into model_octave for testing
           ref indexes to 0...3
           slowly change
+          
+          [ ] model[4] out
+          [ ] change to 1:M processing
+              + not sure how to handle Octave side of this
         */
-        float c;
-        if (f >= M) {
-
-            /* interpolate 25Hz amplitude vectors back to 100Hz */
 
+        if (f >= M) {
+            /*
             float *left_vec = &rate_K_surface_[f-M][0];
             float *right_vec = &rate_K_surface_[f][0];
-            for(i=f-M,c=1.0; i<f; i++,c-=1.0/M) {
-                for(k=0; k<K; k++) {
-                    interpolated_surface_[i][k] = left_vec[k]*c + right_vec[k]*(1.0-c);
-                }
-            }
-            
+            newamp1_interpolate(&interpolated_surface_[f-M][0], left_vec, right_vec, K);
+            */
+
+            Wo_left = model_octave_[f-M][0];
+            voicing_left = voicing[f-M];
+
+            newamp1_indexes_to_model(model__,
+                                     (COMP*)HH,
+                                     &interpolated_surface_[f-M][0],
+                                     prev_rate_K_vec_,
+                                     &Wo_left,
+                                     &voicing_left,
+                                     rate_K_sample_freqs_kHz, 
+                                     K,
+                                     phase_fft_fwd_cfg, 
+                                     phase_fft_inv_cfg,
+                                     &indexes[f][0]);
+
             /* interpolate 25Hz v and Wo back to 100Hz */
 
             float aWo_[M];
-            int avoicing_[M], m;
+            int avoicing_[M], aL_[M], m;
             float Wo1 = model_octave_[f-M][0];
             float Wo2 = model_octave_[f][0];
-            interp_Wo_v(aWo_, avoicing_, Wo1, Wo2, voicing[f-M], voicing[f]);
+            interp_Wo_v(aWo_, aL_, avoicing_, Wo1, Wo2, voicing[f-M], voicing[f]);
+
             for(i=f-M, m=0; i<f; i++,m++) {
-                model_octave_[i][0] = aWo_[m];
-                model_octave_[i][1] = floorf(M_PI/model_octave_[i][0])
+                model_octave_[i][0] = model__[m].Wo; //aWo_[m];
+                model_octave_[i][1] = model__[m].L; //aL_[m]
                 voicing_[i] = avoicing_[m];
             }
 
             /* back to rate L, synth phase */
 
-            for(i=f-M; i<f; i++) {
+            MODEL model_;
+            COMP aH[MAX_AMP+1];
+            int j;
+            for(i=f-M, j=0; i<f; i++,j++) {
+                /*
                 model_.Wo = model_octave_[i][0];
                 model_.L  = model_octave_[i][1];
                 resample_rate_L(&model_, &interpolated_surface_[i][0], rate_K_sample_freqs_kHz, K);
-                //printf("\n");
-                //printf("frame: %d Wo: %4.3f L: %d\n", i+1, model_.Wo, model_.L);
-                determine_phase(&model_, PHASE_NFFT, phase_fft_fwd_cfg, phase_fft_inv_cfg);
-                //if (i == 1) {
-                //    exit(0);
-                //}
-                        
+                determine_phase(aH, &model_, NEWAMP1_PHASE_NFFT, phase_fft_fwd_cfg, phase_fft_inv_cfg);
+                */
+                model_.L  = model_octave_[i][1];
                 for(m=1; m<=model_.L; m++) {
-                    model_octave_[i][m+1] = model_.A[m];
-                    Hm[i][m-1].real = cos(model_.phi[m]);
-                    Hm[i][m-1].imag = -sin(model_.phi[m]);
-                    //printf("m: %d Hm: %f %f\n", m, Hm[i][m].real, Hm[i][m].imag);
-                }   
+                    model_octave_[i][m+1] = model__[j].A[m]; // = model_.A[m];
+                    H[i][m-1] = HH[j][m];// aH[m];
+                }
             }
-
         }
-
     }
 
     fclose(fin);
@@ -269,7 +287,7 @@ int main(int argc, char *argv[]) {
     octave_save_float(fout, "model_c", (float*)model_octave, FRAMES, MAX_AMP+2, MAX_AMP+2);
     octave_save_float(fout, "model__c", (float*)model_octave_, FRAMES, MAX_AMP+2, MAX_AMP+2);
     octave_save_int(fout, "voicing__c", (int*)voicing_, 1, FRAMES);
-    octave_save_complex(fout, "Hm_c", (COMP*)Hm, FRAMES, MAX_AMP, MAX_AMP);
+    octave_save_complex(fout, "H_c", (COMP*)H, FRAMES, MAX_AMP, MAX_AMP);
     fclose(fout);
 
     printf("Done! Now run\n  octave:1> tnewamp1(\"../build_linux/src/hts1a\")\n");