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 object. The axes object 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 object. The axes object 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% общего количества. Получившаяся реконструкция является нижней, но все еще понятной.

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

Смотрите также

|

Для просмотра документации необходимо авторизоваться на сайте