1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- % Copyright David Rowe 2009
- % This program is distributed under the terms of the GNU General Public License
- % Version 2
- %
- % Plot voicing information from sample and dump files.
- %
- % samfilename is the raw source file, e.g. "../raw/hts1a.raw"
- % samname is the dumpfile prefix, e.g. "../src/hts1a"
- %
- % There is a 160 sample (two frame delay) from the when a sample
- % enters the input buffer until it is at the centre of the analysis window
- function plvoicing(samfilename, samname, start_f, end_f, pngname)
-
- fs=fopen(samfilename,"rb");
- s=fread(fs,Inf,"short");
- snr_name = strcat(samname,"_snr.txt");
- snr = load(snr_name);
- model_name = strcat(samname,"_model.txt");
- model = load(model_name);
- Wo = model((start_f+1):end_f,1);
- F0 = Wo*4000/pi;
- dF0 = F0(1:length(Wo)-1) - F0(2:length(Wo));
- % work out LP and HP energy
- for f=(start_f+1):end_f
- L = model(f,2);
- Am = model(f,3:(L+2));
- L2 = floor(L/2);
- elow = Am(1:L2) * Am(1:L2)';
- ehigh = Am(L2:L) * Am(L2:L)';
- erat(f-(start_f+1)+1) = 10*log10(elow/ehigh);
- endfor
- figure(1);
- clf;
- sp = s((start_f-2)*80:(end_f-2)*80);
- plot(sp);
- hold on;
- vhigh = snr((start_f+1):end_f) > 7;
- vlow = snr((start_f+1):end_f) > 4;
- % test correction based on erat
- vlowadj = vlow;
- for f=1:length(erat)-1
- if (vlow(f) == 0)
- if (erat(f) > 10)
- vlowadj(f) = 1;
- endif
- endif
- if (vlow(f) == 1)
- if (erat(f) < -10)
- vlowadj(f) = 0;
- endif
- if (abs(dF0(f)) > 15)
- vlowadj(f) = 0;
- endif
- endif
- endfor
- x = 1:(end_f-start_f);
- plot(x*80,snr((start_f+1):end_f)*1000,';SNRdB x 1000;g+');
- plot(x*80,-8000 + vhigh*2000,';7dB thresh;g');
- plot(x*80,-11000 + vlowadj*2000,';vlow with corr;g');
- plot(x*80,erat*1000,';elow/ehigh in dB;r');
- plot(x*80,-14000 + vlow*2000,';4dB thresh;r');
- hold off;
- grid
- if (nargin == 5)
- print(pngname, "-dpng", "-S500,500")
- endif
-
- figure(2)
- Wo = model((start_f+1):end_f,1);
- F0 = Wo*4000/pi;
- dF0 = F0(1:length(Wo)-1) - F0(2:length(Wo));
- %plot(dF0,'+--')
- %hold on;
- %plot([ 1 length(dF0) ], [10 10] ,'r')
- %plot([ 1 length(dF0) ], [-10 -10] ,'r')
- %axis([1 length(dF0) -50 50])
- %hold off;
- plot(F0,'+--')
- endfunction
|