aboutsummaryrefslogtreecommitdiff
path: root/octave/newamp1_fbf.m
blob: 69111c60634bc022df078609babc0534e12cdf46 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
% newamp1_fbf.m
%
% Copyright David Rowe 2016
% This program is distributed under the terms of the GNU General Public License
% Version 2
%
% Interactive Octave script to explore frame by frame operation of newamp1
% spectral amplitude modelling.
%
% Usage:
%   Make sure codec2-dev is compiled with the -DDUMP option - see README for
%    instructions.
%   ~/codec2-dev/build_linux/src$ ./c2sim ../../raw/hts1a.raw --dump hts1a
%   $ cd ~/codec2-dev/octave
%   octave:14> newamp1_fbf("../build_linux/src/hts1a",50)


function newamp1_fbf(samname, f=73, varargin)
  more off;

  newamp_700c; melvq;
  load train_120_1.txt; load train_120_2.txt;
  train_120_vq(:,:,1)= train_120_1; train_120_vq(:,:,2)= train_120_2; m=5;

  Fs = 8000;  K = 20;

  vq = 0; eq_en = 0; pf = 0;

  % load up text files dumped from c2sim ---------------------------------------

  sn_name = strcat(samname,"_sn.txt");
  Sn = load(sn_name);
  sw_name = strcat(samname,"_sw.txt");
  Sw = load(sw_name);
  model_name = strcat(samname,"_model.txt");
  model = load(model_name);
  [frames tmp] = size(model);

  % pre-process
  [rate_K_surface sample_freqs_kHz] = resample_const_rate_f_mel(model(1:frames,:), K);

  % we need to know eq states on each frame
  eq = zeros(frames,K);  an_eq = zeros(1,K);
  for ff=1:frames
    mean_f = mean(rate_K_surface(ff,:));
    rate_K_vec_no_mean = rate_K_surface(ff,:) - mean_f;
    [tmp an_eq] = front_eq(rate_K_vec_no_mean, an_eq);
    eq(ff,:) = an_eq;
  end

  % Keyboard loop --------------------------------------------------------------

  k = ' ';
  do
    fg = 1;
    s = [ Sn(2*f-1,:) Sn(2*f,:) ];
    figure(fg++); clf; plot(s); axis([1 length(s) -20000 20000]);

    Wo = model(f,1); L = model(f,2); Am = model(f,3:(L+2)); AmdB = 20*log10(Am);
    Am_freqs_kHz = (1:L)*Wo*4/pi;

    % plots ----------------------------------

    figure(fg++); clf;
    l = sprintf(";rate %d AmdB;g+-", L);
    plot((1:L)*Wo*4000/pi, AmdB, l);
    axis([1 4000 -20 80]);
    hold on;
    stem(sample_freqs_kHz*1000, rate_K_surface(f,:), ";rate K;b+-");

    % default
    rate_K_vec_ = rate_K_surface(f,:);

    mean_f = mean(rate_K_surface(f,:));
    rate_K_vec_no_mean = rate_K_surface(f,:) - mean_f;
    if eq_en
      rate_K_vec_no_mean -= eq(f,:);
    end
    rate_K_vec_no_mean_ = rate_K_vec_no_mean;
    if vq
      [res rate_K_vec_no_mean_ ind] = mbest(train_120_vq, rate_K_vec_no_mean, m);
      if pf
        rate_K_vec_no_mean_ = post_filter(rate_K_vec_no_mean_, sample_freqs_kHz, 1.5);
      end
      rate_K_vec_ = rate_K_vec_no_mean_ + mean_f;
    end

    % back to rate L
    model_(f,:) = resample_rate_L(model(f,:), rate_K_vec_, sample_freqs_kHz);
    Am_ = model_(f,3:(L+2)); AmdB_ = 20*log10(Am_);
    varL = var(AmdB - AmdB_);

    plot((1:L)*Wo*4000/pi, AmdB_,";AmdB bar;r+-");
    l = sprintf(";error var %3.2f dB;bk+-", varL);
    plot((1:L)*Wo*4000/pi, (AmdB - AmdB_), l);
    hold off;

    figure(3); clf;
    plot(sample_freqs_kHz*1000, 40+ rate_K_vec_no_mean, ";rate K no mean;g+-");
    axis([1 4000 -20 80]); hold on;
    plot(sample_freqs_kHz*1000, 40 + rate_K_vec_no_mean_, ";rate K no mean bar;r+-");
    varK = var(rate_K_vec_no_mean - rate_K_vec_no_mean_);
    l = sprintf(";error var %3.2f dB;bk+-", varK);
    plot(sample_freqs_kHz*1000, rate_K_vec_no_mean - rate_K_vec_no_mean_, l);

    plot(sample_freqs_kHz*1000, eq(f,:), ";eq;b+-");
    hold off;

    % interactive menu ------------------------------------------

    printf("\rframe: %d  menu: n-next  b-back  q-quit  v-vq[%d] p-pf[%d] e-eq[%d]", f, vq, pf, eq_en);
    fflush(stdout);
    k = kbhit();

    if k == 'v'
       if vq == 0; vq = 1; else vq = 0; end
     endif
    if k == 'p'
       if pf == 0; pf = 1; else pf = 0; end
    endif
    if k == 'e'
       if eq_en == 0; eq_en = 1; else eq_en = 0; end
    endif
    if k == 'n'
      f = f + 1;
    endif
    if k == 'b'
      f = f - 1;
    endif

  until (k == 'q')
  printf("\n");

endfunction


function ind = arg_exists(v, str)
   ind = 0;
   for i=1:length(v)
      if !ind && strcmp(v{i}, str)
        ind = i;
      end
    end
endfunction