FIR滤波器窗函数设计法——汉明窗设计实例

article/2025/8/7 19:15:05

文章目录

  • 前言
  • 一、FIR滤波器的设计方法
    • 1 窗函数设计法的原理
    • 2 窗函数的主要指标和设计方法
    • 3 汉明窗的特性和设计方法
  • 二、汉明窗设计滤波器实例
    • 1.低通滤波器matlab示例
    • 2.高通滤波器matlab示例
    • 3.多通带滤波器matlab示例


前言

数字滤波器按单位抽样响应的时间特性可分为无限长单位抽样响应数字(IIR)滤波器和有限长单位抽样响应数字(FIR)滤波器,其中的FIR相比于IIR,最大的优点为可实现线性相位。此外由于FIR滤波器的单位抽样响应为有限长,因此一定稳定且可由一因果系统来实现,本篇为本人之前的学习笔记,主要讨论窗函数法设计FIR滤波器(以汉明窗为例)。

一、FIR滤波器的设计方法

1 窗函数设计法的原理

FIR滤波器的设计方法主要有:窗函数法、频率抽样法、等波纹逼近法。
窗函数设计法的思想概述是:

用FIR数字滤波器去逼近所期望的理想滤波器特性,设理想滤波器的频率响应函数为 H d ( e j w ) H_{d}\left(e^{j w}\right) Hd(ejw),对应的单位抽样响应为 h d ( n ) h_d\left( n \right) hd(n),由于 h d ( n ) h_d\left( n \right) hd(n)为理想滤波器,所以是无限长非因果序列,因此需要选择合适的窗函数 w n w_n wn对其进行截取和加权处理,从而得到FIR数字滤波器的单位抽样函数 h ( n ) h(n) h(n)。在设计过程中,窗函数的类型和长度都直接影响逼近精度, h ( n ) h(n) h(n)也应满足线性相位约束条件。

以上是课本上对设计原理的描述,接下来用简单易懂的语言解释一下,在解释之前首先要回忆起:理想滤波器也就是在信号与系统中所提及的理想低通,理想高通,理想带通,理想带阻等。(下面开始解释)这些滤波器有一个共同特点,就是边沿特性极为理想,如一个理想窗函数其傅里叶反变换为 S a Sa Sa函数,在时域上是无限宽,为非因果系统,非因果系统有一个致命的弊端,那就是在物理上不可实现。而为了解决这一弊端所采用的方法就是加窗,这就需要引入接下来几种典型窗函数。

2 窗函数的主要指标和设计方法

典型的窗函数有:矩形窗,巴特利特窗,汉宁窗,汉明窗,布莱克曼窗,凯塞窗。
在这里插入图片描述
窗函数的主要指标有:
最大旁瓣峰值 δ n ( d B ) \delta _n\left( dB \right) δn(dB):窗函数幅频响应函数取对数后的值,单位为分贝。
主瓣宽度 ω m a i n \omega _{main} ωmain:指窗函数频谱的主瓣宽度。
过渡带宽 Δ ω \varDelta \omega Δω:指FIR滤波器的过渡带宽,即通带截止频率与阻带截止频率之差。
阻带最小衰减: δ s t ( d B ) \delta _{st}\left( dB \right) δst(dB):用该窗函数设计得到的FIR滤波器的阻带最小衰减。
在设计时的原则为:应使主瓣尽可能窄,以获得较陡的过渡带宽;最大旁瓣相对于主瓣应尽可能小,即能量尽可能集中在主瓣(阻带衰减尽可能大)。
事实上,以上两原则无法同时实现,在设计时常常取两要求的折衷。

3 汉明窗的特性和设计方法

