2. 试用奇阶互补法设计两带滤波器组(高、低通互补),进而实现四带滤波器组;并画出其频响。滤波器设计参数为:Fp=1.7KHz, Fr=2.3KHz, Fs=8KHz, Armin≥70dB。
解:
III. Matlab程序与结果
1)二带数字滤波器组的源代码:(源代码统一格式排版)
%二带数字滤波器组
clear all;
close all;
%滤波器设计参数
Fp=1700;
Fr=2300;
Fs=8000;
Omegap=tan(pi*Fp/Fs);
Omegar=tan(pi*Fr/Fs);
Omegac=sqrt(Omegap*Omegar);
k=Omegap/Omegar;
k1=sqrt(sqrt(1-k^2));
q0=0.5*(1-k1)/(1+k1);
q=q0+2*q0^5+15*q0^9+150*q0^13;
N=11;
N2=fix(N/4);
M=fix(N/2);
N1=M-N2;
%计算Omgai和Vi
for i=1:M
a=0;
for m=0:5
a=a+(-1)^m*q^(m*(m+1))*sin((2*m+1)*pi*i/N);
end
b=0;
for m=1:5
b=b+(-1)^m*q^(m^2)*cos(2*m*pi*i/N);
end
Omega(i)=2*q^0.25*a/(1+2*b);
V(i)=sqrt((1-k*Omega(i)^2)*(1-Omega(i)^2/k));
end
%计算alhpa(i)和beta(i)
for i=1:N1
alpha(i)=2*V(2*i-1)/(1+Omega(2*i-1)^2);
end
for i=1:N2
beta(i)=2*V(2*i)/(1+Omega(2*i)^2);
end
%计算A(i)和B(i)
for i=1:N1
A(i)=(1-alpha(i)*Omegac+Omegac^2)/(1+alpha(i)*Omegac+Omegac^2);
end
for i=1:N2
B(i)=(1-beta(i)*Omegac+Omegac^2)/(1+beta(i)*Omegac+Omegac^2);
end
w=0:0.0001:0.5;
HL=zeros(size(w));
HH=zeros(size(w));
for n=1:length(w)
z=exp(j*w(n)*2*pi);
H1=1;
for i=1:N1
H1=H1*(A(i)+z^(-2))/(1+A(i)*z^(-2)) ;
end
H2=1/z;
for i=1:N2
H2=H2*(B(i)+z^(-2))/(1+B(i)*z^(-2));
end
HL(n)=abs((H1+H2)/2);
HH(n)=abs((H1-H2)/2);
end
plot(w,HL,'g',w,HH,'m');
hold on;
xlabel('digital frequency');
ylabel('Amptitude');
title('二带数字滤波器组');
2)运行结果
3)四带数字滤波器组的源代码:
%四带滤波器组
clear all;
close all;
%滤波器器设计参数
Fp=1700;
Fr=2300;
Fs=8000;
Omegap=tan(pi*Fp/Fs);
Omegar=tan(pi*Fr/Fs);
Omegac=sqrt(Omegap*Omegar);
k=Omegap/Omegar;
k1=sqrt(sqrt(1-k^2));
q0=0.5*(1-k1)/(1+k1);
q=q0+2*q0^5+15*q0^9+150*q0^13;
N=11;
N2=fix(N/4);
M=fix(N/2);
N1=M-N2;
%计算Omega(i)和V(i)
for i=1:M
a=0;
for m=0:5
a=a+(-1)^m*q^(m*(m+1))*sin((2*m+1)*pi*i/N);
end
b=0;
for m=1:5
b=b+(-1)^m*q^(m^2)*cos(2*m*pi*i/N);
end
Omega(i)=2*q^0.25*a/(1+2*b);
V(i)=sqrt((1-k*Omega(i)^2)*(1-Omega(i)^2/k));
end
%计算alpha(i)和beta(i)
for i=1:N1
alpha(i)=2*V(2*i-1)/(1+Omega(2*i-1)^2);
end
for i=1:N2
beta(i)=2*V(2*i)/(1+Omega(2*i)^2);
end
%计算A(i)和B(i)
for i=1:N1
A(i)=(1-alpha(i)*Omegac+Omegac^2)/(1+alpha(i)*Omegac+Omegac^2);
end
for i=1:N2
B(i)=(1-beta(i)*Omegac+Omegac^2)/(1+beta(i)*Omegac+Omegac^2);
end
w=0:0.0001:0.5;
HLL=zeros(size(w));
HLH=zeros(size(w));
HHL=zeros(size(w));
HHHP=zeros(size(w));
for n=1:length(w)
z=exp(j*w(n)*2*pi);
H1=1;
for i=1:N1
H1=H1*(A(i)+z^(-2))/(1+A(i)*z^(-2)) ;
end
H21=1;
for i=1:N1
H21=H21*(A(i)+z^(-4))/(1+A(i)*z^(-4)) ;
end
H2=1/z;
for i=1:N2
H2=H2*(B(i)+z^(-2))/(1+B(i)*z^(-2));
end
H22=1/(z^2);
for i=1:N2
H22=H22*(B(i)+z^(-4))/(1+B(i)*z^(-4));
end
HL=((H1+H2)/2);
HH=((H1-H2)/2);
HLL(n)=abs((H21+H22)/2*HL);
HLH(n)=abs((H21-H22)/2*HL);
HHH(n)=abs((H21+H22)/2*HH);
HHL(n)=abs((H21-H22)/2*HH);
end
plot(w,HLL,'b',w,HLH,'y',w,HHL,'r',w,HHH,'k')
hold on
xlabel('digital frequency');
ylabel('Amptitude');
title('四带数字滤波器组');
4)运行结果
3. 根据《现代数字信号处理》(姚天任等,华中理工大学出版社,2001)第四章附录提供的数据(pp.352-353),试用如下方法估计其功率谱,并画出不同参数情况下的功率谱曲线:
1)Levinson算法 2)Burg算法 3)ARMA模型法 4)MUSIC算法
1)Levinson算法的MATLAB源程序如下:
其中,参数X为输入序列,p为AR模型的阶数,函数调用形式为:Levinson(X,p)。这是一个Levinson.m文件:
Levinson.m文件
function S=Levinson(X,p)
N=length(X);
for m=0:N-1
R(m+1)=sum(conj(X([1:N-m])).*X([m+1:N]))/N;
end
a=-R(2)/R(1);
sigma2=(1-abs(a)^2)*R(1);
gamma=-a;
for k=2:p
sigma2(k)=R(1)+sum(a.*conj(R([2:k])));
D=R(k+1)+sum(a.*R([k:-1:2]));
gamma(k)=D/sigma2(k);
sigma2(k)=(1-abs(gamma(k))^2)*sigma2(k);
a=[a-gamma(k)*conj(fliplr(a)),-gamma(k)];
end
sigma2=real(sigma2);
f=linspace(-0.5,0.5,512);
for k=1:512
S(k)=10*log10(sigma2(end)/(abs(1+sum(a.*exp(-j*2*pi*f(k)*[1:p])))^2));
end
plot(f,S);
title(['Levinson: ',int2str(p),' 阶']);
xlabel('归一化频率');
ylabel('相对谱/dB');
close all;
clear all;
p=[10 25 40 55];
x=randn(1,1000);%独立的高斯分布随机数
for k=1:4
subplot(2,2,k);
Levinson(x,p(k));
end
3)运行结果
略
II) Burg算法
函数调用形式为:Burg(X,p)。其中参数X为输入序列,p为AR模型的阶数。
<pre name="code" class="plain">function [S,A,sigma2]=Burg(X,p)
N=length(X);
ef=X;
eb=X;
sigma2=sum(X*X')/N;
A=[];
for k=1:p
efp=ef(k+1:end);
ebp=eb(k:end-1);
gamma(k)=2*efp*ebp'/(efp*efp'+ebp*ebp');
sigma2(k+1)=(1-abs(gamma(k))^2)*sigma2(k);
ef(k+1:end)=efp-gamma(k)*ebp;
eb(k+1:end)=ebp-gamma(k)'*efp;
A=[A-gamma(k)*conj(fliplr(A)),-gamma(k)];
end
f=linspace(-0.5,0.5,512);
for k=1:512
S(k)=10*log10(sigma2(end)/(abs(1+sum(A.*exp(-j*2*pi*f(k)*[1:p])))^2));
end
plot(f,S);
title(['Burg: ',int2str(p),' 阶']);
xlabel('归一化频率'), ylabel('相对谱/dB');
分别对应于10阶、25阶、40阶、55阶的Burg算法的执行可以调用Burg函数实现。.m文件如下:
close all;
clear all;
p=[10 25 40 55];
x=randn(1,1000);%独立的高斯分布随机数
for k=1:4
subplot(2,2,k);
Burg(x,p(k));
End
3)运行结果
略
III) ARMA模型法
函数调用形式为:ARMA(X,p,q)。其中参数X为输入序列,p为AR模型的阶数,q为MA模型的阶数。
function S=ARMA(X,p,q)
N=length(X);
M=N-1;
r=xcorr(X,'unbiased');
for k=1:p
R(:,k)=(r([N+q-k+1:N+M-k])).';
end
a=(-pinv(R)*(r([N+q+1:N+M]).')).';
Y=filter([1,a],[1],X);
pp=5*q;
[S,A,K]=Burg(Y,pp);
P=K(end);
[S,A,K]=Burg(A,q);
b=A;
f=linspace(-0.5,0.5,512);
for k=1:512
S(k)=10*log10(P*(abs(1+b*(exp(-j*2*pi*f(k)*[1:q]).'))/abs(1+a*(exp(-j*2*pi*f(k)*[1:p]).')))^2);
end
plot(f,S);
title(['ARMA: (',int2str(p),',',int2str(q),') 阶']);
xlabel('归一化频率');
ylabel('相对谱/dB');
分别对应于ARMA(30,10)、ARMA(30,1)、ARMA(40,10)、ARMA(50,10)的ARMA算法的执行可以用.m文件实现
close all;
clear all;
x=randn(1,1000);%独立的高斯分布随机数
subplot(2,2,1);ARMA(x,30,10);
subplot(2,2,2);ARMA(x,30,1);
subplot(2,2,3);ARMA(x,40,10);
subplot(2,2,4);ARMA(x,50,10);
3)运行结果
略
IV) MUSIC算法
函数调用形式为:MUSIC(X,p)。其中参数X为输入序列,p为AR模型的阶数,
function S=MUSIC(X,p)
N=length(X);
r=xcorr(X,'biased');
clear R
for k=1:N
R(:,k)=(r([N-(k-1):2*N-k])).';
end
[V,D] = eig(R);
f=linspace(-0.5,0.5,512);
S0=fft(V(:,p+1:end),512);
for k=1:512
S(k)=10*log10(1/(S0(k,:)*S0(k,:)'));
end
S=[S(257:512) S(1:256)];
plot(f,S);
title(['MUSIC: ',int2str(p),' 维']);
xlabel('归一化频率');
ylabel('相对谱/dB');
分别对应于10维、25维、40维、55维的MUSIC算法的执行可以用.m文件实现:
clear all;
close all;
x=randn(1,1000);%独立的高斯分布随机数
p=[10 25 40 55];
for k=1:4
subplot(2,2,k);
MUSIC(x,p(k));
end
4.图1为均衡带限信号所引起失真的横向或格型自适应均衡器(其中横向FIR系统长度M=11),系统输入是取值为±1的随机序列x(n),其均值为零;参考d(n)=x(n-7);信道具有脉冲响应:
式中W用来控制信道的幅度失真(W=2~4,例如,取W=2.9,3.1,3.3,3.5),而且信道受到均值为零、方差为 (例如,取 =0.001,相当于信噪比为30dB)的高斯白噪声v(n)的干扰,试比较基于下列五种算法自适应均衡器在不同信道失真、不同噪声干扰下的收敛情况(对应于每一种情况,在同一坐标下画出其学习曲线),并分析其结果。
1>横向/格-梯型结构LMS算法 2>横向/格-梯型结构RLS算法
I)横向结构LMS算法
close all;
clear all;
w=[2.9,3.1,3.3,3.5];%信道的幅度失真
M=11;%横向滤波器的长度
sigma2=0.001; %噪声方差
T=7; %参考信号延时
N=400; % 训练次数(信号样本数)
iteration=500; %迭代次数
L=iteration+T+M-1; %单个输入信号长度
u=0.025; %迭代步长
value=zeros(length(w),L-M+1-T);
for ww=1:length(w)
%信道具有的脉冲响应
h=ones(1,3);
h(1)=0.5*(1+cos(2*pi/w(ww)));
h(3)=h(1);
e2=zeros(N,L-M+1-T);%误差信号的平方
for n=1:N
rand('seed',n*N);
X=sign(2*rand(1,L)-1); %产生一个随机信号序列
D=zeros(size(X));
for mm=T+1:L
D(mm)=X(mm-T);%对应的参考信号
end
U=conv(X,h);%信号经过信道的输出
randn('seed',n*N);
V=randn(size(U)).*sqrt(sigma2); %产生高斯噪声
R=U+V; %自适应滤波器输入信号
W=zeros(M,1); %滤波器参数的初始值为0
for m=1:iteration
r=R(T+m:T+m+M-1)';
y=r'*W;
e=D(T+m+M-1)-y; % 误差信号
e2(n,m)=e.^2;
W=W+2*u*e*r; %滤波器参数迭代
end
end
value(ww,:)=mean(e2); %均方误差值
end
semilogy(value(1,:),'y--');hold on;
semilogy(value(2,:),'k-.');hold on;
semilogy(value(3,:),'m:');hold on;
semilogy(value(4,:),'b-');hold on;
grid on;
xlabel('the number of iteration');
ylabel('mean square error');
title('LMS Arithmetic');
legend(‘w1=2.9’,‘w2=3.1’,‘w3=3.3’,‘w4=3.5’);
II)横向结构RLS算法
close all;
clear all;
w=[2.9,3.1,3.3,3.5];
M=11;
sigma2=0.001; %噪声方差
T=7;%参考信号延迟
N=400;%训练次数
iteration=500; %迭代次数
L=iteration+T+M-1;%输入信号长度
lamda=0.999; %遗忘因子
value=zeros(length(w),L-M+1-T);
for ww=1:length(w)
h=ones(1,3);
h(1)=0.5*(1+cos(2*pi/w(ww)));
h(3)=h(1);
e2=zeros(N,L-M+1-T);
for n=1:N
rand('seed',n*N);
X=sign(2*rand(1,L)-1);
D=zeros(size(X));
for mm=T+1:L
D(mm)=X(mm-T);
end
U=conv(X,h);
randn('seed',n*N);
V=randn(size(U)).*sqrt(sigma2);
R=U+V; %自适应滤波器输入信号
W=zeros(M,1);
P=eye(M)/0.004;
for m=1:iteration
r=R(T+m+M-1:-1:T+m)';
e=D(T+m+M-1)-r'*W;
e2(n,m)=e.^2;
K=P*r/(lamda+r'*P*r);
P=(eye(M)-K*r')*P/lamda;
W=W+K.*e;
for mm=2:M-1
r(mm)=r(mm+1);
end
r(1)=R(T+m+M);
end
end
value(ww,:)=mean(e2);
end
semilogy(value(1,:),'y--');hold on;
semilogy(value(2,:),'k-.');hold on;
semilogy(value(3,:),'m:');hold on;
semilogy(value(4,:),'b-');hold on;
grid on;
xlabel('the number of iteration');
ylabel('mean square error');
title('RLS Arithmetic');
III)格-梯型结构LMS算法
close all;
clear all;
W=[2.9,3.1,3.3,3.5];%信道的幅度失真
w=0.9999;
T=7;%延迟7个周期
sigma2=0.001;%噪声方差
L=500;%数据长度
M=11;%横向滤波器的长度
N=400;%次数
e2=zeros(length(W),L);
for ww=1:length(W)
n=[1,2,3];
h(n)=1/2*(1+cos(2*pi*(n-2)/W(ww)));
for nn=1:N
km=ones(L+2,M+1);
vm=ones(L+2,M+1);
beta=ones(L+2,M+1);
fm=ones(L+2,M+1);
gm=ones(L+2,M+1);
e=ones(L+2,M+2);
rand('seed',N*nn);
X=sign(2*rand(1,L+T)-1);
U=conv(X,h);
randn('seed',N*nn);
V=randn(size(U))*sqrt(sigma2);
R=U+V;
for m=1:M+1
km(2,m)=0; %n=2
vm(2,m)=0.8;
beta(3,m)=0;
fm(2,m)=0;
gm(2,m)=0;
gm(1,m)=0;
end
for n=3:L+2 %m=1
e(n,2)=X(n-2);
fm(n,1)=R(n-2+T);
gm(n,1)=R(n-2+T);
end
for n=3:L+2
for m=2:M+1
vm(n,m)=w*vm(n-1,m)+(abs(fm(n,m-1)))^2+(abs(gm(n-1,m-1)))^2; km(n,m)=km(n-1,m)+(fm(n-1,m-1)*conj(gm(n-1,m))+conj(gm(n-2,m-1))*fm(n-1,m))/vm(n-1,m);
fm(n,m)=fm(n,m-1)-km(n,m)*gm(n-1,m-1);
gm(n,m)=gm(n-1,m-1)-conj(km(n,m))*fm(n,m-1);
e(n,m+1)=e(n,m)-gm(n,m)*beta(n,m);
beta(n+1,m)=beta(n,m)+2*e(n,m+1)*conj(gm(n,m))/vm(n,m);
end
e2(ww,n-2)=e2(ww,n-2)+e(n,M+2)*e(n,M+2);
end
end
end
e2=e2/N;
semilogy(1:L,e2(1,:),'y-');hold on;
semilogy(1:L,e2(2,:),'b-.');hold on;
semilogy(1:L,e2(3,:),'k:');hold on;
semilogy(1:L,e2(4,:),'m--');hold on;
grid on;
xlabel('data');
ylabel('mean square error');
title('格-梯型结构LMS算法');
IV)格-梯型结构RLS算法
close all;
clear all;W=[2.9,3.1,3.3,3.5];%信道的幅度失真
lamda=0.999; %遗忘因子
T=7;%延迟7个周期
L=500; %数据长度
M=11;%横向滤波器的长度
N=400; %迭代次数
sigma2=0.001;%噪声方差
e2=zeros(length(W),L);
for i=1:length(W)
h=ones(1,3);
h(1)=0.5*(1+cos(2*pi/W(i)));
h(3)=h(1);
alpha=zeros(L+2,M);
k=zeros(L+2,M);
kf=zeros(L+2,M);
kb=zeros(L+2,M);
fm=zeros(L+2,M);
gm=zeros(L+2,M);
Ef=zeros(L+2,M);
Eb=zeros(L+2,M);
delta=zeros(L+2,M);
kasi=zeros(L+2,M);
e=zeros(L+2,M+1);
for j=1:N
rand('seed',N*j);
X=sign(2*rand(1,L+T)-1);
D=zeros(size(X));
U=conv(X,h);
randn('seed',N*j);
V=randn(size(U)).*sqrt(sigma2);
R=U+V; %自适应滤波器输入信号
for m=1:M
alpha(1,m)=1;
k(1,m)=0;
Eb(1,m)=0.9;
Eb(2,m)=0.9;
Ef(2,m)=0.9;
delta(1,m)=0;
fm(2,m)=0;
gm(2,m)=0;
gm(1,m)=0;
e(2,m)=0;
end
for n=3:L+2
alpha(n-1,1)=1;
e(n,1)=X(n-2);
fm(n,1)=R(n-2+T);
gm(n,1)=R(n-2+T);
Ef(n,1)=lamda*Ef(n-1,1)+(abs(R(n-2+T)))^2;
Eb(n,1)=Ef(n,1);
end
for n=3:L+2
for m=1:M-1
k(n-1,m+1)=lamda*k(n-2,m+1)+alpha(n-2,m)*fm(n-1,m)*conj(gm(n-2,m));
kf(n-1,m+1)=-k(n-1,m+1)/Eb(n-2,m);
kb(n-1,m+1)=-conj(k(n-1,m+1))/Ef(n-1,m);
fm(n,m+1)=fm(n,m)+kf(n-1,m+1)*gm(n-1,m);
gm(n,m+1)=gm(n-1,m)+kb(n-1,m+1)*fm(n,m);
Ef(n-1,m+1)=Ef(n-1,m)-(abs(k(n-1,m+1)))^2/Eb(n-2,m);
Eb(n-1,m+1)=Eb(n-2,m)-(abs(k(n-1,m+1)))^2/Ef(n-1,m);
alpha(n-1,m+1)=alpha(n-1,m)-(alpha(n-1,m))^2* (abs(gm(n-1,m)))^2/Eb(n-1,m);
end
for m=1:M
delta(n-1,m)=lamda*delta(n-2,m)+alpha(n-1,m)* conj(gm(n-1,m))*e(n-1,m);
kasi(n-1,m)=-delta(n-1,m)/Eb(n-1,m);
e(n,m+1)=e(n,m)+kasi(n-1,m)*gm(n,m);
end
e2(i,n-2)=e2(i,n-2)+e(n,M+1)^2;
end
end
end
e2=e2/N;
clf;
semilogy(1:L,e2(1,:),'y-');hold on;
semilogy(1:L,e2(2,:),'b-.');hold on;
semilogy(1:L,e2(3,:),'c:');hold on;
semilogy(1:L,e2(4,:),'k--');hold on;
grid on;
xlabel('data');
ylabel('mean square error');
title('格-梯型结构RLS算法');
几种算法结果比较分析:
(1)在不同的信道幅度失真下,信道幅度失真越小,收敛时的均方误差越小。横向LMS算法对信道幅度失真十分敏感,当w=3.5时,横向LMS不仅稳态误差较大,其收敛速度也明显变慢。
(2)从收敛速度上看,横向RLS和格型RLS快于横向LMS和格型LMS。
(3)从稳态误差上看,横向RLS和格型RLS普遍低于横向LMS和格型LMS。
(4)从计算量上看,RLS大于LMS,格型大于横向结构。