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

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

Загрузите файл, содержащий слово «strong», на котором говорит женщина и человек. Сигналы дискретизированы на частоте 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)

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

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

См. также

|