Matlab:FIR滤波器设计和音频信号滤波去噪
1. 窗函数法
[x,fs,bits]=wavread('test01.wav');
%sound(x,fs,bits); %按指定的采样率和每样本编码位数回放
N=length(x) % 计算信号x的长度
fn=1900;
t=0:1/fs:(N-1)/fs; % 计算时间范围,样本数除以采样频率
x=x(:,1);
x=x';
y=x+ 0.1*sin(fn*2*pi*t);
%sound(y,fs,bits); % 应该可以明显听出有尖锐的单频啸叫声X=abs(fft(x)); Y=abs(fft(y)); % 对原始信号和加噪信号进行fft变换
X=X(1:length(X)/2); Y=Y(1:length(Y)/2); %截取前半部分
deltaf=fs/2/length(X); %计算频谱的谱线间隔
f=0:deltaf:fs/2-deltaf; %计算频谱频率范围
figure (1);
subplot(2,2,1);plot(t,x);grid on;
xlabel('时间');ylabel('原始信号');
subplot(2,2,2);plot(f,X);grid on;
xlabel('频率');ylabel('原始信号频谱');
subplot(2,2,3);plot(t,y);grid on;
xlabel('时间');ylabel('加入的噪声信号');
subplot(2,2,4);plot(f,Y);grid on;
xlabel('频率');ylabel('加入的噪声信号频谱');fpd=1800;fsd=1850;fsu=1950;fpu=2000;Rp=1;As=100; %带阻滤波器设计指标
fcd=(fpd+fsd)/2;fcu=(fpu+fsu)/2;
df=min((fsd-fpd),(fpu-fsu)); %计算上下带中心频率和频率间隔
% 将Hz为单位的模拟频率换算为rad为单位的数字频率
wcd=fcd/fs*2*pi;wcu=fcu/fs*2*pi;dw=df/fs*2*pi;
wsd=fsd/fs*2*pi;wsu=fsu/fs*2*pi;
M=ceil(15.4*pi/dw)+1; %计算nuttallwin窗设计该滤波器时需要的阶数
n=0:M-1; %定义时间范围
w_ham= nuttallwin (M); %产生M阶的nuttallwin窗
M
size(w_ham)
hd_bs=ideal_lp(wcd,M)+ideal_lp(pi,M)-ideal_lp(wcu,M);
% 调用自编函数计算理想带阻滤波器的脉冲响应
h_bs=w_ham'.*hd_bs; %用窗口法计算实际滤波器脉冲响应
size(h_bs)
[db,mag,pha,grd,w]=freqz_m(h_bs,1); %调用自编函数计算滤波器的频率特性
figure (2);
subplot(2,2,1);plot(w,db); grid on;
xlabel('频率');ylabel('db');
subplot(2,2,2);plot(w,mag); grid on;
xlabel('频率');ylabel('幅度');
subplot(2,2,3);plot(w,pha); grid on;
xlabel('频率');ylabel('相位');
subplot(2,2,4);plot(h_bs);grid on;
xlabel('频率');ylabel('滤波器脉冲响应');y_fil=fftfilt(h_bs,y); %用设计好的滤波器对y进行滤波
Y_fil=abs(fft(y_fil));Y_fil=Y_fil(1:length(Y_fil)/2); %计算频谱取前一般
figure (3);
subplot(3,2,1);plot(t,x);grid on;
xlabel('时间');ylabel('时域原始信号');title('时域原始信号');
subplot(3,2,2);plot(f,X);grid on;
2. 频率取样法
%频率取样法设计FIR滤波器
[x,fs,bits]=wavread('test01.wav');
%sound(x,fs,bits); %按指定的采样率和每样本编码位数回放
N=length(x) % 计算信号x的长度
fn=1900;
t=0:1/fs:(N-1)/fs; % 计算时间范围,样本数除以采样频率
x=x(:,1);
x=x';
y=x+ 0.1*sin(fn*2*pi*t);
%sound(y,fs,bits); % 应该可以明显听出有尖锐的单频啸叫声X=abs(fft(x)); Y=abs(fft(y)); % 对原始信号和加噪信号进行fft变换
X=X(1:length(X)/2); Y=Y(1:length(Y)/2); %截取前半部分
deltaf=fs/2/length(X); %计算频谱的谱线间隔
f=0:deltaf:fs/2-deltaf; %计算频谱频率范围
figure;
subplot(2,2,1);plot(t,x);grid on;
xlabel('时间');ylabel('原始信号');
subplot(2,2,2);plot(f,X);grid on;
xlabel('频率');ylabel('原始信号频谱');
subplot(2,2,3);plot(t,y);grid on;
xlabel('时间');ylabel('加入的噪声信号');
subplot(2,2,4);plot(f,Y);grid on;
xlabel('频率');ylabel('加入的噪声信号频谱');fpd=1800;fsd=1850;fsu=1950;fpu=2000;Rp=1;As=100; %带阻滤波器设计指标
fcd=(fpd+fsd)/2;fcu=(fpu+fsu)/2;
df=min((fsd-fpd),(fpu-fsu)); %计算上下带中心频率和频率间隔
% 构造带阻滤波器
M=3396;L=(M+mod(M,2))/2;
wsd=fsd/fs;wsu=fsu/fs;
F=[0:1/L:1];%F长度是length(L)+1
A=[ones(1,fix(wsd*M)), zeros(1,fix(wsu*M)-fix(wsd*M)), ones(1,L+1-fix(wsu*M))];
%fir2函数——频率抽样法构造带阻滤波器
B=fir2(M,F,A);
[db,mag,pha,grd,w]=freqz_m(B,1); %调用自编函数计算滤波器的频率特性
figure (2);
subplot(2,2,1);plot(w,db); grid on;
xlabel('频率');ylabel('db');
subplot(2,2,2);plot(w,mag); grid on;
xlabel('频率');ylabel('幅度');
subplot(2,2,3);plot(w,pha); grid on;
xlabel('频率');ylabel('相位');
subplot(2,2,4);plot(h_bs);grid on;
xlabel('频率');ylabel('滤波器脉冲响应');y_fil=fftfilt(B,y); %用设计好的滤波器对y进行滤波
Y_fil=abs(fft(y_fil));Y_fil=Y_fil(1:length(Y_fil)/2); %计算频谱取前一般
figure;
subplot(3,2,1);plot(t,x);grid on;
xlabel('时间');ylabel('时域原始信号');title('时域原始信号');
subplot(3,2,2);plot(f,X);grid on;
xlabel('频率');ylabel('原始信号频谱');title('原始信号频谱');
subplot(3,2,3);plot(t,y);grid on;
xlabel('时间');ylabel('加噪信号');title('加噪信号');
subplot(3,2,4);plot(f,Y);grid on;
xlabel('频率');ylabel('加噪信号频谱');title('加噪信号频谱');
subplot(3,2,5);plot(t,y_fil);grid on;
xlabel('时间');ylabel('滤波信号');title('滤波信号');
subplot(3,2,6);plot(f,Y_fil);grid on;
xlabel('频率');ylabel('滤波信号频谱');title('滤波信号频谱');
sound (y_fil,fs,bits); %应该可以听到与原语音信号基本相似的语音
3. 最优等波纹设计法
%等波纹契比雪夫逼近法设计FIR滤波器
clc;clear;
[x,fs,bits]=wavread('test01.wav');
%sound(x,fs,bits); %按指定的采样率和每样本编码位数回放
N=length(x) % 计算信号x的长度
fn=1900;
t=0:1/fs:(N-1)/fs; % 计算时间范围,样本数除以采样频率
x=x(:,1);
x=x';
y=x+ 0.1*sin(fn*2*pi*t);
%sound(y,fs,bits); % 应该可以明显听出有尖锐的单频啸叫声X=abs(fft(x)); Y=abs(fft(y)); % 对原始信号和加噪信号进行fft变换
X=X(1:length(X)/2); Y=Y(1:length(Y)/2); %截取前半部分
deltaf=fs/2/length(X); %计算频谱的谱线间隔
f=0:deltaf:fs/2-deltaf; %计算频谱频率范围
figure (1);
subplot(2,2,1);plot(t,x);grid on;
xlabel('时间');ylabel('原始信号');
subplot(2,2,2);plot(f,X);grid on;
xlabel('频率');ylabel('原始信号频谱');
subplot(2,2,3);plot(t,y);grid on;
xlabel('时间');ylabel('加入的噪声信号');
subplot(2,2,4);plot(f,Y);grid on;
xlabel('频率');ylabel('加入的噪声信号频谱');rp = 3;
rs = 40;
fv = [1800 1850 1950 2000];
a = [1 0 1];
dev = [(10^(rp/20)-1)/(10^(rp/20)+1) 10^(-rs/20) (10^(rp/20)-1)/(10^(rp/20)+1)];
[n, fo, ao, w] = firpmord(fv,a,dev,fs);
n
h_bs = firpm(n, fo, ao, w);
size(h_bs)
[db,mag,pha,grd,w]=freqz_m(h_bs,1); %调用自编函数计算滤波器的频率特性
figure (2);
subplot(2,2,1);plot(w,db); grid on;
xlabel('频率');ylabel('db');
subplot(2,2,2);plot(w,mag); grid on;
xlabel('频率');ylabel('幅度');
subplot(2,2,3);plot(w,pha); grid on;
xlabel('频率');ylabel('相位');
subplot(2,2,4);plot(h_bs);grid on;
xlabel('频率');ylabel('滤波器脉冲响应');y_fil=fftfilt(h_bs,y); %用设计好的滤波器对y进行滤波
Y_fil=abs(fft(y_fil));Y_fil=Y_fil(1:length(Y_fil)/2); %计算频谱取前一般
figure (3);
subplot(3,2,1);plot(t,x);grid on;
xlabel('时间');ylabel('时域原始信号');title('时域原始信号');
subplot(3,2,2);plot(f,X);grid on;
xlabel('频率');ylabel('原始信号频谱');title('原始信号频谱');
subplot(3,2,3);plot(t,y);grid on;
xlabel('时间');ylabel('加噪信号');title('加噪信号');
subplot(3,2,4);plot(f,Y);grid on;
xlabel('频率');ylabel('加噪信号频谱');title('加噪信号频谱');
subplot(3,2,5);plot(t,y_fil);grid on;
xlabel('时间');ylabel('滤波信号');title('滤波信号');
subplot(3,2,6);plot(f,Y_fil);grid on;
xlabel('频率');ylabel('滤波信号频谱');title('滤波信号频谱');
sound (y_fil,fs,bits); %应该可以听到与原语音信号基本相似的语音
Matlab:FIR滤波器设计和音频信号滤波去噪相关推荐
- [Matlab]FIR滤波器设计:(基本窗函数FIR滤波器设计)
[Matlab]FIR滤波器设计:(基本窗函数FIR滤波器设计) IIR滤波器主要设计方法先设计一个模拟低通滤波器,然后把它转化为形式上的数字滤波器.但对于FIR滤波器来说,设计方法的关键要求之一 ...
- [Matlab]FIR滤波器设计:(线性相位滤波器的特性)
[Matlab]FIR滤波器设计:(线性相位FIR滤波器的特性) FIR滤波器能够在保证幅度特性满足技术要求的同时,容易实现严格的线性相位特性,且FIR滤波器的单位抽样响应是有限长的,因而滤波器一 ...
- [Matlab]FIR滤波器设计:(FIR滤波器的结构)
[Matlab]FIR滤波器设计:(FIR滤波器的结构) FIR(Finite Impulse Response)滤波器:有限长单位冲激响应滤波器,又称为非递归型滤波器,是一种在数字信号领域应用非常广 ...
- FIR滤波器设计(包括Verilog HDL设计以及MATLAB设计)
FIR滤波器设计 滤波器原理:滤波器就是对特定的频率或者特定频率以外的频率进行消除的电路,被广泛用于通信系统和信号处理系统中.从功能角度,数字滤波器对输入离散信号的数字代码进行运算处理,以达到滤除频带 ...
- fir 低通 matlab,MATLAB常用的FIR滤波器设计方法之窗函数法
FIR滤波器很多工科出身的人都不会陌生,在我们的学习和工作中,也常常需要设计FIR滤波器.因为FIR滤波器有两个特点:滤波器是稳定的以及具有线性相位.FIR滤波器在信号处理相关领域当然也包括本人所在的 ...
- 基于fpga的fir滤波器设计,通过matlab代码设计滤波器参数,最终通过fpga实现
基于fpga的fir滤波器设计,通过matlab代码设计滤波器参数,最终通过fpga实现,modelsim仿真,最后在开发板上实现,两路adc采集的掺杂高频信号经过低通滤波器之后,由dac输出,由si ...
- fir滤波器等纹波matlab,基于Matlab的FIR滤波器设计与实现
基于Matlab的FIR滤波器设计与实现 一.摘要 前面一篇文章介绍了通过FDATool工具箱实现滤波器的设计,见"基于Matlab中FDATool工具箱的滤波器设计及相关文件的生成&quo ...
- 低通采样的matlab实现,基于matlab的FIR滤波器设计(低通,频率取样法)
基于matlab的FIR滤波器设计(低通,频率取样法)一.参考程序 M=63;%所需频率采样点个数 Wp=0.5*pi;%通带截止频率 m=0:(M+1)/2;%通频带上的采样点 Wm=2*pi*m. ...
- matlab滤波器设计工具箱带阻滤波器,用matlab信号处理工具箱进行fir滤波器设计的三种方法...
用matlab信号处理工具箱进行fir滤波器设计的三种方法 摘 要 介绍了利用 MATLAB 信号处理工具箱进行 FIR 滤波器设计的三种方法:程序设计法. FDATool 设计法和 SPTool 设 ...
最新文章
- 使用Valgrind的callgrind做c/c++代码的code profiling/性能调优
- liferay7.0 mysql_Liferay7 BPM门户开发之6: Activiti数据库换为mysql
- jquery给元素添加样式表的方法
- python发人人状态
- presume_presume是什么意思_presume中文意思_presume英译汉_英汉词典
- PoseNet: A Convolutional Network for Real-Time 6-DOF Camera Relocalization
- Java nginx 双向ssl_nginx配置ssl双向验证 nginx https ssl证书配置
- 搜索服务Elasticsearch与Solr比较
- 《敏捷制造——敏捷集成基础结构设计》——2.3 集成基础结构数据访问模型
- 2021年最佳开源软件榜单出炉!
- 制服流氓中搜网络猪的办法
- windows 如何录制电脑自身内部的声音,无需 (Stereo mix )立体声混合选项
- PS 剪切图片到指定大小
- Mackbook 外接移动硬盘无法写入数据(三种解决办法)
- 网络硬件三剑客集线器交换机路由器
- 简单工厂、工厂方法、抽象工厂
- 2.OrientDB连接操作
- 微信小程序小打卡前端获取
- 【电脑】——有线网卡驱动异常不可用
- C++:操作PDFlib库实例(附完整源码)