123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- % sd.m
- % David Rowe Aug 2012
- % Plots the spectal distorion between twofiles of LPCs. Used for LSP
- % quantisation tuning.
- function sd(raw_filename, dump_file_prefix, f)
- ak1_filename = sprintf("%s_ak.txt", dump_file_prefix);
- ak2_filename = sprintf("%s_ak_.txt", dump_file_prefix);
- ak1 = load(ak1_filename);
- ak2 = load(ak2_filename);
- [ak1_r, ak1_c] = size(ak1);
- [ak2_r, ak2_c] = size(ak1);
- frames = max([ak1_r ak2_r]);
- sd = zeros(1,frames);
- Ndft = 512;
- A1 = zeros(frames, Ndft);
- A2 = zeros(frames, Ndft);
- % initial helicopter view of all frames
- for i = 1:frames
- A1(i,:) = -20*log10(abs(fft(ak1(i,:),Ndft)));
- A2(i,:) = -20*log10(abs(fft(ak2(i,:),Ndft)));
- sd(i) = sum((A1(i,:) - A2(i,:)).^2)/Ndft;
- end
- printf("sd av %3.2f dB*dB\n", sum(sd)/frames);
- figure(1);
- clf;
- subplot(211)
- fs=fopen(raw_filename,"rb");
- s = fread(fs,Inf,"short");
- plot(s);
- subplot(212)
- plot(sd);
- % now enter single step mode so we can analyse each frame
- sn_name = strcat(dump_file_prefix,"_sn.txt");
- Sn = load(sn_name);
- lsp1_filename = sprintf("%s_lsp.txt", dump_file_prefix);
- lsp2_filename = sprintf("%s_lsp_.txt", dump_file_prefix);
- lsp1 = load(lsp1_filename);
- lsp2 = load(lsp2_filename);
- weights_filename = sprintf("%s_weights.txt", dump_file_prefix);
- if file_in_path(".",weights_filename)
- weights = load(weights_filename);
- end
- k = ' ';
- do
- figure(2);
- clf;
- subplot(211)
- s = [ Sn(2*f-1,:) Sn(2*f,:) ];
- size(s);
- plot(s);
- axis([1 length(s) -20000 20000]);
- subplot(212);
- plot((1:Ndft/2)*4000/(Ndft/2), A1(f,1:(Ndft/2)),";A1;r");
- axis([1 4000 -20 40]);
- hold on;
- plot((1:Ndft/2)*4000/(Ndft/2), A2(f,1:(Ndft/2)),";A2;");
- if file_in_path(".",weights_filename)
- plot(lsp1(f,:)*4000/pi, weights(f,:),";weights;g+");
- end
- for l=1:10
- plot([lsp1(f,l)*4000/pi lsp1(f,l)*4000/pi], [0 -10], 'r');
- plot([lsp2(f,l)*4000/pi lsp2(f,l)*4000/pi], [-10 -20], 'b');
- endfor
- plot(0,0,';lsp1;r');
- plot(0,0,';lsp2;b');
- sd_str = sprintf(";sd %3.2f dB*dB;", sd(f));
- plot(0,0,sd_str);
-
- hold off;
- % interactive menu
- printf("\rframe: %d menu: n-next b-back q-quit", f);
- fflush(stdout);
- k = kbhit();
- if (k == 'n')
- f = f + 1;
- endif
- if (k == 'b')
- f = f - 1;
- endif
- until (k == 'q')
- printf("\n");
- endfunction
|