LBG算法实现语音信号的矢量量化.docVIP

  • 66
  • 0
  • 约2.22千字
  • 约 4页
  • 2020-12-17 发布于浙江
  • 举报
语音信号的矢量量化 一.实验内容:采用LBG算法实现语音信号的矢量量化 二.实验原理:基本LBG算法的基本框架为: 1.已知码书尺寸M,给定设计的失真阈值即停止门限,给定一个出示码书。已知一个训练序列。先取n=0(n为迭代次数),并设出示平均失真。 2.用给定的码本,求出平均失真最小条件下的所以区域边界。即根据最佳划分准则把训练序列划分为M个胞腔。应该用训练序列,使,从而得出最佳区域边界。然后,计算在该区域下训练序列的平均失真。在这一步中要累计最小失真并在最后计算平均失真。 3.计算相对平均失真(即与第n-1次迭代的失真相对而言),如果它小于阈值,即 ,则认为满足设计要求,此时停止计算,并且就是所设计的码书,就是所设计的区域边界。如果平均失真的条件不满足则进行第四步。 4.按前面给出的最佳码书设计方法,计算这时划分的各胞腔的形心,由这M个新形心构成(n+1)次迭代的新形心。置n=n+1,返回到第2步再进行计算,直到满足失真测度公式,得到所要求的码书为止。 三.结果分析: 在本实验中采用语音参数的矢量量化,即将语音信号经过分析,得到各种参数,然后再将这些按桢或按段分析所得的数组构成矢量,进行矢量量化。其中输入的语音文件波形如图一所示。 图1 声音波形 输入信号的语音参数为20个MPCC参数,码本尺寸为16,最后得到的码字为r,r是一个的矩阵,在MATLAB7.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

文档评论(0)

1亿VIP精品文档

相关文档