exponenta event banner

DCT для сжатия речевого сигнала

В этом примере показано, как сжимать речевой сигнал с использованием дискретного косинусного преобразования (DCT).

Загрузите файл, содержащий слово, «сильное», произнесенное женщиной и мужчиной. Сигналы выбраны на уровне 8 кГц.

load('strong.mat')

% To hear, type soundsc(her,fs), pause(1), soundsc(him,fs)

Используйте дискретное косинусное преобразование для сжатия внутреннего речевого сигнала. Разложение сигнала на базисные векторы DCT. В разложении столько же членов, сколько выборок в сигнале. Коэффициенты расширения в векторе X измерить, сколько энергии хранится в каждом из компонентов. Отсортируйте коэффициенты от наибольшего к наименьшему.

x = her';

X = dct(x);

[XX,ind] = sort(abs(X),'descend');

Найдите, сколько DCT коэффициентов представляют 99,9% энергии в сигнале. Выражайте число в процентах от общего числа.

need = 1;
while norm(X(ind(1:need)))/norm(X)<0.999
   need = need+1;
end

xpc = need/length(X)*100;

Установите в нуль коэффициенты, которые содержат оставшиеся 0,1% энергии. Восстановите сигнал из сжатого представления. Постройте график исходного сигнала, его реконструкции и разницы между ними.

X(ind(need+1:end)) = 0;
xx = idct(X);

plot([x;xx;x-xx]')
legend('Original',[int2str(xpc) '% of coeffs.'],'Difference', ...
       'Location','best')

Figure contains an axes. The axes contains 3 objects of type line. These objects represent Original, 45% of coeffs., Difference.

% To hear, type soundsc(x,fs), pause(1), soundsc(xx,fs)

Повторите анализ для мужского голоса. Найдите, сколько коэффициентов DCT представляют 99,9% энергии и выразите число в процентах от общего числа.

y = him';
Y = dct(y);

[YY,ind] = sort(abs(Y),'descend');

need = 1;
while norm(Y(ind(1:need)))/norm(Y)<0.999
   need = need+1;
end

ypc = need/length(Y)*100;

Установите остальные коэффициенты в нуль и восстановите сигнал из сжатой версии. Постройте график исходного сигнала, его реконструкции и разницы между ними.

Y(ind(need+1:end)) = 0;
yy = idct(Y);

plot([y;yy;y-yy]')
legend('Original',[int2str(ypc) '% of coeffs.'],'Difference', ...
       'Location','best')

Figure contains an axes. The axes contains 3 objects of type line. These objects represent Original, 57% of coeffs., Difference.

% To hear, type soundsc(y,fs), pause(1), soundsc(yy,fs)

В обоих случаях для разумного восстановления речевого сигнала достаточно примерно половины коэффициентов ДКП. Если требуемая доля энергии составляет 99%, количество необходимых коэффициентов уменьшается примерно до 20% от общего количества. Получившаяся реконструкция уступает, но все же внятна.

Анализ этих и других образцов показывает, что для характеристики голоса мужчины требуется больше коэффициентов, чем у женщины.

См. также

|