一:子带编码
1.子带编码首先将输入信号分割成几个不同的频带分量,然后再分别进行编码,这类编码方式称为频域编码。 2.把语音信号分成若干子带进行编码主要有两个优点: (1).如果对不同的子带合理分配比特数,可以控制各子带的量化电平数目,以及相应的重建信号的量化误差方差值,以获得更好的主观听音质量。
(2).各子带的量化噪声相互独立,被束缚在自己的子带内,不影响其它子带的量化噪声。
3.影响子带编码效率的因数
子带数目、子带划分、编码参数、子带中比特的分配、每样值编码比特、带宽。 4.分类
(1)等带宽子带编码
各子带的带宽是相同的,其优点是易于硬件实现,便于理论分析。
其中,k= 1, 2, 3 …, m为子带总数,B编码信号总带宽
(2)变带宽子带编码
各子带带宽是不同的,常用的子带划分是令各子带宽度随K的增加而增加(低频段子带带宽窄,高频段宽),其优点是对不同的子带分配的比特数不同,能获得很好的质量。
二:matlab实现
1.主要是使用非对称滤波器组来实现语音信号的子带分解和合并。
2.关键:针对语音信号的频谱设计与之相适应的树形滤波器组。
3.编码采用u律pcm编码。 介绍:
? 本编程所设计的树形结构滤波器组,是由两通道的正交镜像滤波器组通过级联或并联组建而成的。
? 采用正交镜象滤波器(QMF,quandrature mirror filter)来划分频带,混迭效应在最后合成时可以抵消 ? 混迭失真:这是由于分析滤波器组和综合滤波器组的频带不能完全分开及x(n)的抽样频率fs不能大于其最高频率成分的m倍所致。
?
两通道的滤波器组
两通道的滤波器组
两通道的滤波器组的幅频特性
两通道的正交镜像滤波器组的幅频特性
? (从频频特性可以看出采用正交镜象滤波器来划分频带,混迭效应在最后合成时可以抵消)
原始语音y
提取一通道 抗混叠滤波 分析滤波器组 U律pcm编码 处理后语音y_he · 重构滤波器组 U律pcm编码 整体框图
频带分解(主要)
(下附matlab源程序语音为wav格式自己录音)
%主程序
clear all ;close all;clc;
N=4096*50;%采集点数
[y,fs,bits]=wavread('tangshi',N); %读取音频信息(双声道) Fs=fs ; ts = 1/fs;
%仅处理1通道信号
y1=y(:,1)' ;%the signal of channel one
%y2=y(:,2) ;%the signal of channel two
t=0:1/fs:(N-1)/fs;%time %原始语音信号读取
sound(y1,fs); %原始语音信号画图 figure(1) ;
subplot(2,1,1) ;
plot(t,y1) ;%1通道信号
title('原始信号y1') ; %预滤波
%语音信号预处理人耳可识别范围(300~3400),因此多于此频率的信号可以滤掉而不用传输
[y1_yu,fs_yu]=pre_process(y1,fs) ;
subplot(2,1,2) ;
plot(t(1:fs/fs_yu:3*floor(length(t)/3)),y1_yu) ;%滤波后的信号时域波形
title('预滤波后的信号y1_yu') ;
%对上面两个信号进行频谱分析 Y1 = fft(y1); Y1_YU = fft(y1_yu); %画出图形 figure(2) ; subplot(2,1,1) dfs= fs/length(Y1);
H1 = abs(Y1(1:length(Y1)/2)); f1 = 0:dfs:fs-dfs; f1 = f1(1:length(Y1)/2); plot(f1,H1)
axis([0,10000,0,max(abs(fftshift(Y1)))]) title('原始信号频谱y1')
subplot(2,1,2)
H2 = abs(Y1_YU(1:length(Y1_YU)/2)); f2=0:dfs:fs_yu-dfs; f2 = f2(1:length(Y1_YU)/2); plot(f2,H2)
axis([0,10000,0,max(abs(fftshift(Y1_YU)))])
title('抗混叠滤波后y1_yu的信号频谱,fl=300Hz,fh=3400Hz') %抗混叠滤波后语音信号读取
sound(y1_yu,fs_yu); %分解
[yu1,yu2]=fenjie(y1_yu,fs_yu) ; %y1 %2次分解
[y1_1,y1_2]=fenjie(yu1,fs_yu) ; %3次分解
[y1_11,y1_12]=fenjie(y1_1,fs_yu) ; [y1_21,y1_22]=fenjie(y1_2,fs_yu) ; %y2 %2次分解
[y2_1,y2_2]=fenjie(yu2,fs_yu) ; %3次分解
[y2_11,y2_12]=fenjie(y2_1,fs_yu) ; [y2_21,y2_22]=fenjie(y2_2,fs_yu) ;
%分解图示 figure
subplot(4,1,1) plot(f2,H2);
title(['原始信号频谱,fs=',num2str(fs_yu)])
subplot(4,2,3) hy1 = abs(fft(yu1)); fhy1=0:dfs:fs_yu/2-dfs; fhy1 = fhy1(1:length(hy1)/2); plot(fhy1,hy1(1:length(hy1)/2)) title(['1次分解,fs=',num2str(fs_yu/2)])
subplot(4,2,4) hy2 = abs(fft(yu2)); fhy2=0:dfs:fs_yu/2-dfs; fhy2 = fhy2(1:length(hy2)/2); plot(fhy2,hy2(1:length(hy2)/2))
subplot(4,4,9) hy1_1 = abs(fft(y1_1)); fhy1_1=0:dfs:fs_yu/4-dfs;
fhy1_1 = fhy1_1(1:length(hy1_1)/2); plot(fhy1_1,hy1_1(1:length(hy1_1)/2))
title(['2次分解,fs=',num2str(fs_yu/4)])
subplot(4,4,10) hy1_2 = abs(fft(y1_2)); fhy1_2=0:dfs:fs_yu/4-dfs;
fhy1_2 = fhy1_2(1:length(hy1_2)/2); plot(fhy1_2,hy1_2(1:length(hy1_2)/2))
subplot(4,4,11) hy2_1 = abs(fft(y2_1)); fhy2_1=0:dfs:fs_yu/4-dfs;
fhy2_1 = fhy2_1(1:length(hy2_1)/2); plot(fhy2_1,hy2_1(1:length(hy2_1)/2))
subplot(4,4,12) hy2_2 = abs(fft(y2_2)); fhy2_2=0:dfs:fs_yu/4-dfs;
fhy2_2 = fhy2_2(1:length(hy2_2)/2); plot(fhy2_2,hy2_2(1:length(hy2_2)/2))
subplot(4,8,25)
hy1_11 = abs(fft(y1_11));
fhy1_11=0:dfs:fs_yu/8-dfs;
fhy1_11 = fhy1_11(1:length(hy1_11)/2); plot(fhy1_11,hy1_11(1:length(hy1_11)/2)) title(['3次分解,fs=',num2str(fs_yu/8)])
subplot(4,8,26)
hy1_12 = abs(fft(y1_12)); fhy1_12=0:dfs:fs_yu/8-dfs;
fhy1_12 = fhy1_12(1:length(hy1_12)/2); plot(fhy1_12,hy1_12(1:length(hy1_12)/2))
subplot(4,8,27)
hy1_21 = abs(fft(y1_21)); fhy1_21=0:dfs:fs_yu/8-dfs;
fhy1_21 = fhy1_21(1:length(hy1_21)/2); plot(fhy1_21,hy1_21(1:length(hy1_21)/2))
subplot(4,8,28)
hy1_22 = abs(fft(y1_22)); fhy1_22=0:dfs:fs_yu/8-dfs;
fhy1_22 = fhy1_22(1:length(hy1_22)/2); plot(fhy1_22,hy1_22(1:length(hy1_22)/2))
subplot(4,8,29)
hy2_11 = abs(fft(y2_11)); fhy2_11=0:dfs:fs_yu/8-dfs;
fhy2_11 = fhy2_11(1:length(hy2_11)/2); plot(fhy2_11,hy2_11(1:length(hy2_11)/2))
subplot(4,8,30)
hy2_12 = abs(fft(y2_12)); fhy2_12=0:dfs:fs_yu/8-dfs;
fhy2_12 = fhy2_12(1:length(hy2_12)/2); plot(fhy2_12,hy2_12(1:length(hy2_12)/2))
subplot(4,8,31)
hy2_21 = abs(fft(y2_21)); fhy2_21=0:dfs:fs_yu/8-dfs;
fhy2_21 = fhy2_21(1:length(hy2_21)/2); plot(fhy2_21,hy2_21(1:length(hy2_21)/2))
subplot(4,8,32)
hy2_22 = abs(fft(y2_22)); fhy2_22=0:dfs:fs_yu/8-dfs;
fhy2_22 = fhy2_22(1:length(hy2_22)/2); plot(fhy2_22,hy2_22(1:length(hy2_22)/2))
%PCM编码 pcm1 = upcm(y1_11); pcm2 = upcm(y1_12); pcm3 = upcm(y1_21); pcm4 = upcm(y1_22); pcm5 = upcm(y2_11); pcm6 = upcm(y2_12); pcm7 = upcm(y2_21); pcm8 = upcm(y2_22); Tcode解码
dpcm1 = dupcm(pcm1,8); dpcm2 = dupcm(pcm2,8); dpcm3 = dupcm(pcm3,8); dpcm4 = dupcm(pcm4,8); dpcm5 = dupcm(pcm5,8); dpcm6 = dupcm(pcm6,8); dpcm7 = dupcm(pcm7,8); dpcm8 = dupcm(pcm8,8); %信号的合成
y_he=hebing8(y1_11,y1_12,y1_21,y1_22,y2_11,y2_12,y2_21,y2_22) ;%低频信号8通道合成 figure ;
subplot(2,1,1) ;
plot(y1_yu) ;
title('预滤波后的信号y1_yu') ; subplot(2,1,2)
plot(y_he) ;%合成后的信号
title('信宿端恢复信号y_he') ; wavwrite(y_he,fs_yu,16,'sound.wav') % sound(y,fs) % sound(y1,fs) % sound(y1_yu,fs_yu) sound(y_he,fs_yu)
%抗混迭滤波器
function [y1,fs_yu] = pre_process(y,Fs) %降低采样率,抽取 y = y(1:3:3*floor(length(y)/3)); fs_yu = Fs/3; fl = 300; fh = 3400; wn1 = fl/(fs_yu/2); wn2 = fh/(fs_yu/2); wn=[wn1,wn2]; a = 1; N=70;
b=fir1(N,wn,'bandpass'); y1=filter(b,a,y);
%信号插值子程序(完成信号的零插值和高通滤波)
function f=interp1(x)
%实现信号的零插值
f=interp(x,2) ;
for i=1:length(x)
f(2*i)=0 ; end
%设计高通滤波器
a1=fir1(200,1/2,'high');
%完成对信号的高通滤波
f=filter(a1,1,f);
%树形结构分解子程序(完成信号的2通道分解以及降采样率)
function [y1,y2]=fenjie(x,fs)
a1=fir1(100,1/2); %频谱的一半滤波
a2=qmf(a1) ; %镜像滤波器
w1=filter(a1,1,x); %低通滤波
w2=filter(a2,1,x); %高通滤波 %抽取
% y1=w1;y2=w2;
y1=downsample(w1,2); %抽取2
y2=downsample(w2,2); %抽取2
%信号的8通道的分解子程序()
function [f1 f2 f3 f4 f5 f6 f7 f8]=fenjie8(x,fs)
%1次分解
[y1,y2]=fenjie(x,fs) ; %y1
%2次分解
[y1_1,y1_2]=fenjie(y1,fs) ; %3次分解
[f1,f2]=fenjie(y1_1,fs) ;
[f3,f4]=fenjie(y1_2,fs) ; %y2
%2次分解
[y2_1,y2_2]=fenjie(y2,fs) ; %3次分解
[f5,f6]=fenjie(y2_1,fs) ;
[f7,f8]=fenjie(y2_2,fs) ;
%μ律PCM编码 function pcm = upcm(x) L=length(x); for i=1:L
x(i)=x(i)/4;
x(i)=fix(x(i)*4079); s=sign(x(i)); if s<0
pcm((i-1)*8+1)=0; else
pcm((i-1)*8+1)=1; end x(i)=abs(x(i)); p(i)=x(i);
if x(i)<=15.5
pcm((i-1)*8+2:(i-1)*8+4)=[0,0,0]; else if x(i)<=47.5
pcm((i-1)*8+2:(i-1)*8+4)=[0,0,1]; p(i)=floor((x(i)-15.5)/2); else if x(i)<=111.5
pcm((i-1)*8+2:(i-1)*8+4)=[0,1,0]; p(i)=floor((x(i)-47.5)/4); else if x(i)<=239.5
pcm((i-1)*8+2:(i-1)*8+4)=[0,1,1]; p(i)=floor((x(i)-111.5)/8); else if x(i)<=495.5
pcm((i-1)*8+2:(i-1)*8+4)=[1,0,0]; p(i)=floor((x(i)-239.5)/16); else if x(i)<=1007.5
pcm((i-1)*8+2:(i-1)*8+4)=[1,0,1]; p(i)=floor((x(i)-495.5)/32); else if x(i)<=2031.5
pcm((i-1)*8+2:(i-1)*8+4)=[1,1,0]; p(i)=floor((x(i)-1007.5)/64); else if x(i)<=4079.5
pcm((i-1)*8+2:(i-1)*8+4)=[1,1,1]; p(i)=floor((x(i)-2031.5)/128);
end;end;end;end; end;end;end;end;
y=str2double(dec2bin(p(i))); pcm((i-1)*8+5)=floor(y/1000);
pcm((i-1)*8+6)=floor(mod(y,1000)/100); pcm((i-1)*8+7)=floor(mod(y,100)/10); pcm((i-1)*8+8)=floor(mod(y,10)); end end
%u律pcm解码
function dpcm = dupcm(pcm,nbit)
L=length(pcm)/nbit; for i=1:L
k(i)=pcm((i-1)*8+2)*4+pcm((i-1)*8+3)*2+pcm((i-1)*8+4); h(i)=pcm((i-1)*8+5)*8+pcm((i-1)*8+6)*4+pcm((i-1)*8+7)*2+pcm((i-1)*8+8);
switch k(i) case 0 dpcm(i)=h(i); case 1
dpcm(i)=16.5+h(i)*2+1; case 2
dpcm(i)=49.5+h(i)*4+2; case 3
dpcm(i)=115.5+h(i)*8+4; case 4
dpcm(i)=247.5+h(i)*16+8; case 5
dpcm(i)=511.5+h(i)*32+16; case 6
dpcm(i)=1039.5+h(i)*64+32; case 7
dpcm(i)=2095.5+h(i)*128+64; otherwise disp('error'); end
if pcm((i-1)*8+1)==0 dpcm(i)=0-dpcm(i); end;
dpcm(i)=dpcm(i)/1023; end; end
%树形结构综合子程序(完成2通道信号的综合)
function y=hebing(y1,y2)
%信号的零插值和低通滤波
y1=interp(y1,2) ;
%信号的零插值和高通滤波
y2=interp1(y2) ;
%进行插值后的信号可能长度不一样,因此要进行长信号的截取
n=min(length(y1),length(y2)) ;
y1=y1(1:n) ;
y2=y2(1:n) ;
%信号的合并 y=y1+y2 ;
%重构滤波器组8通道合并 function
f=hebing8(y1_1_1,y1_1_2,y1_2_1,y1_2_2,y2_1_1,y2_1_2,y2_2_1,y2_2_2)
%信号的3次合并
y1_1=hebing(y1_1_1,y1_1_2) ;
y1_2=hebing(y1_2_1,y1_2_2) ;
y2_1=hebing(y2_1_1,y2_1_2) ;
y2_2=hebing(y2_2_1,y2_2_2) ;
%信号的2次合并
y1=hebing(y1_1,y1_2) ;
y2=hebing(y2_1,y2_2) ;
%信号的1次合并
f=hebing(y1,y2) ;