首先插入图片
这是设计的GUI界面
代码部分:
function start_Callback(hObject, eventdata, handles)
ap= str2double(get(handles.ap_input, 'String'));%进行参数的读取
as= str2double(get(handles.as_input, 'String'));
fb1=str2double(get(handles.fb1_input,'String'));
fc1=str2double(get(handles.fc1_input,'String'));
fb2=str2double(get(handles.fb2_input,'String'));
fc2=str2double(get(handles.fc2_input,'String'));
noise=str2double(get(handles.noise, 'String'));
IIR_select=2;
music=(get(handles.music,'String')); %获取声音信号的来源
[y,fs]=audioread(music); %音频信号采样
y=y(:,1); %x这个矩阵中取出第一列赋给x
if(noise>0) %加入噪声
y=awgn(y,20*log(noise) );
end
n=length(y); %求得语音信号的序列长度
N_point=n; %记录fft的采样点
xn=(0:n-1);
T=1/fs; %记录采样周期
axes(handles.Time_origin_axes); %确定画图区域
plot(xn/fs,y,'r'); %画出原始信号的时域波形
backColor =[0 0 0]; %更改背景色为黑色
set(gca,'color',backColor);
grid on; %画出网格线
xlabel('时间');
ylabel('幅值');
N=n;
xK=fft(y,N); %原始信号进行fft
xK=abs(xK); %求得原始信号的频谱绝对值
axes(handles.Fre_origin_axes); %确定画图区域
plot(xn*fs/N_point,xK,'r');%使得单位为HZ,F=fs/N_point求得频域采样间隔,频域分辨率
backColor =[0 0 0]; %更改背景色为黑色
set(gca,'color',backColor);
grid on;
axis([0,5000,0,100]);
xlabel('频率');
ylabel('幅值');
str=get( handles.filter_select,'Value'); %读取弹出式菜单的数据
IIR_select=get( handles.IIR,'Value');
switch str %确定滤波器类型
case 1 %IIR低通,
wp=2*atan(pi*fb1*T)/pi; %模拟域频率向数字域频率的转换,通带截止频率
ws=2*atan(pi*fc1*T)/pi; %阻带截止频率
if(IIR_select==1)%椭圆滤波器
[N,Wc] =ellipord(wp,ws,ap,as); %计算数字滤波器的阶数N和3dB通带截止频率
[Bz,Az]=ellip(N,ap,as,Wc); %数字滤波器系统函数分子分母多项式系数向量Bz分子,分母
else %巴特沃斯滤波器
[N,Wc] =buttord(wp,ws,ap,as); %计算数字滤波器的阶数N和3dB通带截止频率
[Bz,Az]=butter(N,Wc); %数字滤波器系统函数分子分母多项式系数向量Bz分子,分母
end
[H,w] =freqz(Bz,Az,N_point,fs);%求得滤波器频谱,横轴为频率
H=abs(H); %求得滤波器幅频特性
axes(handles.filter_axes); %确定显示界面
plot(w,20*log(H),'r'); %画低通滤波器频谱
set(gca,'color',backColor); %更改背景色
grid on;
axis([0,5000,-500,1]);
xlabel('频率:HZ');
ylabel('幅值');
Y=filter(Bz,Az,y); %对原始信号进行低通滤波
case 2 %IIR高通
wp=2*atan(pi*fb1*T)/pi; %模拟域频率向数字域频率的转换,通带截止频率
ws=2*atan(pi*fc1*T)/pi;
if(IIR_select==1)%椭圆滤波器
[N,Wc] =ellipord(wp,ws,ap,as);
[Bz,Az]=ellip(N,ap,as,Wc,'high'); %数字滤波器系统函数分子分母多项式系数向量Bz分子,分母
else %巴特沃斯滤波器
[N,Wc] =buttord(wp,ws,ap,as);
[Bz,Az]=butter (N,Wc,'high'); %数字滤波器系统函数分子分母多项式系数向量Bz分子,分母
end
[H,w] =freqz(Bz,Az,N_point,fs);
H=abs(H);
axes(handles.filter_axes);
plot(w,20*log(H),'r');
set(gca,'color',backColor);
grid on;
axis([0,5000,-500,1]);
xlabel('频率:HZ');
ylabel('幅值');
Y=filter(Bz,Az,y);
case 3 %IIR带通
wp=[2*atan(pi*fb1*T)/pi,2*atan(pi*fb2*T)/pi];
ws=[2*atan(pi*fc1*T)/pi,2*atan(pi*fc2*T)/pi];
if(IIR_select==1)%椭圆滤波器
[N,Wc] =ellipord(wp,ws,ap,as);
[Bz,Az]=ellip(N,ap,as,Wc);
else %巴特沃斯滤波器
[N,Wc] =buttord(wp,ws,ap,as); %计算数字滤波器的阶数N和3dB通带截止频率
[Bz,Az]=butter(N,Wc); %数字滤波器系统函数分子分母多项式系数向量Bz分子,分母
end
[H,w] =freqz(Bz,Az,N_point,fs);
H=abs(H);
axes(handles.filter_axes);
plot(w,20*log(H),'r');
set(gca,'color',backColor);
grid on;
axis([0,5000,-500,1]);
xlabel('频率:HZ');
ylabel('幅值');
Y=filter(Bz,Az,y);
case 4 %FIR低通
wp=2*pi*fb1/fs;
ws=2*pi*fc1/fs;
wcd=(wp+ws)/2/pi;
if(as<70) %哈明窗
N=ceil(6.6*pi/abs(wp-ws)); %取大于等于x的最小整数
hn=fir1((N-1),wcd); %得到实际滤波器h(n)
else %布莱克曼窗
N=ceil(11*pi/abs(wp-ws)); %取大于等于x的最小整数
hn=fir1((N-1),wcd,blackman(N)); %得到实际滤波器h(n)
end
[H,w]=freqz(hn,1,N,fs); %HZ的分子多项式系数,分母多项式系数为1
H=abs(H);
axes(handles.filter_axes);
plot(w,20*log(H),'r');
set(gca,'color',backColor);
grid on;
axis([0,5000,-500,1]);
xlabel('频率: HZ');
ylabel('幅值');
Y=fftfilt(hn,y);
case 5 %FIR高通
wp=2*pi*fb1/fs;
ws=2*pi*fc1/fs;
wcd=(wp+ws)/2/pi;
if(as<70) %哈明窗
N=ceil(6.6*pi/abs(wp-ws)); %取大于等于x的最小整数
if(mod(N,2)==0)
N=N+1;
end %高通滤波器N必须为奇数
hn=fir1((N-1),wcd,'high'); %得到实际滤波器h(n)
else % 布莱克曼窗
N=ceil(11*pi/abs(wp-ws)); %取大于等于x的最小整数
if(mod(N,2)==0)
N=N+1;
end %高通滤波器N必须为奇数
hn=fir1((N-1),wcd,'high',blackman(N)); %得到实际滤波器h(n)
end
[H,w]=freqz(hn,1,N,fs); %HZ的分子多项式系数,分母多项式系数为1
H=abs(H);
axes(handles.filter_axes);
plot(w,20*log(H),'r');
set(gca,'color',backColor);
grid on;
axis([0,5000,-500,1]);
xlabel('频率: HZ');
ylabel('幅值');
Y=fftfilt(hn,y);
case 6 %FIR带通
wp=[2*pi*fb1/fs,2*pi*fb2/fs];
ws=[2*pi*fc1/fs,2*pi*fc2/fs];
wcd=[(wp(1)+ws(1))/2/pi,(wp(2)+ws(2))/2/pi];
if(as<70) %哈明窗
N=ceil(6.6*pi/abs(wp(1)-ws(1))); %取大于等于x的最小整数
if(mod(N,2)==0)
N=N+1;
end %高通滤波器N必须为奇数
hn=fir1((N-1),wcd); %得到实际滤波器h(n)
else %布莱克曼窗
N=ceil(11*pi/abs(wp(1)-ws(1))); %取大于等于x的最小整数
if(mod(N,2)==0)
N=N+1;
end %高通滤波器N必须为奇数
hn=fir1((N-1),wcd,blackman(N)); %得到实际滤波器h(n)
end
[H,w]=freqz(hn,1,N,fs); %HZ的分子多项式系数,分母多项式系数为1
H=abs(H);
axes(handles.filter_axes);
plot(w,20*log(H),'r');
set(gca,'color',backColor);
grid on;
axis([0,5000,-500,1]);
xlabel('频率: HZ');
ylabel('幅值');
Y=fftfilt(hn,y);
end
YK=fft(Y); %对滤波之后的信号取得频域值
n= 0:length(y)-1;
t=(0:length(y)-1)/fs;
axes(handles.Time_now_axes);%确定图片所在的坐标
plot(t,Y,'r');
set(gca,'color',backColor);%背景填充
xlabel('时间/t');
ylabel('幅值');
axes(handles.Fre_now_axes); %确定图片所在的坐标
plot(n*fs/N_point,abs(YK),'r');%使得单位为HZ,F=fs/N_point求得频域采样间隔,频域分辨率
set(gca,'color',backColor);
grid on;
xlabel('频率/Hz');
ylabel('幅值');
axis([0,5000,0,100]); %限制界面宽度
P=audioplayer(Y*10,fs); %播放音乐.
playblocking(P, [0 (get(P, 'SampleRate') * 3)]);