汉明窗又称改进的升余弦窗,可使得旁瓣比升余弦窗(汉宁窗)更小,其时域定义式为: w ( n ) = [ 0.54 − 0.46 cos ⁡ ( 2 π n N − 1 ) ] R N ( n ) w(n)=\left[ 0.54-0.46\cos \left( \frac{2\pi n}{N-1} \right) \right] R_N(n) w(n)=[0.540.46cos(N12πn)]RN(n)
傅里叶变换和对应窗谱分别为:
W ( e j ω ) = { 0.54 R N ( ω ) + 0.23 [ R N ( ω − 2 π N − 1 ) + R N ( ω + 2 π N − 1 ) ] } e − j N − 1 2 ω = W ( ω ) e − j N − 1 2 ω W ( ω ) = 0.54 R N ( ω ) + 0.23 [ R N ( ω − 2 π N − 1 ) + R N ( ω + 2 π N − 1 ) ] \begin{aligned} &W\left( e^{j\omega} \right) =\left\{ 0.54R_N(\omega )+0.23\left[ R_N\left( \omega -\frac{2\pi}{N-1} \right) +R_N\left( \omega +\frac{2\pi}{N-1} \right) \right] \right\} e^{-j\frac{N-1}{2}\omega}\\ &\quad =W(\omega )e^{-j\frac{N-1}{2}\omega}\\ &W(\omega )=0.54R_N(\omega )+0.23\left[ R_N\left( \omega -\frac{2\pi}{N-1} \right) +R_N\left( \omega +\frac{2\pi}{N-1} \right) \right]\\ \end{aligned} W(ejω)={0.54RN(ω)+0.23[RN(ωN12π)+RN(ω+N12π)]}ej2N1ω=W(ω)ej2N1ωW(ω)=0.54RN(ω)+0.23[RN(ωN12π)+RN(ω+N12π)]
结论:当长度相同时,三角窗,汉宁窗和汉明窗的主瓣宽度均为 8 π N \frac{8\pi}{N} N8π,且汉明窗的旁瓣最低

二、汉明窗设计滤波器实例

采用窗函数法设计FIR滤波器的步骤已于上文中提及,这里不做赘述,在根据设计要求选择最优窗函数时这里默认选择汉明窗。

1.低通滤波器matlab示例

本例实现用汉明窗设计一个FIR低通滤波器,通带截止频率 ω p \omega _p ωp=0.3 π \pi π,阻带截止频率为 ω s t = 0.5 π \omega _{st}=0.5\pi ωst=0.5π

 wp=0.3;ws=0.5;wc=(wp+ws)/2;delta_w=ws-wp;N=ceil(6.6/delta_w);hn=fir1(N-1,wc,'low',hamming(N));omega=linspace(0,pi,512);mag=freqz(hn,1,omega);magdb=20*log10(abs(mag));stem([0:N-1],hn,'.');grid on;axis([0 N-1 -0.2 0.5]);xlabel('n');ylabel('h(n)');title('单位抽样响应');plot(omega/pi,magdb);grid on;axis([0 1 -100 10]);xlabel('\omega/\pi');ylabel('db');title('幅频响应');

在程序中需要注意的是Matlab所提供的库函数fir1,其应用格式为:

hn=fir1(N,wc,ftype,win)

其中N为滤波器的阶数(滤波器长度为N+1),wc为6dB截止频率,ftype为滤波器类型,win为所用窗函数类型。ftype可选择低通(low),高通(high),带通(bandpass),带阻(stop),若省略则默认为低通,当选择带通或带阻时wc=[wc1,wc2],表示上/下截止频率,win表示窗的类型,若省略则默认为汉明窗。
fir1还可以设计成多通带滤波器格式如

h=fir1(N,wc,'DC-1')
或者
h=fir1(N,wc,'DC-0')

前者表示从通带开始,后者表示从阻带开始。
在这里插入图片描述在这里插入图片描述

2.高通滤波器matlab示例

 wc=0.5;alpha=20;N=2*alpha+1;hn=fir1(N-1,wc,'high',hamming(N))omega=linspace(0,pi,512);mag=freqz(hn,1,omega);magdb=20*log10(abs(mag));stem([0:N-1],hn,'.');grid on;axis([0 N-1 -0.2 0.5]);xlabel('n');ylabel('h(n)');title('单位抽样响应');plot(omega/pi,magdb);grid on;axis([0 1 -100 10]);xlabel('\omega/\pi');ylabel('db');title('幅频响应');

在这里插入图片描述
在这里插入图片描述

