基于matlab的语音信号处理

首先插入图片
在这里插入图片描述 这是设计的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)]);
 
  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值