Hamming(汉明)窗的原理介绍及实例解析
概念
在数字信号处理过程中,每次FFT变换只能对有限长度的时域数据进行变换,因此,需要对时域信号进行信号截断。即使是周期信号,如果截断的时间长度不是周期的整数倍(周期截断),那么,截取后的信号将会存在泄漏。为了将这个泄漏误差减少到最小程度(注意我说是的减少,而不是消除),我们需要使用加权函数,也叫窗函数。加窗主要是为了使时域信号似乎更好地满足FFT处理的周期性要求,减少泄漏。这里面,有很多窗函数可以使用,不过,每种窗函数的使用场景是不同的。由于直接对信号(加矩形窗)截断会产生频率泄露,为了改善频率泄露的情况,加非矩形窗,一般都是加汉明窗,因为汉明窗的幅频特性是旁瓣衰减较大,主瓣峰值与第一个旁瓣峰值衰减可达40db。
原理
hamming窗函数其实很简单。可以使用一个公式来表示:
当 a0=0.53836 ,称作 Hamming窗;当 a0=0.5 则叫作 Hann窗。
Hann窗又称升余弦窗。Hann窗可以看作是3个矩形时间窗的频谱之和,或者说是 3个 sinc(t) 型函数之和,而括号中的两项相对于第一个谱窗向左、右各移动了π/T,从而使旁瓣互相抵消,消去高频干扰和漏能。
从减小泄漏观点出发,Hann窗优于矩形窗。但Hann窗主瓣加宽,相当于分析带宽加宽,频率分辨力下降。
如果我们将a0设为接近 0.53836 的数值,或是更精确来说是 25/46,便会得到Hamming窗,而设定这个数值的用意,是在频率为 5π/(N − 1) 处产生零交会处(zero-crossing),使原先Hann窗的第一个旁瓣(sidelobe)可以被大幅消除,产生只有Hann窗 1/5 高度的旁瓣。
一般来说,为了减少运算量,可以把公式精简为:

在matlab中,这个是非常容易实现的,只需要一个语句,就可以把汉明窗的数值求出来:
L = 64;
wvtool(hamming(L))
顺便可以看到它的频响曲线:

实例分析
这里给出一个matlab的音频处理例子,给大家一个直观的印象:
[x, fs] = audioread('mic1_data.wav');
N=256; %设置短时傅里叶变换的长度,同时也是汉明窗的长度
h=hamming(N); %设置汉明窗
sprintf("%d",h);
for m=1:N %用汉明窗截取信号,长度为N,主要是为了减少截断引起的栅栏效应等
b(m)=x(m)*h(m)
end
for mm=1:N
y1(mm)=x(mm)
end
ya=20*log(abs(fft(y1))) %做傅里叶变换,取其模值,即幅频特性,然后用分贝(dB)表示
subplot(2,1,1), %分配画布,一幅图上共两个图,这是第一个
plot(ya);title('original signal'); %画出原始信号,即前面这个音频信号的原始波形
grid %添加网格线
y=20*log(abs(fft(b))) %做傅里叶变换,取其模值,即幅频特性,然后用分贝(dB)表示
subplot(2,1,2) %分配画布,第二副图
plot(y);title('hamming added signal'); %画出短时谱
grid
运算结果:

