FIR滤波器的设计与实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

%========================================================= %编写 my_filter.m 文件模拟实际处理过程,按帧对 x 进行高通滤波处理,每帧 128 点 %========================================================= figure(5); %绘制经 my_filter.m,高通滤波器处理后的信号图像 subplot(2,2,1); plot(t,x); title('原信号'); subplot(2,2,3); plot(t,y_high); title('高通滤波信号'); xf=fft(x); fm=5000*length(xf)/fs; f=(0:fm)*fs/length(xf); subplot(2,2,2); plot(f,abs(xf(1:length(f)))); title('原信号频谱');
2
index=128+j; % y(i)=b0*x_temp(index); %for 循环,按直接法公式计算输出值 for k=1:jieshu %每次都是直接从 x_temp 当前的值开始算, 不再依次对 x_temp 进行移位处理 if(index -k<=0) %发现标称<0 后,需要给调头跑到缓存区的最后。 y(i)=y(i)+b(k)*x_temp(index -k+jieshu); else y(i)=y(i)+b(k)*x_temp(index -k); end end end end end end (2)主函数中,通过 my_filter.m 的调用,实现了按帧(每帧长度 128 点)处理,模拟实 际情况对对信号 x 进行滤波。代码如下: %========================================================= %编写 my_fir_filter.m 文件模拟实际处理过程,按帧对 x 进行低通滤波处理,每帧 128 点 %========================================================= t=(0:length(x)-1)/fs; figure(4); %绘制经 my_filter.m,低通滤波器处理后的信号图像 subplot(2,2,1); plot(t,x); title('原信号'); subplot(2,2,3) plot(t,y_low); xf=fft(x);%FFT 得到的是一个 X(k),k 表示频率,abs(X(k))表示增益 % plot(ab%s(xf));%直接绘制,是一个关于 Fs/2 对称 title('低通滤波信号'); fm=5000*length(xf)/fs;%为了对比度更强 取前 5000 个点 f=(0:fm)*fs/length(xf); subplot(2,2,2); plot(f,abs(xf(1:length(f)))); y_lowf=fft(y_low); title('原信号频谱'); subplot(2,2,4); plot(f,abs(y_lowf(1:length(f)))); title('低通滤波信号频谱');
br z r
0
N
r
可得直接实现型的差分方程为: y(n )
r 0
br x(n
N
r)
三、实验内容与步骤
1、已知一段 48KHZ 的语音信号(20 秒长左右) ,试用 matlab 设计 256 阶 FIR 滤波器 实现 1KHZ 低通滤波及 5KHZ 高通滤波: 实验要求没有明确给出所需设计低通、 高通滤波器的类型以及具体指标。 下面用 matlab 自带的函数 fir1 来实现 256 阶的波特沃兹滤波器。其中 wn 是截止频率归一化后的值: ********************************************************************** %音频信号文件的读入。存为 x [x,fs,bits]=wavread('10s_.wav'); %'1.wav'为已给的语音信号剪辑 %========================================================= %设计一个 fc=1kHz 的 8 阶模拟、数字低通滤波器 %指标 fs=48000Hz Fp=1000Hz % b=fir1(N,wn) %========================================================= Fp=1000; N=256;
4
ຫໍສະໝຸດ Baidu
y_highf=fft(y_high); subplot(2,2,4); plot(f,abs(y_highf(1:length(f)))); title('高通滤波信号频谱'); %将处理过后的音频信号,重新存储为 wav 格式。 wavwrite(y_low,fs,bits,'y_low_out.wav'); wavwrite(y_high,fs,bits,'y_high_out.wav');
2、用上述滤波器的设计结果,对给定语音信号进行处理【自己编制 my_fir_filter.m 函 数来实现滤波, 用 matlab 自带的 filter 函数来验证结果】 , 模拟实际处理过程, 实现按帧 (每 帧长度 128 点)处理 (1) my_fir_filter.m 模拟了实际处理过程,实现了按帧(每帧 128 点)处理。并且仅仅开 辟了长度为滤波器阶数 256 点的缓存区 x_temp=zeros(1,jieshu)。每次读入新的数据 x(n)时, 即时地根据式子计算 y(n )
二、实验原理
1、FIR 数字滤波器的设计 FIR 数字滤波器的主要设计方法有窗函数设计法和频率采样设计法, 还可以频率采样法 和窗函数法结合设计。 窗函数法的频率采样法设计过程简单,计算量小,但对滤波特性的控制作用较弱,没有 明确的算法。FIR 的优化设计基于函数逼近理论,通过不同误差准则对滤波特性进行优化。 常用的算法有切比雪夫(等纹波)逼近法和最小二乘滤波算法。 2、FIR 数字滤波器的实现 FIR 滤波器的实现通常由直接型、级联型和频率采样、快速卷积几种实现结构。本实验 使用直接型来实现,具体原理如下: 传递函数 H (z )
r 0
br x(n
N
r )。其中除了 x(n),对于其它 256 个 x(n-r)
(r=1:256)个数值存储在 x_temp=zeros(1,jieshu)中。 为了减少内存中的数据计算量,每次使用前,不需要对 x_temp 进行移位处理。只需使 用 一 个 索 引 index=n, 在 使 用 时 , 依 y(n )
0
wn=Fp/(fs/2); % Wn 是一个归一化频率,在滤波器设计中是用 fs/2 进行归一 figure(1) b_low=fir1(N,wn); [h,w]=freqz(b_low,1,512); f=w*fs/(2*pi); plot(f,abs(h),'--r') xlabel('频率'); ylabel('幅度'); title('Butterwoth 低通滤波器'); hold on %========================================================= %设计一个 fc=5kHz 的 8 阶模拟、数字高通滤波器 %指标 fs=48000Hz Fp=5000Hz % b=fir1(N,wn ,'high') %========================================================= Fp=5000; N=256; wn=Fp/(fs/2); % Wn 是一个归一化频率,在滤波器设计中是用 fs/2 进行归一 b_high=fir1(N,wn,'high'); [h,w]=freqz(b_high,1,512); f=w*fs/(2*pi); plot(f,abs(h)) set(gca,'ylim',[0 1.1]); %最大频率为 Fs legend('低通 Filter','高通 Filter');%图标 hold off
3
figure(4); %绘制经 my_filter.m,低通滤波器处理后的信号图像 subplot(2,2,1); plot(t,x); title('原信号'); subplot(2,2,3) plot(t,y_low); xf=fft(x);%FFT 得到的是一个 X(k),k 表示频率,abs(X(k))表示增益 % plot(ab%s(xf));%直接绘制,是一个关于 Fs/2 对称 title('低通滤波信号'); fm=5000*length(xf)/fs;%为了对比度更强 取前 5000 个点 f=(0:fm)*fs/length(xf); subplot(2,2,2); plot(f,abs(xf(1:length(f)))); y_lowf=fft(y_low); title('原信号频谱'); subplot(2,2,4); plot(f,abs(y_lowf(1:length(f)))); title('低通滤波信号频谱');
br x _ temp(index r
0
N
r)。一旦发现
index-r<=0, 就给 index+256。具体实现过程见核心代码: **********************************************************************
1
%编写 my_fir_filter.m 文件模拟实际处理过程,按帧对 x 进行滤波处理,每帧 128 点 function y=my_fir_filter(num,x) jieshu=length(num)-1; b0=num(1); b=num(2:jieshu+1); SIZE=size(x); Count=SIZE(1); %模拟实际应用中按数据帧进行处理,x 信号中,总共有 zhen_count_max*128 帧数据 zhen_count_max=(Count-mod(Count,128))/128+1; x_temp=zeros(1,jieshu);%开辟缓存区 i=0; y=zeros(1,Count); zhen_in=zeros(128,zhen_count_max); index=0; %模拟实际,将 x 信号按帧分组,并存储于 zhen_in 数据结构中。 for zhen_count=1:zhen_count_max %按帧处理,每帧有 128 个数据点 zhen_count; for j=1:128 i=(zhen_count-1)*128+j; if(i>Count) break %数据点处理完毕,跳出循环 end if(mod(zhen_count,2)==1) %奇数帧 x_temp(j)=x(i); %依次将这一帧的 128 个数据存入缓存区的前 128 个位置 index=j; %建立索引,每次都是直接从 x_temp[index]当前的值开始算 y(i)=b0* x_temp(index); for k=1:jieshu if(index-k<=0) %发现标称<0 后,需要给调头跑到缓存区的最后。 y(i)=y(i)+b(k)*x_temp(index-k +jieshu); else y(i)=y(i)+b(k)*x_temp(index-k); end end else %偶数帧 x_temp(128+j)=x(i); %依次将这一帧的 128 个数据存入缓存区的后 128 个位置
FIR 滤波器的设计与实现
一、实验目的和要求
1、了解 FIR(finite impulse response)滤波器的种类、基本结构、设计过程; 2、学会用窗函数法、频率采样设计法来设计 FIR 数字滤波器; 3、学会调用 MATLAB 信号处理工具箱中滤波器设计函数 4、自己编程实现 FIR 的直接实现法;并考虑实际工程中的处理效率。 5、学会使用 cooledit 软件来对音频信号做简单的处理。
相关文档
最新文档