语音信号的矢量量化
一.实验内容:采用LBG 算法实现语音信号的矢量量化
二.实验原理:基本LBG 算法的基本框架为:
1.已知码书尺寸M ,给定设计的失真阈值即停止门限)10(<<εε,给定一个出示码书)
0(M Y 。
已知一
个训练序列]1,...,1,0,[-=m j X j 。
先取n=0(n 为迭代次数),并设出示平均失真∞→-)1(D 。
2.用给定的码本M Y ,求出平均失真最小条件下的所以区域边界),...,2,1(M i S i =。
即根据最佳划分准则把训练序列划分为M 个胞腔。
应该用训练序列i j S X ∈,使))(,(),(M j i j Y Y Y X d Y X d ∈<,
从而得出最佳区域边界)(n i S 。
然后,计算在该区域下训练序列的平均失真∑-=∈=1
0)(),(min 1m j Y r j n M
Y X d m D 。
在这一步中要累计最小失真并在最后计算平均失真。
3.计算相对平均失真(即与第n-1次迭代的失真相对而言),如果它小于阈值,即
ε≤--)()
()1(n n n D
D D ,则认为满足设计要求,此时停止计算,并且M Y 就是所设计的码书,)(n i S 就是所设计的区域边界。
如果平均失真的条件不满足则进行第四步。
4.按前面给出的最佳码书设计方法,计算这时划分的各胞腔的形心,由这M 个新形心构成(n+1)次迭代的新形心)1(+n M Y 。
置n=n+1,返回到第2步再进行计算,直到满足失真测度公式,得到所要求的码书为止。
三.结果分析:
在本实验中采用语音参数的矢量量化,即将语音信号经过分析,得到各种参数,然后再将这些按桢或按段分析所得的数组构成矢量,进行矢量量化。
其中输入的语音文件波形如图一所示。
图1 声音波形
输入信号的语音参数为20个MPCC 参数,码本尺寸为16,最后得到的码字为r ,r 是一个1620⨯的矩阵,在MA TLAB7.0里用工作空间的画图功能可得到下面的图。
图2 实验数据
四.实验程序
[s,fs]=wavread('s1.wav');
%数据准备
m = 100;
n = 256;
l = length(s);
nbFrame = floor((l - n) / m) + 1;
for i = 1:n
for j = 1:nbFrame
M(i, j) = s(((j - 1) * m) + i);
end
end
h = hamming(n);
M2 = diag(h) * M;
for i = 1:nbFrame
frame(:,i) = fft(M2(:, i));
end
t = n / 2;
tmax = l / fs;
m = melfb(20, n, fs);
n2 = 1 + floor(n / 2);
z = m * abs(frame(1:n2, :)).^2;
v = dct(log(z));
%LBG算法
k=16;
e = .01;
r = mean(v, 2);
dpr = 10000;
for i = 1:log2(k)
r = [r*(1+e), r*(1-e)];
while (1 == 1)
z = disteu(v, r);
[m,ind] = min(z, [], 2);
t = 0;
for j = 1:2^i
r(:, j) = mean(v(:, find(ind == j)), 2);
x = disteu(v(:, find(ind == j)), r(:, j));
for q = 1:length(x)
t = t + x(q);
end
end
if (((dpr - t)/t) < e)
break;
else
dpr = t;
end
end
end
%失真测度
function d = disteu(x, y)
[M, N] = size(x);
[M2, P] = size(y);
if (M ~= M2)
error('Matrix dimensions do not match.') end
d = zeros(N, P);
if (N < P)
copies = zeros(1,P);
for n = 1:N
d(n,:) = sum((x(:, n+copies) - y) .^2, 1);
end
else
copies = zeros(1,N);
for p = 1:P
d(:,p) = sum((x - y(:, p+copies)) .^2, 1)';
end
end
d = d.^0.5;
%滤波器
function m = melfb(p, n, fs)
f0 = 700 / fs;
fn2 = floor(n/2);
lr = log(1 + 0.5/f0) / (p+1);
bl = n * (f0 * (exp([0 1 p p+1] * lr) - 1)); b1 = floor(bl(1)) + 1;
b2 = ceil(bl(2));
b3 = floor(bl(3));
b4 = min(fn2, ceil(bl(4))) - 1;
pf = log(1 + (b1:b4)/n/f0) / lr;
fp = floor(pf);
pm = pf - fp;
r = [fp(b2:b4) 1+fp(1:b3)];
c = [b2:b4 1:b3] + 1;
v = 2 * [1-pm(b2:b4) pm(1:b3)];
m = sparse(r, c, v, p, 1+fn2);。