备忘
在音频处理领域,汉明窗应用十分广泛,希望这里能给大家一些解惑。
Hamming(汉明)窗的原理介绍及实例解析的更多相关文章
- Android开发之IPC进程间通信-AIDL介绍及实例解析
一.IPC进程间通信 IPC是进程间通信方法的统称,Linux IPC包括以下方法,Android的进程间通信主要采用是哪些方法呢? 1. 管道(Pipe)及有名管道(named pipe):管道可用 ...
- Solr之NamedList 简单介绍与实例解析
大家都知道,Solr是一个基于Lucene高可配置的搜索服务器,大部分参数值以及相关优化等等都可以在solrconfig.xml中配置,那么就需要一个能够很快的进行解析和读取配置文件内容的数据结构,为 ...
- DBoW2算法原理介绍
本篇介绍DBoW2算法原理介绍,下篇介绍DBoW2的应用. DBow2算法 DBow2是一种高效的回环检测算法,DBOW2算法的全称为Bags of binary words for fast pla ...
- kafka集群原理介绍
目录 kafka集群原理介绍 (一)基础理论 二.配置文件 三.错误处理 kafka集群原理介绍 @(博客文章)[kafka|大数据] 本系统文章共三篇,分别为 1.kafka集群原理介绍了以下几个方 ...
- 03 Yarn 原理介绍
Yarn 原理介绍 大纲: Hadoop 架构介绍 YARN 产生的背景 YARN 基础架构及原理 Hadoop的1.X架构的介绍 在1.x中的NameNodes只可能有一个,虽然可以通过Se ...
- 04 MapReduce原理介绍
大数据实战(上) # MapReduce原理介绍 大纲: * Mapreduce介绍 * MapReduce2运行原理 * shuffle及排序 定义 * Mapreduce 最早是由googl ...
- Android Animation学习(一) Property Animation原理介绍和API简介
Android Animation学习(一) Property Animation介绍 Android Animation Android framework提供了两种动画系统: property a ...
- [转]MySQL主从复制原理介绍
MySQL主从复制原理介绍 一.复制的原理 MySQL 复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新.删除等等).每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以 ...
- 分布式文件系统FastDFS原理介绍
在生产中我们一般希望文件系统能帮我们解决以下问题,如:1.超大数据存储:2.数据高可用(冗余备份):3.读/写高性能:4.海量数据计算.最好还得支持多平台多语言,支持高并发. 由于单台服务器无法满足以 ...
- 内存分析_.Net内存原理介绍
内存原理介绍 1. .Net应用程序中的内存 1.1.Net内存类型 Windows使用一个系统:虚拟寻址系统.这个系统的作用是将程序可用的内存地址映射到硬件内存中的实际地址上.其实际结果 ...
随机推荐
- centos环境下MySQL8.0.25离线升级至8.0.32
环境 centos7 mysql8.0.25 下载新版本mysql 下载地址:https://dev.mysql.com/downloads/mysql/ 升级 备份数据 先保存原始数据,进入mysq ...
- Spring自带的这11个工具类,真香!
前言 最近有些小伙伴,希望我分享一些好用的工具类,帮他们提升开发效率. 今天这篇文章专门跟大家一起总结一下,Spring框架本身自带的一些好用的工具类,希望对你会有所帮助. 1 Assert 很多时候 ...
- [JVM] Java内存分配
Java内存分配 程序计数器 程序计数器是一块较小的内存区域,作用可以看做是当前线程执行的字节码的位置指示器.分支.循环.跳转.异常处理和线程恢复等基础功能都需要依赖这个计算器来完成. 虚拟机栈 虚拟 ...
- java实现幂等性校验
我们在做web应用的时候通常会遇到前端提交按钮重复点击的场景,在某些新增操作上就需要做幂等性限制来保证数据的可靠性.下面来用java aop实现幂等性校验. 一:首先我们需要一个自定义注解 packa ...
- NC20154 [JSOI2007]建筑抢修
题目链接 题目 题目描述 小刚在玩JSOI提供的一个称之为"建筑抢修"的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设施受到了严 ...
- cf的几道小题
1.E - Fridge 教训:做题的时候,没有想清楚问题,把问题复杂化了 #include <bits/stdc++.h> #define int long long using nam ...
- 【Android 逆向】【攻防世界】基础android
1. 下载并安装apk,提示要输入密码 2. apk拖入到jadx中看一下 this.login.setOnClickListener(new View.OnClickListener() { // ...
- 理解[].forEach.call()并说明为什么要使用[].forEach.call()
[].forEach.call(elems, callback) 相当于: Array.prototype.forEach.call(elems, callback) 又相当于: function(e ...
- file.deleteOnExit()与file.delete()的区别
之前踩过一个坑,下载过的文件在我第二次打开app的时候奇迹的找不到了.难道是没有下载成功?为此我特地查看了我的本地文件路径的目录.事实证明文件的确是下载到了本地路径下,但是第二次进入app的时候,路径 ...
- Mysql 插入timestamp没有使用默认值问题
在一次升级过程中,发现Mysql插入数据报了个错 Column 'create_time' cannot be null. 但是看了下这个字段虽然是非null,但是是有默认值的 `create_tim ...