3.多通带滤波器matlab示例

 wc=[0.1 0.3 0.5 0.7 0.9];N=51;hn=fir1(N-1,wc,'DC-1',hamming(N));omega=linspace(0,pi,512);mag=freqz(hn,1,omega);magdb=20*log10(abs(mag));stem([0:N-1],hn,'.');grid on;axis([0 N-1 -0.2 0.5]);xlabel('n');ylabel('h(n)');title('单位抽样响应');plot(omega/pi,magdb);grid on;axis([0 1 -100 10]);xlabel('\omega/\pi');ylabel('db');title('幅频响应');

在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/7xnT79W2.shtml

相关文章

图像处理算法:最大类间方差法

转载于:https://www.cnblogs.com/abella/p/10646792.html

CV笔记5:图像分割之最大类间方差法、自适应阈值分割(基于python-opencv实现)

目录 一、简介 二、最大类间方差法(大津法) 2.1 最大类间方差法原理 2.2 基于opencv的实现(简单阈值分割、Otsu阈值分割) 三、自适应阈值分割 参考 一、简介 图像阈值化分割是一种传统的最常用的图像分割方法,因…

图像处理之:最大类间方差法法进行图像二值化处理

方法简介: gω0ω1(μ0-μ1)^2 对于图像I(x,y),前景(即目标)和背景的分割阈值记作T,属于前景的像素点数占整幅图像的比例记为ω0,其平均灰度μ0; 背景像素点数占整幅图像的比例为ω1,其平均灰度为μ1,类间方差记为g。采用遍历的方法得到使类间方差最大的阈值T int…

学习笔记———《最大类间方差法》

最大类间方差法是由日本学者大津(N.Otsu)于1979年提出的,又叫大津法,简称Otsu法,是一种自适应的阈值确定的方法。 它的基本思想是以某一灰度值(如t)为阈值,将图像中的像素分成两类C0和C1,然后计算它们的方差&#xff0…

自动选择阈值--最大类间方差法(OTSU)原理及matlab实现

