4.Сжатие речевого сигнала
Модифицируем алгоритм, описанный в предыдущей главе, для сжатия речевого сигнала посредством ДИКМ. Для этого записанный отрезок речи подвергнем дискретизации с частотой 8000 Гц и квантуем полученные отсчеты 2048 уровнями (11 бит и 1 бит на знак). Получим разностный сигнал также, как и в случае для синусоидального сигнала.
Значения разностного сигнала, полученного при использовании оптимальных коэффициентов, можно записать при помощи 9-10 бит. Очевидно, что такое сжатие разностного сигнала является недостаточным, а следовательно, необходимо подвергнуть разностный сигнал дальнейшей обработке. Для этого будем еще раз квантовать сигнал, чтобы была возможность записать его при помощи 6 бит.
На приемной стороне умножим полученный отсчет на использованный шаг квантования и продолжим алгоритм, как и в предыдущей главе.
Листинг соответствующей программы представлен ниже:
clear all;
Fs=8000;
t=0.5;
a1=1.8;
a2=-0.8;
beep
x = wavrecord(t*Fs, Fs);
[x1,sh,kvbin,x]=DAC(x,Fs,t,12,2);
beep;
wavplay(x*sh, Fs);
%mu=255;
%koef=32;
%beep;
%wavplay(x*sh, Fs);
q = fft(x,Fs*t);
q = q(1:(Fs*t/2));
m = abs(q);
m1=m/(Fs*t/2);
f = (0:((Fs*t)-1)/2)/t;
tm=0:1/Fs:t;
tm=tm(1:Fs*t);%
for n=1:Fs*t
if n==1
pr_x(n)=0;
elseif n==2
pr_x(n)=round((a1*x(n-1)));
else
pr_x(n)=round(((a1*x(n-1)+a2*x(n-2))));
end
end
for n=1:Fs*t
if n==1
e(n)=x(n);
else
e(n)=x(n)-pr_x(n);
end
end
e2=e;
ma=max(abs(e));
[x1,sh_e,kvbin,e]=DAC(e,Fs,t,6,2);
%for n=1:Fs*t
%e(n)=round((sign(e(n))*koef*((log(1+mu*abs(e(n)/ma)))/(log(mu+1)))));
%end
e1=e;
%for n=1:Fs*t
% e(n)=round(sign(e(n))*(1/255)*((256^(abs(e(n)/koef))-1))*ma);
%end
e=round(e*sh_e);
for n=1:Fs*t
if n==1
y(n)=e(n);
pr_y(n)=0;
elseif n==2
pr_y(n)=round((a1*y(n-1)));
y(n)=e(n)+pr_y(n);
else
pr_y(n)=round(((a1*y(n-1)+a2*y(n-2))));
y(n)=e(n)+pr_y(n);
end
end
w = fft(e,Fs*t);
w = w(1:(Fs*t/2));
r = abs(w);
r1=r/(Fs*t/2);
beep;
wavplay(y*sh, Fs);
figure
plot(tm,y,'--b',tm,x,':r',tm,e1,'y');
title('Синий - y, красный - x, желтый - разностный сжатый');% Подпись графика
figure% Создаем новое окно
plot(f,m1,'b',f,r1,'m')
title('Спектры сигналов. Синий - исходный сигнал, сиреневый - с удаленными формантами');% Подпись графика
xlabel('Частота (Гц)'), grid on;% Подпись оси х графика
ylabel('Амплитуда'), grid on;% Подпись оси у графика
file_x=fopen('x_predicted.txt','wt');
for n=1:Fs*t;%
fprintf(file_x,'%f\n', pr_x(n));
end
fclose(file_x);
file_x=fopen('x.txt','wt');
for n=1:Fs*t;%
fprintf(file_x,'%f\n', x(n));
end
fclose(file_x);
file_x=fopen('e_before_commpression.txt','wt');
for n=1:Fs*t;%
fprintf(file_x,'%f\n', e2(n));
end
fclose(file_x);
file_x=fopen('e_commpressed.txt','wt');
for n=1:Fs*t;%
fprintf(file_x,'%f\n', e1(n));
end
fclose(file_x);
file_x=fopen('e_reconstructed.txt','wt');
for n=1:Fs*t;%
fprintf(file_x,'%f\n', e(n));
end
fclose(file_x);
file_x=fopen('y_predicted.txt','wt');
for n=1:Fs*t;%
fprintf(file_x,'%f\n', pr_y(n));
end
fclose(file_x);
file_x=fopen('y.txt','wt');
for n=1:Fs*t;%
fprintf(file_x,'%f\n', y(n));
end
fclose(file_x);
При помощи вышеописанной программы получим осциллограммы и спектрограммы речевого сигнала при произношении фразы «sixty two» и определим какие коэффициенты будут оптимальными в этом случае.
Эксперимент № 1
а1=1.8 и а2=-0.8
Рис. 18
Рис. 19
Эксперимент № 2
а1=1.8 и а2=-0.9
Рис. 20
Рис. 21
Эксперимент № 3
а1=1.4 и а2=-0.9
Рис. 22
Рис. 23
Эксперимент № 4
а1=1 и а2=-0.9
Рис. 24
Рис. 25
Эксперимент № 5
а1=1.8 и а2=-1
Рис. 26
Рис. 27
Проанализировав полученные результаты: таблицы значений, осциллограммы и спектрограммы сигналов следует сделать вывод о том, что оптимальными для передачи речевого сигнала являются коэффициенты а1=1.8 и а2=-0.9. Именно при этих значениях можно соблюсти баланс между заметным уменьшением разностного сигнала и качеством восстановленного сигнала.
