DTMF信号滤出单音
matlab程序如下
如有错误欢迎指正。
f1=852;f2=1336;%选择数字8 IIR巴特沃斯带通设计
N=1024;n=0:N-1;f=8000;T=1/f;xn=n*T;%N一般取2的整数次方 在减少计算量为由N取的较少。
fk=n/N*8000;
x=sin(2*pi*f1*xn)+sin(2*pi*f2*xn);%DTMF时域信号
wpz1=2*[(f1-20)/f,(f1+20)/f];
wsz1=2*[(f1-80)/f,(f1+80)/f];Rp=1;As=20;%这里的幅度失真Rp和衰减As因为没给出要求,我多次试验,选此参数效果较好。
[N1,wc1]=buttord(wpz1,wsz1,Rp,As);[B1,A1]=butter(N1,wc1);%设计的低频信号的带通滤波器
wpz2=2*[(f2-20)/f,(f2+20)/f];
wsz2=2*[(f2-80)/f,(f2+80)/f];[N2,wc2]=buttord(wpz2,wsz2,Rp,As);[B2,A2]=butter(N2,wc2);
%设计的高频信号的带通滤波器
[h,w]=freqz(B1,A1,256,f);
h=20*log10(abs(h));
figure;
plot(w,h);title('所设计的滤波器的通带曲线');grid on;
figure;
subplot(3,2,1);plot(fk,x);grid on;
title('DTMF的时域波形');
subplot(3,2,2);fft1=fft(x,N);%对原始信号进行离散快速傅里叶,将信号变换到频域。
plot(fk,abs(fft1));
grid on;%abs(fft1)用于画频谱
title('DTMF的信号频谱');
y1=filter(B1,A1,x);%把x经过设计的低频分量带通数字滤波器滤波
subplot(3,2,3);plot(fk,y1);grid on;
title('提取的852Hz信号的时域波形');
subplot(3,2,4);
fft2=fft(y1,N);%对原始信号进行离散快速傅里叶,将信号变换到频域。
plot(fk,abs(fft2));grid on;
title('提取的852Hz信号频谱');
y2=filter(B2,A2,x);%把x经过设计的高频分量带通数字滤波器滤波
subplot(3,2,5);plot(fk,y2);
grid on;
%abs(fft2)用于画频谱
title('提取的1366Hz信号的时域波形');
subplot(3,2,6);
fft3=fft(y2,N);%对原始信号进行离散快速傅里叶变换,将信号变换到频域。
plot(fk,abs(fft3));
grid on; %abs(fft3)用于画频谱
title('提取的1366Hz信号频谱');