sn_name = strcat(samname,"_sn.txt");
Sn = load(sn_name);
+
sw_name = strcat(samname,"_sw.txt");
Sw = load(sw_name);
+
+ sw__name = strcat(samname,"_sw_.txt");
+ if (file_in_path(".",sw__name))
+ Sw_ = load(sw__name);
+ endif
+
model_name = strcat(samname,"_model.txt");
model = load(model_name);
+
modelq_name = strcat(samname,"_qmodel.txt");
- modelq = load(modelq_name);
+ if (file_in_path(".",modelq_name))
+ modelq = load(modelq_name);
+ endif
+
pw_name = strcat(samname,"_pw.txt");
- Pw = load(pw_name);
+ if (file_in_path(".",pw_name))
+ Pw = load(pw_name);
+ endif
+
lsp_name = strcat(samname,"_lsp.txt");
if (file_in_path(".",lsp_name))
lsp = load(lsp_name);
axis([1 4000 -10 80]);
hold on;
plot((0:255)*4000/256, Sw(f,:),";Sw;");
- Amq = modelq(f,3:(L+2));
- plot((1:L)*Wo*4000/pi, 20*log10(Amq),";Amq;" );
- plot((0:255)*4000/256, 10*log10(Pw(f,:)),";Pw;");
- signal = Am * Am';
- noise = (Am-Amq) * (Am-Amq)';
- snr = 10*log10(signal/noise);
- Am_err_label = sprintf(";Am_err SNR %4.2f dB;",snr);
- plot((1:L)*Wo*4000/pi, 20*log10(Amq) - 20*log10(Am), Am_err_label);
+
+ if (file_in_path(".",sw__name))
+ plot((0:255)*4000/256, Sw_(f,:),";Sw_;");
+ endif
+
+ if (file_in_path(".",modelq_name))
+ Amq = modelq(f,3:(L+2));
+ plot((1:L)*Wo*4000/pi, 20*log10(Amq),";Amq;" );
+ plot((0:255)*4000/256, 10*log10(Pw(f,:)),";Pw;");
+ signal = Am * Am';
+ noise = (Am-Amq) * (Am-Amq)';
+ snr = 10*log10(signal/noise);
+ Am_err_label = sprintf(";Am_err SNR %4.2f dB;",snr);
+ plot((1:L)*Wo*4000/pi, 20*log10(Amq) - 20*log10(Am), Am_err_label);
+ endif
+
if (file_in_path(".",lsp_name))
for l=1:10
plot([lsp(f,l)*4000/pi lsp(f,l)*4000/pi], [60 80], 'r');
endfor
endif
+
hold off;
% interactive menu
% pulse.m
% David Rowe August 2009
-% experiments with phase for sinusoidal codecs
-% - lets see how pulse waveforms are perceived at different F0
-% - experiment suggested by O'Shaughnessy, "Speech Communication", page 145
-% - in low F0 alternative phase pulses are perceived as 2F0
+% experiments with human pulse perception for sinusoidal codecs
+% lets try some pulses in noise
-function pulse(samname, F0, alternate)
- Wo = 2*pi*F0/8000;
- P = 2*pi/Wo
+function pulse(samname, F0, snr)
+
+ N = 16000;
+ s = zeros(1,N);
+ Wo = 2*pi*F0/8000;
L = floor(pi/Wo);
- N = 16000;
- A = 1000;
+ A = 10000;
phi = zeros(1,L);
- if (alternate == 1)
- % shift phases of some harmonics to introduce -ve pulses
- % note magnitude spectrum unchanged
- phi(2:2:L) = (2:2:L)*pi*(P)*Wo;
- endif
- s = zeros(1,N);
-
for m=1:L
- s = s + A*cos(m*Wo*(0:(N-1)) + phi(m));
+ s = s + (A/L)*cos(m*Wo*(1:N) + phi(m));
endfor
-
+ randn("seed", 0);
+ s = s + A*(10 .^(-snr/20))*randn(1,N);
plot(s(1:250));
fs=fopen(samname,"wb");
+++ /dev/null
- 0.0000000e+000\r
- 9.2753623e+001\r
- 5.4237288e+001\r
- 8.5906040e+001\r
- 7.0329670e+001\r
- 5.5652174e+001\r
- 5.4237288e+001\r
- 5.4935622e+001\r
- 5.4700855e+001\r
- 7.5739645e+001\r
- 7.3563218e+001\r
- 1.2307692e+002\r
- 1.1428571e+002\r
- 7.3563218e+001\r
- 7.7108434e+001\r
- 1.8550725e+002\r
- 1.2673267e+002\r
- 1.0847458e+002\r
- 7.8527607e+001\r
- 8.8888889e+001\r
- 8.3116883e+001\r
- 8.1012658e+001\r
- 1.0756303e+002\r
- 1.3061224e+002\r
- 4.8301887e+001\r
- 4.7940075e+001\r
- 4.8120301e+001\r
- 4.9230769e+001\r
- 4.9420849e+001\r
- 4.6886447e+001\r
- 4.2953020e+001\r
- 3.9263804e+001\r
- 3.7869822e+001\r
- 3.5457064e+001\r
- 3.4224599e+001\r
- 3.3333333e+001\r
- 3.2820513e+001\r
- 3.2000000e+001\r
- 3.1295844e+001\r
- 2.9906542e+001\r
- 2.9493088e+001\r
- 2.9090909e+001\r
- 2.8699552e+001\r
- 2.8131868e+001\r
- 2.7826087e+001\r
- 2.7826087e+001\r
- 2.7826087e+001\r
- 2.8193833e+001\r
- 2.7467811e+001\r
- 2.6890756e+001\r
- 5.4468085e+001\r
- 5.4237288e+001\r
- 6.4974619e+001\r
- 1.0756303e+002\r
- 8.8888889e+001\r
- 1.0406504e+002\r
- 4.4599303e+001\r
- 5.4468085e+001\r
- 3.6260623e+001\r
- 3.6260623e+001\r
- 8.1012658e+001\r
- 7.0329670e+001\r
- 1.2929293e+002\r
- 9.9224806e+001\r
- 4.3097643e+001\r
- 4.4137931e+001\r
- 4.5714286e+001\r
- 4.7407407e+001\r
- 4.8301887e+001\r
- 4.9230769e+001\r
- 4.9420849e+001\r
- 5.0996016e+001\r
- 5.1405622e+001\r
- 5.1405622e+001\r
- 5.2244898e+001\r
- 5.2459016e+001\r
- 5.2459016e+001\r
- 5.2244898e+001\r
- 5.3333333e+001\r
- 5.2459016e+001\r
- 5.2244898e+001\r
- 5.1405622e+001\r
- 5.1405622e+001\r
- 5.1200000e+001\r
- 5.0996016e+001\r
- 5.0196078e+001\r
- 4.9230769e+001\r
- 4.9230769e+001\r
- 4.9230769e+001\r
- 4.9420849e+001\r
- 4.9230769e+001\r
- 4.9042146e+001\r
- 9.8461538e+001\r
- 1.0158730e+002\r
- 5.1821862e+001\r
- 9.0140845e+001\r
- 1.0491803e+002\r
- 1.4382022e+002\r
- 5.2459016e+001\r
- 5.2459016e+001\r
- 1.2929293e+002\r
- 1.6410256e+002\r
- 8.0000000e+001\r
- 7.3563218e+001\r
- 1.0158730e+002\r
- 9.9224806e+001\r
- 4.9042146e+001\r
- 4.9042146e+001\r
- 4.9042146e+001\r
- 5.9259259e+001\r
- 1.4382022e+002\r
- 7.2316384e+001\r
- 1.0847458e+002\r
- 1.1228070e+002\r
- 1.6202532e+002\r
- 8.1528662e+001\r
- 7.2727273e+001\r
- 1.8550725e+002\r
- 6.0093897e+001\r
- 1.0847458e+002\r
- 8.9510490e+001\r
- 7.1508380e+001\r
- 4.0125392e+001\r
- 4.0634921e+001\r
- 4.0634921e+001\r
- 4.0251572e+001\r
- 4.0506329e+001\r
- 4.3986254e+001\r
- 4.0506329e+001\r
- 9.8461538e+001\r
- 5.6140351e+001\r
- 6.5641026e+001\r
- 5.4237288e+001\r
- 1.1636364e+002\r
- 3.4316354e+001\r
- 3.4972678e+001\r
- 3.7758112e+001\r
- 4.0634921e+001\r
- 4.0506329e+001\r
- 4.1290323e+001\r
- 4.2524917e+001\r
- 4.3389831e+001\r
- 4.4599303e+001\r
- 4.4912281e+001\r
- 4.6545455e+001\r
- 4.7232472e+001\r
- 4.8301887e+001\r
- 4.9230769e+001\r
- 4.9420849e+001\r
- 5.0393701e+001\r
- 5.1405622e+001\r
- 5.3333333e+001\r
- 5.3112033e+001\r
- 1.1034483e+002\r
- 9.7709924e+001\r
- 1.4382022e+002\r
- 5.0996016e+001\r
- 5.1821862e+001\r
- 5.0996016e+001\r
- 5.2032520e+001\r
- 5.3112033e+001\r
- 5.3556485e+001\r
- 5.4468085e+001\r
- 5.5652174e+001\r
- 5.4700855e+001\r
- 5.4700855e+001\r
- 5.4935622e+001\r
- 5.4700855e+001\r
- 5.4700855e+001\r
- 5.4468085e+001\r
- 5.4468085e+001\r
- 5.4468085e+001\r
- 5.4468085e+001\r
- 5.3333333e+001\r
- 5.1405622e+001\r
- 5.0996016e+001\r
- 5.0000000e+001\r
- 4.8120301e+001\r
- 4.8669202e+001\r
- 4.7058824e+001\r
- 4.6376812e+001\r
- 4.5070423e+001\r
- 4.4912281e+001\r
- 4.4137931e+001\r
- 4.2809365e+001\r
- 4.2666667e+001\r
- 4.2105263e+001\r
- 4.1423948e+001\r
- 4.1290323e+001\r
- 4.1290323e+001\r
- 4.1290323e+001\r
- 4.0634921e+001\r
- 4.0634921e+001\r
- 4.0634921e+001\r
- 4.0634921e+001\r
- 4.0764331e+001\r
- 4.1423948e+001\r
- 4.2953020e+001\r
- 4.5551601e+001\r
- 1.7534247e+002\r
- 4.7232472e+001\r
- 1.3763441e+002\r
- 1.3061224e+002\r
- 4.5551601e+001\r
- 4.3686007e+001\r
- 4.8669202e+001\r
- 9.4117647e+001\r
- 8.1012658e+001\r
- 1.1228070e+002\r
- 1.3617021e+002\r
- 4.3097643e+001\r
- 4.3835616e+001\r
- 4.6376812e+001\r
- 4.6545455e+001\r
- 4.6043165e+001\r
- 4.8301887e+001\r
- 4.9042146e+001\r
- 4.9420849e+001\r
- 5.1200000e+001\r
- 5.1405622e+001\r
- 5.2244898e+001\r
- 1.2929293e+002\r
- 1.2929293e+002\r
- 1.5238095e+002\r
- 1.5238095e+002\r
- 1.3913043e+002\r
- 9.0140845e+001\r
- 1.0940171e+002\r
- 9.0140845e+001\r
- 1.2307692e+002\r
- 8.9510490e+001\r
- 6.9565217e+001\r
- 7.3142857e+001\r
- 1.1034483e+002\r
- 7.8048780e+001\r
- 7.2727273e+001\r
- 1.0078740e+002\r
- 1.0940171e+002\r
- 1.1743119e+002\r
- 8.7074830e+001\r
- 1.8550725e+002\r
- 6.5306122e+001\r
- 1.3617021e+002\r
- 5.2674897e+001\r
- 1.0940171e+002\r
- 1.5238095e+002\r
- 1.4065934e+002\r
- 1.0756303e+002\r
- 1.0406504e+002\r
- 5.0793651e+001\r
- 4.9420849e+001\r
- 4.4444444e+001\r
- 7.0329670e+001\r
- 7.2727273e+001\r
- 7.4418605e+001\r
- 1.1636364e+002\r
- 1.0406504e+002\r
- 1.2307692e+002\r
- 1.2549020e+002\r
- 1.7297297e+002\r
- 4.5878136e+001\r
- 4.9805447e+001\r
- 6.2745098e+001\r
- 9.2086331e+001\r
- 9.1428571e+001\r
- 5.7142857e+001\r
- 4.8484848e+001\r
- 4.1157556e+001\r
- 2.2857143e+001\r
- 3.0046948e+001\r
- 9.4814815e+001\r
- 5.7918552e+001\r
- 9.0140845e+001\r
- 7.4418605e+001\r
- 7.4418605e+001\r
- 5.4700855e+001\r
- 9.5522388e+001\r
- 7.4853801e+001\r
- 9.4117647e+001\r
- 9.5522388e+001\r
- 9.9224806e+001\r
- 8.1012658e+001\r
- 1.1851852e+002\r
- 6.8817204e+001\r
- 8.5906040e+001\r
- 6.7015707e+001\r
- 4.3537415e+001\r
- 6.5306122e+001\r
- 3.1295844e+001\r
- 7.5739645e+001\r
- 6.2135922e+001\r
- 9.9224806e+001\r
- 5.7657658e+001\r
- 5.2244898e+001\r
- 5.8447489e+001\r
- 0.0000000e+000\r
- 0.0000000e+000\r
- 0.0000000e+000\r
- 0.0000000e+000\r
- 0.0000000e+000\r
--- /dev/null
+ 0.0000000e+000\r
+ 9.2753623e+001\r
+ 5.4237288e+001\r
+ 8.5906040e+001\r
+ 7.0329670e+001\r
+ 5.5652174e+001\r
+ 5.4237288e+001\r
+ 5.4935622e+001\r
+ 5.4700855e+001\r
+ 7.5739645e+001\r
+ 7.3563218e+001\r
+ 1.2307692e+002\r
+ 1.1428571e+002\r
+ 7.3563218e+001\r
+ 7.7108434e+001\r
+ 1.8550725e+002\r
+ 1.2673267e+002\r
+ 1.0847458e+002\r
+ 7.8527607e+001\r
+ 8.8888889e+001\r
+ 8.3116883e+001\r
+ 8.1012658e+001\r
+ 1.0756303e+002\r
+ 1.3061224e+002\r
+ 4.8301887e+001\r
+ 4.7940075e+001\r
+ 4.8120301e+001\r
+ 4.9230769e+001\r
+ 4.9420849e+001\r
+ 4.6886447e+001\r
+ 4.2953020e+001\r
+ 3.9263804e+001\r
+ 3.7869822e+001\r
+ 3.5457064e+001\r
+ 3.4224599e+001\r
+ 3.3333333e+001\r
+ 3.2820513e+001\r
+ 3.2000000e+001\r
+ 3.1295844e+001\r
+ 2.9906542e+001\r
+ 2.9493088e+001\r
+ 2.9090909e+001\r
+ 2.8699552e+001\r
+ 2.8131868e+001\r
+ 2.7826087e+001\r
+ 2.7826087e+001\r
+ 2.7826087e+001\r
+ 2.8193833e+001\r
+ 2.7467811e+001\r
+ 2.6890756e+001\r
+ 5.4468085e+001\r
+ 5.4237288e+001\r
+ 6.4974619e+001\r
+ 1.0756303e+002\r
+ 8.8888889e+001\r
+ 1.0406504e+002\r
+ 4.4599303e+001\r
+ 5.4468085e+001\r
+ 3.6260623e+001\r
+ 3.6260623e+001\r
+ 8.1012658e+001\r
+ 7.0329670e+001\r
+ 1.2929293e+002\r
+ 9.9224806e+001\r
+ 4.3097643e+001\r
+ 4.4137931e+001\r
+ 4.5714286e+001\r
+ 4.7407407e+001\r
+ 4.8301887e+001\r
+ 4.9230769e+001\r
+ 4.9420849e+001\r
+ 5.0996016e+001\r
+ 5.1405622e+001\r
+ 5.1405622e+001\r
+ 5.2244898e+001\r
+ 5.2459016e+001\r
+ 5.2459016e+001\r
+ 5.2244898e+001\r
+ 5.3333333e+001\r
+ 5.2459016e+001\r
+ 5.2244898e+001\r
+ 5.1405622e+001\r
+ 5.1405622e+001\r
+ 5.1200000e+001\r
+ 5.0996016e+001\r
+ 5.0196078e+001\r
+ 4.9230769e+001\r
+ 4.9230769e+001\r
+ 4.9230769e+001\r
+ 4.9420849e+001\r
+ 4.9230769e+001\r
+ 4.9042146e+001\r
+ 9.8461538e+001\r
+ 1.0158730e+002\r
+ 5.1821862e+001\r
+ 9.0140845e+001\r
+ 1.0491803e+002\r
+ 1.4382022e+002\r
+ 5.2459016e+001\r
+ 5.2459016e+001\r
+ 1.2929293e+002\r
+ 1.6410256e+002\r
+ 8.0000000e+001\r
+ 7.3563218e+001\r
+ 1.0158730e+002\r
+ 9.9224806e+001\r
+ 4.9042146e+001\r
+ 4.9042146e+001\r
+ 4.9042146e+001\r
+ 5.9259259e+001\r
+ 1.4382022e+002\r
+ 7.2316384e+001\r
+ 1.0847458e+002\r
+ 1.1228070e+002\r
+ 1.6202532e+002\r
+ 8.1528662e+001\r
+ 7.2727273e+001\r
+ 1.8550725e+002\r
+ 6.0093897e+001\r
+ 1.0847458e+002\r
+ 8.9510490e+001\r
+ 7.1508380e+001\r
+ 4.0125392e+001\r
+ 4.0634921e+001\r
+ 4.0634921e+001\r
+ 4.0251572e+001\r
+ 4.0506329e+001\r
+ 4.3986254e+001\r
+ 4.0506329e+001\r
+ 9.8461538e+001\r
+ 5.6140351e+001\r
+ 6.5641026e+001\r
+ 5.4237288e+001\r
+ 1.1636364e+002\r
+ 3.4316354e+001\r
+ 3.4972678e+001\r
+ 3.7758112e+001\r
+ 4.0634921e+001\r
+ 4.0506329e+001\r
+ 4.1290323e+001\r
+ 4.2524917e+001\r
+ 4.3389831e+001\r
+ 4.4599303e+001\r
+ 4.4912281e+001\r
+ 4.6545455e+001\r
+ 4.7232472e+001\r
+ 4.8301887e+001\r
+ 4.9230769e+001\r
+ 4.9420849e+001\r
+ 5.0393701e+001\r
+ 5.1405622e+001\r
+ 5.3333333e+001\r
+ 5.3112033e+001\r
+ 1.1034483e+002\r
+ 9.7709924e+001\r
+ 1.4382022e+002\r
+ 5.0996016e+001\r
+ 5.1821862e+001\r
+ 5.0996016e+001\r
+ 5.2032520e+001\r
+ 5.3112033e+001\r
+ 5.3556485e+001\r
+ 5.4468085e+001\r
+ 5.5652174e+001\r
+ 5.4700855e+001\r
+ 5.4700855e+001\r
+ 5.4935622e+001\r
+ 5.4700855e+001\r
+ 5.4700855e+001\r
+ 5.4468085e+001\r
+ 5.4468085e+001\r
+ 5.4468085e+001\r
+ 5.4468085e+001\r
+ 5.3333333e+001\r
+ 5.1405622e+001\r
+ 5.0996016e+001\r
+ 5.0000000e+001\r
+ 4.8120301e+001\r
+ 4.8669202e+001\r
+ 4.7058824e+001\r
+ 4.6376812e+001\r
+ 4.5070423e+001\r
+ 4.4912281e+001\r
+ 4.4137931e+001\r
+ 4.2809365e+001\r
+ 4.2666667e+001\r
+ 4.2105263e+001\r
+ 4.1423948e+001\r
+ 4.1290323e+001\r
+ 4.1290323e+001\r
+ 4.1290323e+001\r
+ 4.0634921e+001\r
+ 4.0634921e+001\r
+ 4.0634921e+001\r
+ 4.0634921e+001\r
+ 4.0764331e+001\r
+ 4.1423948e+001\r
+ 4.2953020e+001\r
+ 4.5551601e+001\r
+ 1.7534247e+002\r
+ 4.7232472e+001\r
+ 1.3763441e+002\r
+ 1.3061224e+002\r
+ 4.5551601e+001\r
+ 4.3686007e+001\r
+ 4.8669202e+001\r
+ 9.4117647e+001\r
+ 8.1012658e+001\r
+ 1.1228070e+002\r
+ 1.3617021e+002\r
+ 4.3097643e+001\r
+ 4.3835616e+001\r
+ 4.6376812e+001\r
+ 4.6545455e+001\r
+ 4.6043165e+001\r
+ 4.8301887e+001\r
+ 4.9042146e+001\r
+ 4.9420849e+001\r
+ 5.1200000e+001\r
+ 5.1405622e+001\r
+ 5.2244898e+001\r
+ 1.2929293e+002\r
+ 1.2929293e+002\r
+ 1.5238095e+002\r
+ 1.5238095e+002\r
+ 1.3913043e+002\r
+ 9.0140845e+001\r
+ 1.0940171e+002\r
+ 9.0140845e+001\r
+ 1.2307692e+002\r
+ 8.9510490e+001\r
+ 6.9565217e+001\r
+ 7.3142857e+001\r
+ 1.1034483e+002\r
+ 7.8048780e+001\r
+ 7.2727273e+001\r
+ 1.0078740e+002\r
+ 1.0940171e+002\r
+ 1.1743119e+002\r
+ 8.7074830e+001\r
+ 1.8550725e+002\r
+ 6.5306122e+001\r
+ 1.3617021e+002\r
+ 5.2674897e+001\r
+ 1.0940171e+002\r
+ 1.5238095e+002\r
+ 1.4065934e+002\r
+ 1.0756303e+002\r
+ 1.0406504e+002\r
+ 5.0793651e+001\r
+ 4.9420849e+001\r
+ 4.4444444e+001\r
+ 7.0329670e+001\r
+ 7.2727273e+001\r
+ 7.4418605e+001\r
+ 1.1636364e+002\r
+ 1.0406504e+002\r
+ 1.2307692e+002\r
+ 1.2549020e+002\r
+ 1.7297297e+002\r
+ 4.5878136e+001\r
+ 4.9805447e+001\r
+ 6.2745098e+001\r
+ 9.2086331e+001\r
+ 9.1428571e+001\r
+ 5.7142857e+001\r
+ 4.8484848e+001\r
+ 4.1157556e+001\r
+ 2.2857143e+001\r
+ 3.0046948e+001\r
+ 9.4814815e+001\r
+ 5.7918552e+001\r
+ 9.0140845e+001\r
+ 7.4418605e+001\r
+ 7.4418605e+001\r
+ 5.4700855e+001\r
+ 9.5522388e+001\r
+ 7.4853801e+001\r
+ 9.4117647e+001\r
+ 9.5522388e+001\r
+ 9.9224806e+001\r
+ 8.1012658e+001\r
+ 1.1851852e+002\r
+ 6.8817204e+001\r
+ 8.5906040e+001\r
+ 6.7015707e+001\r
+ 4.3537415e+001\r
+ 6.5306122e+001\r
+ 3.1295844e+001\r
+ 7.5739645e+001\r
+ 6.2135922e+001\r
+ 9.9224806e+001\r
+ 5.7657658e+001\r
+ 5.2244898e+001\r
+ 5.8447489e+001\r
+ 0.0000000e+000\r
+ 0.0000000e+000\r
+ 0.0000000e+000\r
+ 0.0000000e+000\r
+ 0.0000000e+000\r
--- /dev/null
+#!/bin/sh
+# Converts 16 bit signed short 8 kHz raw (headerless) files to wave
+sox -t raw -r 8000 -s -w -c 1 $1 $2
CC=gcc
CFLAGS=-g -Wall -I. -I../src -I../speex -Wall -g -DFLOATING_POINT -DVAR_ARRAYS
-SINENC_OBJ = sinenc.o globals.o initenc.o four1.o refine.o spec.o
+SINENC_OBJ = sinenc.o globals.o initenc.o four1.o refine.o spec.o dump.o
SINEDEC_OBJ = sinedec.o globals.o initenc.o initdec.o four1.o synth.o \
quantise.o lpc.o dump.o refine.o ../speex/lsp.o \
../speex/quant_lsp.o ../speex/bits.o ../speex/lsp_tables_nb.o \
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
+#include <string.h>
static int dumpon = 0;
-static FILE *fsn;
-static FILE *fsw;
-static FILE *fmodel;
-static FILE *fqmodel;
-static FILE *fpw;
-static FILE *flsp;
-
-void dump_on(char prefix[]) {
- char s[MAX_STR];
+static FILE *fsn = NULL;
+static FILE *fsw = NULL;
+static FILE *fsw_ = NULL;
+static FILE *fmodel = NULL;
+static FILE *fqmodel = NULL;
+static FILE *fpw = NULL;
+static FILE *flsp = NULL;
+static char prefix[MAX_STR];
+void dump_on(char p[]) {
dumpon = 1;
-
- sprintf(s,"%s_sn.txt", prefix);
- fsn = fopen(s, "wt");
- assert(fsn != NULL);
-
- sprintf(s,"%s_sw.txt", prefix);
- fsw = fopen(s, "wt");
- assert(fsw != NULL);
-
- sprintf(s,"%s_model.txt", prefix);
- fmodel = fopen(s, "wt");
- assert(fmodel != NULL);
-
- sprintf(s,"%s_qmodel.txt", prefix);
- fqmodel = fopen(s, "wt");
- assert(fqmodel != NULL);
-
- sprintf(s,"%s_pw.txt", prefix);
- fpw = fopen(s, "wt");
- assert(fpw != NULL);
-
- sprintf(s,"%s_lsp.txt", prefix);
- flsp = fopen(s, "wt");
- assert(flsp != NULL);
+ strcpy(prefix, p);
}
void dump_off(){
- fclose(fsn);
- fclose(fsw);
- fclose(fmodel);
- fclose(fqmodel);
- fclose(fpw);
- fclose(flsp);
+ if (fsn != NULL)
+ fclose(fsn);
+ if (fsw != NULL)
+ fclose(fsw);
+ if (fsw_ != NULL)
+ fclose(fsw_);
+ if (fmodel != NULL)
+ fclose(fmodel);
+ if (fqmodel != NULL)
+ fclose(fqmodel);
+ if (fpw != NULL)
+ fclose(fpw);
+ if (flsp != NULL)
+ fclose(flsp);
}
void dump_Sn(float Sn[]) {
int i;
+ char s[MAX_STR];
if (!dumpon) return;
+ if (fsn == NULL) {
+ sprintf(s,"%s_sn.txt", prefix);
+ fsn = fopen(s, "wt");
+ assert(fsn != NULL);
+ }
+
/* split across two lines to avoid max line length problems */
/* reconstruct in Octave */
void dump_Sw(COMP Sw[]) {
int i;
+ char s[MAX_STR];
if (!dumpon) return;
+ if (fsw == NULL) {
+ sprintf(s,"%s_sw.txt", prefix);
+ fsw = fopen(s, "wt");
+ assert(fsw != NULL);
+ }
+
for(i=0; i<FFT_ENC/2; i++)
fprintf(fsw,"%f\t",
10.0*log10(Sw[i].real*Sw[i].real + Sw[i].imag*Sw[i].imag));
fprintf(fsw,"\n");
}
+void dump_Sw_(COMP Sw_[]) {
+ int i;
+ char s[MAX_STR];
+
+ if (!dumpon) return;
+
+ if (fsw_ == NULL) {
+ sprintf(s,"%s_sw_.txt", prefix);
+ fsw_ = fopen(s, "wt");
+ assert(fsw_ != NULL);
+ }
+
+ for(i=0; i<FFT_ENC/2; i++)
+ fprintf(fsw_,"%f\t",
+ 10.0*log10(Sw_[i].real*Sw_[i].real + Sw_[i].imag*Sw_[i].imag));
+ fprintf(fsw_,"\n");
+}
+
void dump_model(MODEL *model) {
int l;
+ char s[MAX_STR];
if (!dumpon) return;
+ if (fmodel == NULL) {
+ sprintf(s,"%s_model.txt", prefix);
+ fmodel = fopen(s, "wt");
+ assert(fmodel != NULL);
+ }
+
fprintf(fmodel,"%f\t%d\t", model->Wo, model->L);
for(l=1; l<=model->L; l++)
fprintf(fmodel,"%f\t",model->A[l]);
for(l=model->L+1; l<MAX_AMP; l++)
fprintf(fmodel,"0.0\t");
+ for(l=1; l<=model->L; l++)
+ fprintf(fmodel,"%f\t",model->v[l]);
+ for(l=model->L+1; l<MAX_AMP; l++)
+ fprintf(fmodel,"0.0\t");
fprintf(fmodel,"\n");
}
void dump_quantised_model(MODEL *model) {
int l;
+ char s[MAX_STR];
if (!dumpon) return;
+ if (fqmodel == NULL) {
+ sprintf(s,"%s_qmodel.txt", prefix);
+ fqmodel = fopen(s, "wt");
+ assert(fqmodel != NULL);
+ }
+
fprintf(fqmodel,"%f\t%d\t", model->Wo, model->L);
for(l=1; l<=model->L; l++)
fprintf(fqmodel,"%f\t",model->A[l]);
void dump_Pw(COMP Pw[]) {
int i;
+ char s[MAX_STR];
if (!dumpon) return;
+ if (fpw == NULL) {
+ sprintf(s,"%s_pw.txt", prefix);
+ fpw = fopen(s, "wt");
+ assert(fpw != NULL);
+ }
+
for(i=0; i<FFT_DEC/2; i++)
fprintf(fpw,"%f\t",Pw[i].real);
fprintf(fpw,"\n");
void dump_lsp(float lsp[]) {
int i;
+ char s[MAX_STR];
if (!dumpon) return;
+ if (flsp == NULL) {
+ sprintf(s,"%s_lsp.txt", prefix);
+ flsp = fopen(s, "wt");
+ assert(flsp != NULL);
+ }
+
for(i=0; i<10; i++)
fprintf(flsp,"%f\t",lsp[i]);
fprintf(flsp,"\n");
void dump_off();
void dump_Sn(float Sn[]);
void dump_Sw(COMP Sw[]);
+void dump_Sw_(COMP Sw_[]);
void dump_model(MODEL *m);
void dump_quantised_model(MODEL *m);
void dump_Pw(COMP Pw[]);
/* Globals used in encoder */
float w[AW_ENC]; /* time domain hamming window */
+COMP W[FFT_ENC]; /* DFT of w[] */
COMP Sw[FFT_ENC]; /* DFT of current frame */
/* Globals used in decoder */
float make_window(int Nw)
{
float m;
- int i,j;
+ COMP temp;
+ int i,j;
/* Generate Hamming window centered on analysis window */
for(i=AW_ENC/2+Nw/2; i<AW_ENC; i++)
w[i] = 0.0;
- /* Normalise - this might be useful later on */
+ /* Normalise - make amplitude estimation straight forward */
m = 1.0/sqrt(m*FFT_ENC);
for(i=0; i<AW_ENC; i++) {
w[i] *= m;
}
+ /* Generate DFT of analysis window, used for voicing estimation */
+
+ for(i=0; i<FFT_ENC; i++) {
+ W[i].real = 0.0;
+ W[i].imag = 0.0;
+ }
+ for(i=0; i<AW_ENC/2; i++)
+ W[i].real = w[i+AW_ENC/2];
+ for(i=FFT_ENC-AW_ENC/2; i<FFT_ENC; i++)
+ W[i].real = w[i-FFT_ENC+AW_ENC/2];
+
+ four1(&W[-1].imag,FFT_ENC,-1); /* "Numerical Recipes in C" FFT */
+
+ /* re-arrange so that W is symmetrical about FFT_ENC/2 */
+
+ for(i=0; i<FFT_ENC/2; i++) {
+ temp.real = W[i].real;
+ temp.imag = W[i].imag;
+ W[i].real = W[i+FFT_ENC/2].real;
+ W[i].imag = W[i+FFT_ENC/2].imag;
+ W[i+FFT_ENC/2].real = temp.real;
+ W[i+FFT_ENC/2].imag = temp.imag;
+ }
+
return(m);
}
*/
#include "sine.h"
+#include "dump.h"
+#include <string.h>
+
+/*---------------------------------------------------------------------------*\
+
+ switch_present()
+
+ Searches the command line arguments for a "switch". If the switch is
+ found, returns the command line argument where it ws found, else returns
+ NULL.
+
+\*---------------------------------------------------------------------------*/
+
+int switch_present(sw,argc,argv)
+register char sw[]; /* switch in string form */
+register int argc; /* number of command line arguments */
+register char *argv[]; /* array of command line arguments in string form */
+{
+ register int i; /* loop variable */
+
+ for(i=1; i<argc; i++)
+ if (!strcmp(sw,argv[i]))
+ return(i);
+
+ return 0;
+}
/*---------------------------------------------------------------------------*\
- MAIN
+ MAIN
\*---------------------------------------------------------------------------*/
float pitch; /* current pitch estimate from external pitch file */
int i; /* loop variable */
FILE *fref; /* optional output file with refined pitch estimate */
-
+ int arg;
+ int dump;
+ int frames;
+
if (argc < 5) {
printf("usage: sinenc InputFile ModelFile Frames PitchFile\n");
exit(1);
exit(1);
}
- if (argc > 5) {
- if ((fref = fopen(argv[5],"wt")) == NULL) {
+ dump = switch_present("--dump",argc,argv);
+ if (dump)
+ dump_on(argv[dump+1]);
+
+ if ((arg == switch_present("--ref",argc,argv))) {
+ if ((fref = fopen(argv[arg+1],"wt")) == NULL) {
printf("Error opening output pitch refinement file: %s\n",argv[5]);
exit(1);
}
/* Main loop ------------------------------------------------------------*/
- while(fread(buf,sizeof(short),N,fin) == N && frames != length) {
+ frames = 0;
+ while((fread(buf,sizeof(short),N,fin) == N) && (frames != length)) {
frames++;
/* Update input speech buffers */
/* estimate and model parameters */
- dft_speech();
+ dft_speech();
two_stage_pitch_refinement();
estimate_amplitudes();
+ dump_Sn(Sn); dump_Sw(Sw); dump_Sw_(Sw_); dump_model(&model);
/* save model parameters */
fclose(fin);
fclose(fmodel);
+ if (dump)
+ dump_off();
+
return 0;
}
int b; /* DFT bin of centre of current harmonic */
float den; /* denominator of amplitude expression */
float r; /* number of rads/bin */
+ float E;
+ int offset;
+ COMP Am;
r = TWO_PI/FFT_ENC;
+ for(i=0; i<FFT_ENC; i++) {
+ Sw_[i].real = 1.0;
+ Sw_[i].imag = 0.0;
+ }
for(m=1; m<=model.L; m++) {
den = 0.0;
/* Estimate ampltude of harmonic */
den = 0.0;
+ Am.real = Am.imag = 0.0;
for(i=am; i<bm; i++) {
den += Sw[i].real*Sw[i].real + Sw[i].imag*Sw[i].imag;
+ offset = i + FFT_ENC/2 - floor(m*model.Wo/r + 0.5);
+ Am.real += Sw[i].real*W[offset].real;
+ Am.imag += Sw[i].imag*W[offset].real;
}
model.A[m] = sqrt(den);
/* Estimate phase of harmonic */
model.phi[m] = atan2(Sw[b].imag,Sw[b].real);
+
+ /* construct all voiced model spectrum and estimate voicing */
+
+ E = 0.0;
+ for(i=am; i<bm; i++) {
+ offset = FFT_ENC/2 + i - floor(m*model.Wo/r + 0.5);
+ Sw_[i].real = Am.real*W[offset].real;
+ Sw_[i].imag = Am.imag*W[offset].real;
+ E = pow(Sw[i].real - Sw_[i].real, 2.0) + pow(Sw[i].imag - Sw_[i].imag, 2.0);
+ }
+ model.v[m] = E/den;
}
}
float Sn_[]; /* time domain synthesised signal */
{
int i,l,j,b; /* loop variables */
- COMP Nw[FFT_DEC]; /* DFT of noise signal */
COMP Sw_[FFT_DEC]; /* DFT of synthesised signal */
/* Update memories */