MATLAB语音FIR滤波器处理

%---------------------------------------------------------- % MATLAB FIR语音滤波 % % Copyright (c) 2011,Edward.xu % zhbit %---------------------------------------------------------- clear all;clc; %语音采样 fs=8000; %取样频率 duration=1; %录音时间 fprintf('Press any key to start %g seconds of recording...\n',duration); pause; fprintf('Recording...\n'); data=wavrecord(duration*fs,fs); %duration*fs 是总的采样点数 fprintf('Finished recording.\n'); fprintf('Press any key to play the recording...\n'); pause; wavplay(data,fs); %FFT变换 fs=8000;N=1024; %采样频率和数据点数 n=0:N-1;t=n/fs; %时间序列 x=data; %信号 y=fft(x,N); %对信号进行快速Fourier变换 mag=abs(y); %求得Fourier变换后的振幅 f=n*fs/N; %频率序列 subplot(331); plot(f,mag); %绘出随频率变化的振幅 axis([0,4000,0,5]); grid; xlabel('频率/Hz'); ylabel('振幅');title('N=1024'); title('原始信号FFT变换频谱'); %FIR低通滤波器 fp=1000; %通带截止频率 fs=1200; %阻带截止频率 At=100; %带外衰减系数(dB) wave=1; %带内纹波系数(dB) mval=[1 0]; %边界处的幅值 fedge=[fp fs]; derta1=1-10^(-wave/20); %δ1的计算 derta2=10^(-At/20); %δ2的计算 dev=[derta1 derta2]; %基本参数δ1与δ2 fs=8000; %FIR采样频率 %参数计算 [N,fpts,mag,wt]=remezord(fedge,mval,dev,fs); %雷米兹交替算法设计最优FIR滤波器 b=remez(N,fpts,mag,wt); %FIR滤波器单位脉冲响应 [h,w]=freqz(b,1,1024); subplot(332); plot(w*(fs/2)/pi,20*log10(abs(h))); grid; xlabel('频率/Hz') ylabel('幅度/dB') title('FIR低通滤波器单位脉冲响应'); %FIR低通滤波器滤波 sf1=filter(b,1,data); subplot(333); fs=8000;N=1024; %采样频率和数据点数 n=0:N-1;t=n/fs; %时间序列 x=sf1; %信号 y=fft(x,N); %对信号进行快速Fourier变换 mag=abs(y); %求得Fourier变换后的振幅 f=n*fs/N; %频率序列 plot(f,mag); %绘出随频率变化的振幅 axis([0,4000,0,5]); grid; xlabel('频率/Hz'); ylabel('振幅');title('N=1024'); title('FIR低通滤波后FFT变换频谱'); fprintf('Press any key to play the FIR LP filter recording...\n'); pause; wavplay(sf1,fs); %FIR高通滤波器单位脉冲响应 fp=2800;fs=3000;Rp=1;As=100; % 滤波器指标 fb=[fp,fs];m=[0,1]; % 计算remezord函数所需参数f,m,dev derta1=1-10^(-Rp/20); %δ1的计算 derta2=10^(-As/20); %δ2的计算 dev=[derta2 derta1]; [n,fo,mo,W]=remezord(fb,m,dev,8000); % 确定remez函数所需参数 hn=remez(n,fo,mo,W); % 调用remez函数进行设计,用于滤除噪声nt中的低频成分 %yt=filter(hn,1,1024); %滤除随机噪声中低频成分,生成高通噪声yt [h,w]=freqz(hn,1,1024); subplot(334); plot(w*(4000)/pi,20*log10(abs(h))); grid; xlabel('频率/Hz') ylabel('幅度/dB') title('FIR高通滤波器单位脉冲响应'); %FIR高通滤波器滤波 sf2=filter(hn,1,data); subplot(335); fs=8000;N=1024; %采样频率和数据点数 n=0:N-1;t=n/fs; %时间序列 x=sf2; %信号 y=fft(x,N); %对信号进行快速Fourier变换 mag=abs(y); %求得Fourier变换后的振幅 f=n*fs/N; %频率序列 plot(f,mag); %绘出随频率变化的振幅 axis([0,4000,0,5]); grid; xlabel('频率/Hz'); ylabel('振幅');title('N=1024'); title('FIR高通滤波后FFT变换频谱'); fprintf('Press any key to play the FIR HP filter recording...\n'); pause; wavplay(sf2,fs); %FIR带通滤波器 fp1=1200; %通带截止频率 fc1=1000; %阻带截止频率 fp2=3000; fc2=3200; At=100; %带外衰减系数(dB) wave=1; %带内纹波系数(dB) mval=[0 1 0]; %边界处的幅值 fedge=[fc1 fp1 fp2 fc2]; derta1=1-10^(-wave/20); %δ1的计算 derta2=10^(-At/20); %δ2的计算 dev=[derta2 derta1 derta2]; %基本参数δ1与δ2 fs=8000; %FIR采样频率 %参数计算 [N,fpts,mag,wt]=remezord(fedge,mval,dev,fs); %雷米兹交替算法设计最优FIR滤波器 b=remez(N,fpts,mag,wt); %FIR滤波器单位脉冲响应 [h,w]=freqz(b,1,1024); subplot(336); plot(w*(fs/2)/pi,20*log10(abs(h))); grid; xlabel('频率/Hz') ylabel('幅度/dB') title('FIR带通滤波器单位脉冲响应'); %FIR带通滤波器滤波 sf3=filter(b,1,data); subplot(337); fs=8000;N=1024; %采样频率和数据点数 n=0:N-1;t=n/fs; %时间序列 x=sf3; %信号 y=fft(x,N); %对信号进行快速Fourier变换 mag=abs(y); %求得Fourier变换后的振幅 f=n*fs/N; %频率序列 plot(f,mag); %绘出随频率变化的振幅 axis([0,4000,0,5]); grid; xlabel('频率/Hz'); ylabel('振幅');title('N=1024'); title('FIR带通滤波后FFT变换频谱'); fprintf('Press any key to play the FIR BP filter recording...\n'); pause; wavplay(sf3,fs);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值