📄 jin.m
字号:
%---First Step---%
%---------------------------利用函数wavread对语音信号的采集--------------------------------%
close all;
i=1;
[x,fs,bits]=wavread('my voice.wav'); %,x:语音数据;fs:采样频率;bits:采样点数
sound(x,fs,bits); %话音回放
N=length(x);
n=0:N-1;
figure(i);
plot(n,x); %画出原始语音信号的波形
xlabel('n');
ylabel('x(n)');
title('原始语音信号');
%---Second Step---%
%----------------------------语音信号的FFT频谱分析-------------------------%
f=fft(x,N); %对语音号进行快速傅里叶变换,得出频谱
i=i+1;
figure(i);
plot(abs(n),abs(f));
xlabel('k');
ylabel('|y(k)|');
title('FFT后的波形');
%---Third Step---%
%----------------用kaiser窗函数法设计FIR数字滤波器---------------------%
p=1;
while(p);
temp=menu('请选择FIR滤波器的类型','LowPass','HighPass','BandPass');
i=i+1;
figure(i);
switch(temp)
case 1
%--------------------------设计FIRLowPass--------------------------------%
Wp=2*pi*1000/fs; %通带频率数字指标
Ws=2*pi*1200/fs; %阻带频率数字指标
w1=Ws-Wp; %过渡带宽
N2=ceil((100-7.95)/(2.286*w1)); %求出FIR滤波器的阶数 ceil:朝正无穷方向舍入
beita=0.1102*(100-8.7); %由阻带最小衰减指标确定形状参数beita
wn1=(Ws+Wp)/2; %理想截止频率
k=fir1(N2,wn1/pi,kaiser(N2+1,10.056)); %使用标准频率响应的加窗设计函数fir1设计LowPass滤波器
[H,f]=freqz(k,1,512,fs); %求出数字滤波器频率响应
plot(f,20*log10(abs(H))); %FIR低通滤波器衰减特性
xlabel('频率/Hz');
ylabel('振幅/dB');
grid on;
axis([0,5000,-200,10]);
title('FIR低通滤波器衰减特性');
%----------滤波前后波形比较--------------------------------%
i=i+1;
figure(i);
z=fftfilt(k,x); %利用函数fftfilt对信号进行滤波
subplot(2,2,1);
plot(n,x); %画出原语音信号的波形
xlabel('n');
ylabel('x(n)');
title('原始语音信号');
subplot(2,2,3);
plot(n,z); %FIRLowPass后的波形
title('FIRLowPass后的波形');
%-----------滤波前后语音信号频谱---------------------
subplot(2,2,2);
[H,f]=freqz(x,1,512,fs);
plot(f,20*log10(abs(H))); %滤波前语音信号频谱
xlabel('频率/Hz');
ylabel('振幅/dB');
title('FIRLowPass前语音信号频谱');
grid on;
subplot(2,2,4);
[H,f]=freqz(z,1,512,fs);
plot(f,20*log10(abs(H))); %滤波后语音信号频谱
xlabel('频率/Hz');
ylabel('振幅/dB');
title('FIRLowPass后语音信号频谱');
grid on;
sound(z,fs,bits); %播放滤波后的语音
case 2
%----------------------------设计FIRHighPass----------------------------%
Wp=2*pi*4800/fs; %通带频率数字指标
Ws=2*pi*5000/fs; %阻带频率数字指标
Wdelta=Ws-Wp; %过渡带宽
Wc=(Wp+Ws)/2; %理想截止频率
N1=12.8*pi/Wdelta; %求出FIR滤波器的阶数
N3=ceil(N1); %N3朝N1正无穷方向舍入
d=fir1(N3,Wc/pi,'high',kaiser(N3+1,10.056)); %使用标准频率响应的加窗设计函数fir1设计HighPass滤波器
[H,f]=freqz(d,1,512,fs); %求出数字滤波器频率响应
plot(f,20*log10(abs(H))); %画出FIRHighPass衰减特性
xlabel('频率/Hz');
ylabel('振幅/dB');
grid on;
axis([2000,8000,-180,20]);
title('FIRHighPass器衰减特性');
%----------滤波前后波形比较----------------------
i=i+1;
figure(i);
z=fftfilt(d,x); %利用函数fftfilt对信号进行滤波
subplot(2,2,1);
plot(n,x); %画出原语音信号的波形
xlabel('n');
ylabel('x(n)');
title('原始语音信号');
subplot(2,2,3);
plot(n,z); %FIRHighPass后的波形
title('FIRHighPass后的波形');
%-----------滤波前后语音信号频谱---------------------%
subplot(2,2,2);
[H,f]=freqz(x,1,512,fs);
plot(f,20*log10(abs(H))); %滤波前语音信号频谱
xlabel('频率/Hz');
ylabel('振幅/dB');
title('FIRHighPass前语音信号频谱');
grid on;
subplot(2,2,4);
[H,f]=freqz(z,1,512,fs);
plot(f,20*log10(abs(H))); %滤波后语音信号频谱
xlabel('频率/Hz');
ylabel('振幅/dB');
title('FIRHighPass后语音信号频谱');
grid on;
sound(z,fs,bits);
case 3
%-----------------------------设计FIRBandPass----------------------------------%
wp1=2*pi*1000/fs; %通带频率数字指标
ws1=2*pi*1200/fs; %阻带频率数字指标
wp2=2*pi*3000/fs;
ws2=2*pi*3200/fs;
wc1=(wp1+ws1)/2; %理想截止频率
wc2=(wp2+ws2)/2;
wc=[wc1,wc2];
Wdelta=ws1-wp1; %过渡带宽
N2=12.8*pi/Wdelta;
N3=ceil(N2);
k=fir1(N3,wc/pi,kaiser(N3+1,10.056));
z=fftfilt(k,x);
[H,f]=freqz(k,1,512,fs);
plot(f,20*log10(abs(H))); %画出FIR带通滤波器衰减特性
xlabel('频率/Hz');
ylabel('振幅/dB');
grid on;
axis([0,5000,-180,20]);
title('FIR带通滤波器衰减特性');
%----------滤波前后波形比较----------------------%
i=i+1;
figure(i);
z=fftfilt(k,x);
subplot(2,2,1);
plot(n,x); %画出原语音信号的波形
xlabel('n');
ylabel('x(n)');
title('原始语音信号');
subplot(2,2,3);
plot(n,z); %FIR带通滤波后的波形
title('FIRBandPass后的波形');
%-----------滤波前后语音信号频谱---------------------%
subplot(2,2,2);
[H,f]=freqz(x,1,512,fs);
plot(f,20*log10(abs(H))); %滤波前语音信号频谱
xlabel('频率/Hz');
ylabel('振幅/dB');
title('FIRBandPass前语音信号频谱');
grid on;
subplot(2,2,4);
[H,f]=freqz(z,1,512,fs);
plot(f,20*log10(abs(H))); %滤波后语音信号频谱
xlabel('频率/Hz');
ylabel('振幅/dB');
title('FIRBandPass后语音信号频谱');
grid on;
sound(z,fs,bits);
end
p=menu('Do you want To Continue?','Yes','No');
if p==2
p=0;
end
end
%---Third Step---%
%-------------------------------------设计IIR数字滤波器--------------------------------------%
p=1;
while(p)
i=i+1;
figure(i);
temp=menu('请选择IIR滤波器的类型','LowPass','HighPass','BandPass');
switch(temp)
case 1
%-----------------------------设计LowPass----------------------------------%
wp=2*pi*1000/fs;
ws=2*pi*1200/fs;
Rp=1;
Rs=100;
Ts=1/fs;
Wp=2/Ts*tan(wp/2);Ws=2/Ts*tan(ws/2); %按频率转换公式进行转换
[N,Wn]=ellipord(Wp,Ws,Rp,Rs,'s'); %计算模拟滤波器的最小阶数
[z,p,k]=ellipap(N,Rp,Rs); %设计模拟原型滤波器
[Bap,Aap]=zp2tf(z,p,k); %零点极点增益形式转换为传递函数形式
[b,a]=lp2lp(Bap,Aap,Wn); %低通转换为低通滤波器的频率转化
[bz,az]=bilinear(b,a,fs); %运用双线性变换法得到数字滤波器传递函数
[H,f]=freqz(bz,az,512,fs);
plot(f,20*log10(abs(H)));
axis([0,5000,-150,10]);
title('N=10 频率响应'); %画出LowPass的幅频和相频特性
grid on;
%----------滤波前后波形比较----------------------
i=i+1;
figure(i);
y=filter(bz,az,x);
subplot(2,2,1);
plot(n,x); %画出原语音信号的波形
xlabel('n');
ylabel('x(n)');
title('原始语音信号');
subplot(2,2,3);
plot(n,y); %IIRLowPass后的波形
title('IIRLowPass后的波形');
%-----------滤波前后语音信号频谱---------------------
subplot(2,2,2);
[H,f]=freqz(x,1,512,fs);
plot(f,20*log10(abs(H))); %滤波前语音信号频谱
xlabel('频率/Hz');
ylabel('振幅/dB');
title('IIR低通滤波前语音信号频谱');
grid on;
subplot(2,2,4);
[H,f]=freqz(y,1,512,fs);
plot(f,20*log10(abs(H))); %滤波后语音信号频谱
xlabel('频率/Hz');
ylabel('振幅/dB');
title('IIR低通滤波后语音信号频谱');
grid on;
sound(y,fs,bits);
case 2
%--------------------------设计HighPass-------------------------------%
fs1=60000; %信号重采样
x1=resample(x,fs1,fs);
N2=length(x1);
n1=0:N2-1;
Rp=1;
Rs=100;
fb=5000;fc=4800;
fn=fs1/2;
bishape=inline('2*fs*tan(f*2*pi/2/fs)/2/pi','f','fs');
[m,wn]=ellipord(fb ,fc ,1,100,'s');
[b,a]=ellip(m,1,100,bishape(fb,fs1)*2*pi,'high','s'); %椭圆模拟高通滤波
[bz,az]=bilinear(b,a,fs1); %双线性模拟到数字变换
[H,f]=freqz(bz,az,512,fs1);
plot(f,20*log10(abs(H)));
axis([0,10000,-150,10]);
xlabel('频率/Hz');ylabel('振幅/dB');
title('IIR高通滤波器衰减特性');
grid on;
%----------滤波前后波形比较----------------------
i=i+1;
figure(i);
y=filter(bz,az,x1);
subplot(2,2,1);
plot(n1,x1); %画出原语音信号的波形
xlabel('n');
ylabel('x(n)');
title('原始语音信号');
subplot(2,2,3);
plot(n1,y); %IIR高通滤波后的波形
title('IIRHighPass后的波形');
%-----------滤波前后语音信号频谱---------------------
subplot(2,2,2);
[H,f]=freqz(x1,1,512,fs1);
plot(f,20*log10(abs(H))); %滤波前语音信号频谱
xlabel('频率/Hz');
ylabel('振幅/dB');
title('IIRHighPass前语音信号频谱');
grid on;
subplot(2,2,4);
[H,f]=freqz(y,1,512,fs1);
plot(f,20*log10(abs(H))); %滤波后语音信号频谱
xlabel('频率/Hz');
ylabel('振幅/dB');
title('IIRHighPass后语音信号频谱');
grid on;
sound(y,fs1,bits);
case 3
%--------------------------设计BandPass-----------------------------------%
fs1=8000;
x1=resample(x,fs1,fs);
N2=length(x1);
n1=0:N2-1;
fc=[1000 3200];
fb=[1200 3000];
fn=fs/2;
bishape=inline('2*fs*tan(f*2*pi/2/fs)/2/pi','f','fs');
[N,wn]=ellipord(fb ,fc ,1,100,'s');
[b,a]=ellip(N,1,100,bishape(fb,fs1)*2*pi,'s'); %模拟带通滤波
[bz,az]=bilinear(b,a,fs1); %双线性模拟到数字变换
[H,f]=freqz(bz,az,512,fs1);
plot(f,20*log10(abs(H)));
axis([0,6000,-150,10]);
xlabel('频率/Hz');ylabel('振幅/dB');
title('IIR带通滤波器衰减特性');
grid on;
%----------滤波前后波形比较----------------------
i=i+1;
figure(i);
y=filter(bz,az,x1);
subplot(2,2,1);
plot(n1,x1); %画出原语音信号的波形
xlabel('n');
ylabel('x(n)');
title('原始语音信号');
subplot(2,2,3);
plot(n1,y); %IIR带通滤波后的波形
title('IIRBandPass后的波形');
%-----------滤波前后语音信号频谱---------------------
subplot(2,2,2);
[H,f]=freqz(x1,1,512,fs1);
plot(f,20*log10(abs(H))); %滤波前语音信号频谱
xlabel('频率/Hz');
ylabel('振幅/dB');
title('IIRBandPass前语音信号频谱');
grid on;
subplot(2,2,4);
[H,f]=freqz(y,1,512,fs1);
plot(f,20*log10(abs(H))); %滤波后语音信号频谱
xlabel('频率/Hz');
ylabel('振幅/dB');
title('IIRBandPass后语音信号频谱');
grid on;
sound(y,fs,bits);
end
p=menu('Do you want To Continue?','Yes','No');
if p==2
p=0;
end
end
temp=menu('Do you want to close all windows','Yes','No');
if temp==1
close all
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -