关闭

Matlab:FIR滤波器设计和音频信号滤波去噪

标签: matlabplotfft
12409人阅读 评论(2) 收藏 举报
分类:

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);    %应该可以听到与原语音信号基本相似的语音


4
1
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

用MATLAB信号处理工具箱进行FIR滤波器设计的三种方法

摘  要 介绍了利用MATLAB信号处理工具箱进行FIR滤波器设计的三种方法:程序设计法、FDATool设计法和SPTool设计法,给出了详细的设计步骤,并将设计的滤波器应用到一个混和正弦波信号,以验证滤波器的性能。 关键词  MATLAB,数字滤波器,有限冲激响应,...
  • bruce135lee
  • bruce135lee
  • 2014-08-13 10:15
  • 6749

FIR滤波器的Matlab实现

FIR 滤波器广泛应用于数字信号处理中,主要功能就是将不感兴趣的信号滤除,留下有用信号。FIR滤波器是全零点结构,系统永远稳定;并且具有线性相位的特征,在有效频率范围内所有信号相位上不失真。在无线通信收发机中的DDC/DUC模块,抽取和内插都需要加入滤波器以防止信号在频谱上混叠,最典型的是采用 FI...
  • wordwarwordwar
  • wordwarwordwar
  • 2017-02-22 16:16
  • 1128

FIR滤波器(1)- 基础知识

FIR滤波器广泛应用于数字信号处理中,主要功能就是将不感兴趣的信号滤除,留下有用信号。FIR滤波器是全零点结构,系统永远稳定;并且具有线性相位的特征,在有效频率范围内所有信号相位上不失真。在无线通信收发机中的DDC/DUC模块,抽取和内插都需要加入滤波器以防止信号在频谱上混叠,最典型的是采用FIR滤...
  • xiabodan
  • xiabodan
  • 2014-05-08 20:33
  • 10654

python实现数字滤波器 IIR FIR

import scipy.signal as signal import numpy as np import pylab as pl import matplotlib.pyplot as plt import matplotlib设定滤波器参数 , 创建信号# 某个均衡滤波器的参数 a = np...
  • qq_21970857
  • qq_21970857
  • 2015-06-29 19:46
  • 3560

FIR滤波器设计中的窗函数

使用窗函数的作用在于减少频谱泄漏,由于在实际应用中,通常都是FIR滤波器,这就不能使滤波器的系数达到sinc函数上的无限大的抽样,从而实现在频域的方波形状的低通滤波,人们想到使用窗函数的方法对输入的采样点进行加窗处理。 常用的窗函数有汉宁窗,汉明窗,布莱克慢窗,凯泽窗等。它们的评价指标就在于过渡带宽...
  • qiuchangyong
  • qiuchangyong
  • 2015-10-11 16:24
  • 1934

基于stm32的FIR滤波

这两天有个地方用到了距离传感器,选用的传感器是夏普的近红外距离传感器。后来调试的时候发现传感器出来的信号除了有个随着距离规律变化的直流信号以外还有一个周期为1ms的尖峰脉冲信号形状如下图示 这样的波形会影响采集数据的结果,硬件上已经固定了,所以就选择从软件方面来寻找解决方案。 之前涉及的软件滤波无非...
  • znmdwahaha
  • znmdwahaha
  • 2015-04-14 21:01
  • 2305

FIR数字滤波器设计窗函数法MATLAB仿真(Hamming)

1 matlab源码 f1=100;f2=200;%待滤波正弦信号频率 fs=2000;%采样频率 m=(0.3*f1)/(fs/2);%定义过度带宽 M=round(8/m);%定义窗函数的长度 N=M-1;%定义滤波器的阶数 b=fir1(N,0.5*f2/(fs/2));%使用fir1函数设计...
  • shenziheng1
  • shenziheng1
  • 2016-11-27 21:50
  • 4671

音频噪声抑制(2):维纳(Wiener)滤波器篇

噪声抑制的系列文章。利用维纳滤波器实现噪声抑制。
  • qcyfred
  • qcyfred
  • 2016-12-03 20:07
  • 2553

基于Simulink的FIR滤波器设计与仿真--初识matlab

一直对信号分析与处理有着比较浓厚的兴趣,只可惜数学水平挺一般,难以将兴趣发展为job,因此就蜻蜓点水了。 公司里的几乎人人都会simulink,而我是十足的门外汉。看别人用得行云流水总是挺眼馋的,于是也班门弄斧试试。 实现的功能是将三个幅度都为1初相位0,频率分别为10Hz、20Hz、3...
  • cenzmin
  • cenzmin
  • 2015-03-06 12:57
  • 2608

基于matlab FPGA verilog的FIR滤波器设计

FIR滤波器说明 FPGA verilog的FIR滤波器设计(原创)" title="基于matlab FPGA verilog的FIR滤波器设计(原创)" style="margin:0px; padding:0px; b...
  • avrmcu1
  • avrmcu1
  • 2014-03-13 17:01
  • 1350
    个人资料
    • 访问:594129次
    • 积分:7640
    • 等级:
    • 排名:第3271名
    • 原创:190篇
    • 转载:6篇
    • 译文:0篇
    • 评论:99条
    博客专栏
    文章分类
    最新评论