[b,a]=butter(Nm,wc);
else
[b,a]=butter(Nm,wc,'high');%高通
end;
ifsign==0%根据标志信号判断是否需要计算滤波器的频率响应
H=freqz(b,a,w);
else
H=0;
End
译码函数:
function[result,varargout]=Translate(x)%译码函数
%%初始参数设置
fs=8000;
N=205;n=0:
N-1;
t=n/fs;
f=(n/N-1/2)*fs;w=f*2*pi/fs;
%%IIR低通
wpl=1000*2/fs;wsl=1100*2/fs;Rp=1;Rs=15;
[bl,al,Hl]=Butter_My(wpl,wsl,Rp,Rs,w,nargout);
%%低带通1
wpl_1=[650*2/fs,750*2/fs];wsl_1=[600*2/fs,800*2/fs];
[bl_1,al_1,Hl_1]=Butter_My(wpl_1,wsl_1,Rp,Rs,w,nargout);
%%低带通2
wpl_2=[720*2/fs,820*2/fs];wsl_2=[670*2/fs,870*2/fs];
[bl_2,al_2,Hl_2]=Butter_My(wpl_2,wsl_2,Rp,Rs,w,nargout);
%%低带通3
wpl_3=[800*2/fs,900*2/fs];wsl_3=[750*2/fs,950*2/fs];
[bl_3,al_3,Hl_3]=Butter_My(wpl_3,wsl_3,Rp,Rs,w,nargout);
%%低带通4
wpl_4=[890*2/fs,990*2/fs];wsl_4=[840*2/fs,1040*2/fs];
[bl_4,al_4,Hl_4]=Butter_My(wpl_4,wsl_4,Rp,Rs,w,nargout);
%%低频组滤波
xl=filter(bl,al,x);xl_1=filter(bl_1,al_1,xl);xl_2=filter(bl_2,al_2,xl);xl_3=filter(bl_3,al_3,xl);xl_4=filter(bl_4,al_4,xl);
%%IIR高通
wph=1100*2/fs;wsh=1000*2/fs;
[bh,ah,Hh]=Butter_My(wph,wsh,Rp,Rs,w,nargout);
%%高带通1
wph_1=[1110*2/fs,1310*2/fs];wsh_1=[1060*2/fs,1360*2/fs];
[bh_1,ah_1,Hh_1]=Butter_My(wph_1,wsh_1,Rp,Rs,w,nargout);
%%高带通2
wph_2=[1240*2/fs,1440*2/fs];wsh_2=[1190*2/fs,1490*2/fs];
[bh_2,ah_2,Hh_2]=Butter_My(wph_2,wsh_2,Rp,Rs,w,nargout);
%%高带通3
wph_3=[1380*2/fs,1580*2/fs];wsh_3=[1330*2/fs,1630*2/fs];
[bh_3,ah_3,Hh_3]=Butter_My(wph_3,wsh_3,Rp,Rs,w,nargout);
%%高频组滤波
xh=filter(bh,ah,x);xh_1=filter(bh_1,ah_1,xh);xh_2=filter(bh_2,ah_2,xh);xh_3=filter(bh_3,ah_3,xh);
ifnargout==0
%%原始信号频响
X=fftshift(fft(x));
%%低频组滤波后频响
Xl=fftshift(fft(xl));Xl_1=fftshift(fft(xl_1));Xl_2=fftshift(fft(xl_2));Xl_3=fftshift(fft(xl_3));Xl_4=fftshift(fft(xl_4));
%%高频组滤波后频响
Xh=fftshift(fft(xh));Xh_1=fftshift(fft(xh_1));Xh_2=fftshift(fft(xh_2));Xh_3=fftshift(fft(xh_3));
%%绘制图像
figure
(1)
subplot(2,1,1),plot(t,x);title('原始信号时域波形');xlabel('t/s');ylabel('xt');gridon;
subplot(2,1,2),plot(f,abs(X));title('原始信号幅度谱');xlabel('f/Hz');ylabel('幅度');gridon;xlim([0,4000]);
figure
(2)
subplot(3,2,1);plot(f,abs(Hl));title('低通滤波器幅频响应');xlabel('f/Hz');ylabel('幅度');gridon;xlim([0,4000]);
subplot(3,2,2);plot(f,abs(Hh));title('高通滤波器幅频响应');xlabel('f/Hz');ylabel('幅度');gridon;xlim([0,4000]);
subplot(3,2,3),plot(t,xl);title('低通滤波后信号时域波形');xlabel('t/s');ylabel('xt');gridon;
subplot(3,2,4),plot(t,xh);title('高通滤波后信号时域波形');xlabel('t');ylabel('xt');gridon;
subplot(3,2,5),plot(f,abs(Xl));title('低通滤波器滤波后信号幅度谱');xlabel('f/Hz');ylabel('幅度');gridon;xlim([0,4000]);
subplot(3,2,6),plot(f,abs(Xh));title('高通滤波器滤波后信号幅度谱');xlabel('f/Hz');ylabel('幅度');gridon;xlim([0,4000]);
figure(3)
subplot(2,2,1);plot(f,abs(Hl_1));title('697Hz低带通滤波器幅频响应');xlabel('f/Hz');ylabel('幅度');axis([400,1000,0,1.2]);gridon;
subplot(2,2,2);plot(f,abs(Hl_2));title('770Hz低带通滤波器幅频响应');xlabel('f/Hz');ylabel('幅度');axis([470,1070,0,1.2]);gridon;
subplot(2,2,3);plot(f,abs(Hl_3));title('852Hz低带通滤波器幅频响应');xlabel('f/Hz');ylabel('幅度');axis([550,1150,0,1.2]);gridon;
subplot(2,2,4);plot(f,abs(Hl_4));title('941Hz低带通滤波器幅频响应');xlabel('f/Hz');ylabel('幅度');axis([640,1240,0,1.2]);gridon;
figure(4)
subplot(2,2,1);plot(f,abs(Hh_1));title('1209Hz高带通滤波器幅频响应');xlabel('f/Hz');ylabel('幅度');axis([910,1510,0,1.2]);gridon;
subplot(2,2,2);plot(f,abs(Hh_2));title('1336Hz高带通滤波器幅频响应');xlabel('f/Hz');ylabel('幅度');axis([1040,1640,0,1.2]);gridon;
subplot(2,2,3);plot(f,abs(Hh_3));title('1477Hz高带通滤波器幅频响应');xlabel('f/Hz');ylabel('幅度');axis([1180,1780,0,1.2]);gridon;
figure(5)
plot(t,xl_1,'b-',t,xl_2,'r-',t,xl_3,'g-',t,xl_4,'y-');legend('697Hz','770Hz','852Hz','941Hz');title('低通译码结果');xlabel('t');ylabel('xt');gridon;
figure(6)
plot(t,xh_1,'b-',t,xh_2,'r-',t,xh_3,'g-');legend('1209Hz','1336Hz','1477Hz');title('高通译码结果');xlabel('t/s');ylabel('xt');gridon;
figure(7)
plot(f,abs(Xl_1),'b-',f,abs(Xl_2),'r-',f,abs(Xl_3),'g-',f,abs(Xl_4),'y-');legend('697Hz','770Hz','852Hz','941Hz');title('低通译码结果频谱');xlabel('f/Hz');ylabel('幅度');gridon;xlim([0,4000]);
figure(8)
plot(f,abs(Xh_1),'b-',f,abs(Xh_2),'r-',f,abs(Xh_3),'g-');legend('1209Hz','1336Hz','1477Hz');title('高通译码结果频谱');xlabel('f/Hz');ylabel('幅度');gridon;xlim([0,4000]);
%%译码匹配
else
l=[xl_1;xl_2;xl_3;xl_4];h=[xh_1;xh_2;xh_3];
result=Decode(l,h);
End
译码匹配函数:
functiontranslation=Decode(l,h)%译码匹配函数
%%计算峰值
maxl=max(max(l));maxh=max(max(h));%计算低频组最大值和高频组最大值
maxl_1=max(l(1,:
));maxl_2=max(l(2,:
));maxl_3=max(l(3,:
));maxl_4=max(l(4,:
));%低频组各频率峰值
maxh_1=max(h(1,:
));maxh_2=max(h(2,:
));maxh_3=max(h(3,:
));%高频组各频率峰值
%%译码匹配,返回译码结果
ifmaxl==maxl_1
ifmaxh==maxh_1
translation='1';
end
ifmaxh==maxh_2
translation='2';
end
ifmaxh==maxh_3
translation='3';
end
end
ifmaxl==maxl_2
ifmaxh==maxh_1
translation='4';
end
ifmaxh==maxh_2
translation='5';
end
ifmaxh==maxh_3
translation='6';
end
end
ifmaxl==maxl_3
ifmaxh==maxh_1
translation='7';
end
ifmaxh==maxh_2
translation='8';
end
ifmaxh==maxh_3
translation='9';
end
end
ifmaxl==maxl_4
ifmaxh==maxh_1
translation='*';
end
ifmaxh==maxh_2
translation='0';
end
ifmaxh==maxh_3
translation='#';
end
end
主函数:
closeall;clearall;clc;
%%模拟数字4的合成并显示译码过程相关图像
x4=Signal(770,1209);%合成数字四
Translate(x4);%译码,无返回值时绘制图像
%%模拟其他字符的合成并译码
fl=[697770852941];fh=[120913361477];%定义低频组和高频组
fori=1:
4
forj=1:
3
x(3*(i-1)+j,:
)=Signal(fl(i),fh(j));%模拟合成12种字符信号
end
end
fori=1:
4
forj=1:
3
result(3*(i-1)+j)=Translate(x(3*(i-1)+j,:
));%翻译接收的12种字符信号,有返回值时只译码不绘图
end
end
disp('译码结果为:
');disp(result);%显示译码结果
实验结果以及分析:
实验结果分析:
从实验结果来看实验还是非常成功的,从滤波后的两组时域波形来看,可以看出低频组中幅度最大的为770Hz,高频组中幅度最大的为1209Hz。
因此可以确定该数字应为4,解码正确。
同时从命令窗口的显示结果来看,对其他数字合成的解码也都正确。
其实在实际的应用中产生信号的频率并不一定那么准确,它们往往存在一定误差。
但在一定的误差范围内并不会影响解码结果,以下列出了解码的误差允许范围:
低频组:
(506|507)697(738|739)770(809|810)852(895|896)941
高频组:
1209(1279|1280)1336(1411|1412)1477(2107|2108)
当其越过临界值时才会产生误码。
实验总结
通过本次实验,加深了我们对信号频谱分析和IIR数字滤波器设计的知识的理解,并对滤波器有了更进一步的认识,掌握了滤波器在双音多频信号解码中的应用方法,理解了设计指标的工程概念,认识到了不同类型滤波器的特性和适用范围。
实验中,我们对Matlab中一些函数的用法还不清楚,后面经过查资料以及尝试后均得到了解决。
总的来说,本次实验基本上达到了预期的实验效果,是一次比较成功的实验。