原理 基本思想: 把一幅图像分成两部分C0,C1.使前景和背景与平均灰度的差别最大。这种差异用方差sigmaB表示。 所以目标就是求最大方差sigmaB对应的阈值T。 matlab代码 clc clear ximread(rice.png); ax;subplot(211); imshow(a,[]); %[count x]imhist(…

【机器视觉学习笔记】大津法/Otsu最大类间方差法 最佳阈值处理(C++)

目录 概念C源码OtsuThreshold主函数 效果完整源码 平台:Windows 10 20H2 Visual Studio 2015 OpenCV 4.5.3 本文所用源码修改自C opencv 图片二值化最佳阈值确定(大津法,OTSU算法)——Sharon Liu 概念 Otsu算法,也叫最大类间方差法&#x…

使用matlab编程实现基于阈值分割的扫描文档二值化方法,MATLAB实现基于最大类间方差法的图像分割算法...

clear clc; %% 选择图片,并二值化 [fn,pn,fi]uigetfile(*.jpg,选择图片); Iimread([pn fn]); if ndims(I) 3 I rgb2gray(I); end % fxy imhist(I, 256); %统计每个灰度值的个数 [counts,x] imhist(I, 256) ; figure; subplot(2, 2, 1); imshow(I, []); title(原…

基于遗传算法的二维最大类间方差法的图像分割优化

一、背景 最大类间方差阈值分割法日本大津展之在1980年提出的,其基本思路是将图像的直方图以某一灰度为阈值,将图像分成两组并计算两组的方差,当被分成的两组之间的方差最大时,就以这个灰度值为國值分割图像。 遗传算法就是借鉴自…

数字图像处理——最大类间方差法(OTSU)图像阈值分割实例

数字图像处理——最大类间方差法(OTSU)图像阈值分割实例 数字图像处理——最大类间方差法(OTSU)图像阈值分割实例 图像阈值分割是指通过以某个确定的图像灰度值(灰度级)将图像分为不同的部分,…

【图像分割】最大类间方差法(otsu)图像分割

由Otsu(大津展之)于1978年提出的最大类间方差法,是引起较多关注的一种阈值选取方法。它是在判决分析或最小二乘原理的基础上推导出来的。 参考文献: [1] Otsu N. A threshold selection method from gray-level histogram. IEEE Trans,1979;SMC-9;62-66 …

最大类间方差法Ostu的C++实现

① 设灰度级为L,灰度值i的像素出现的频数为。分别为所纷呈的两个像素类的面积比,即 ② 分别为两个像素类的平均灰度值,即 ③计算类间方差,并找出最大类间方差以及对应的阈值。 ④ 求为最大值时的t,作为图像分割的最…

图像分割 - 阈值处理 - 最大类间方差法(OTSU)

目录 1. OTSU 介绍 2. 代码实现 1. OTSU 介绍 OTSU 大津法&#xff0c;也是最大类间方差算法 OTSU 算法的思想通过不同的阈值K&#xff0c;将图像的分为两个区域&#xff0c;一个是灰度值 0 < k < K 的子区域G1&#xff1b;另一个是灰度值 K1 < k < L-1 的子区…

【零散知识】最大类间方差法(大津法,Otsu)

前言&#xff1a; { 最近特别忙&#xff08;或者说时间规划出了问题&#xff09;&#xff0c;所以更新的都是短篇。 本次的内容是最大类间方差法&#xff08;大津法&#xff0c;Otsu&#xff09;。 } 正文&#xff1a; { 根据[1]中的介绍&#xff0c;大津法的主要作用是二值…

「 Redis 」 SkipList 跳表底层实现及应用

「 Redis 」 SkipList 跳表底层实现及应用 参考&鸣谢 Redis中ZSet的底层数据结构跳跃表skiplist&#xff0c;你真的了解吗&#xff1f; RiemannChow 深入理解跳表及其在Redis中的应用 京东云开发者 Redis跳表底层实现 来年花惜 文章目录 「 Redis 」 SkipList 跳表底层实现…

Redis 中的底层数据结构:SkipList

一、SkipList 简介 SkipList(5.0) 是zset的底层实现之一&#xff0c;它的数据结构定义如下&#xff1a; /* ZSETs use a specialized version of Skiplists */ typedef struct zskiplistNode {sds ele; //成员对象double score; //分值struct zskiplistNode *backward; //后退…

skiplist原理与实现

今天继续介绍分布式系统当中常用的数据结构&#xff0c;今天要介绍的数据结构非常了不起&#xff0c;和之前介绍的布隆过滤器一样&#xff0c;是一个功能强大原理简单的数据结构。并且它的缺点和短板更少&#xff0c;应用更加广泛&#xff0c;比如广泛使用的Redis就有用到它。 …

【数据结构】跳表Skiplist

文章目录 跳表--skiplistskiplist的概念skilplist的原理skilplist的实现随机值函数跳表节点 跳表框架查找函数寻找前置节点添加元素删除元素打印链表 测试结果Skiplist与其他Key-Value结构的比较 跳表–skiplist skiplist的概念 skiplist本质上也是一种查找结构&#xff0c;用…

Skiplist跳表详解及其模拟实现

文章目录 跳表1.跳表的概念2.Skiplist在插入时采用随机层数的方法是如何保证效率的呢?3.跳表的模拟实现4.跳表VS平衡搜索树和哈希表 跳表 1.跳表的概念 跳表是基于有序链表扩展实现的。对于一个普通的有序链表&#xff0c;我们查找数据的时间复杂度是O(N)。而跳表的出现&…

skiplist - 跳表

一 前言 跳表(skiplist、跳跃表) 是一个很优秀的数据结构&#xff0c;比如用于 Redis、levelDB等出名的开源项目上。跳表在原有的有序链表上面增加了多级索引&#xff0c;通过索引来实现快速查找。 它的结构特点在名称能很好的体现出来&#xff0c;就像兔子一样&#xff0c;蹦…

Leveldb skiplist 实现及解析

skiplist 原理介绍 skiplist 由William Pugh 在论文Skip Lists: A Probabilistic Alternative to Balanced Trees 中提出的一种数据结构,skiplist 是一种随机化存储的多层线性链表结构,插入,查找,删除的都是对数级别的时间复杂度。skiplist 和平衡树有相同的时间复杂度,但…