【音频分析】短时傅立叶变换结果为啥是对称?每个结果对应的频率是多少?
传统艺能,又来搞傅立叶变换。
在短时傅立叶变换只有离散的一些频率,变换之后的频谱分布有哪些规律呢?
解释对称性
上公式,N是时间域的窗口采样数(即数组长度)
正变换
F(k)=∑n=0N−1f(n)∗e−i2πnkNF(k) = \sum_{n=0}^{N-1}f(n)*e^{-i\frac{2\pi nk}{N}} F(k)=n=0∑N−1f(n)∗e−iN2πnk
周期性
WNn(k+N)=e−i2πn(k+N)N=e−i2πnkN∗e−i2πn=WNnkF(k)=F(k+N)W_{N}^{n(k+N)} = e^{-i\frac{2\pi n(k+N)}{N}} = e^{-i\frac{2\pi nk}{N}} * e^{-i2\pi n} = W_{N}^{nk} \\ F(k) = F(k+N) WNn(k+N)=e−iN2πn(k+N)=e−iN2πnk∗e−i2πn=WNnkF(k)=F(k+N)
周期性说明离散频谱的数量是有限的,或者说是有最小周期分辨率的。而这个数量是由时域的采样窗长度N决定的。
共轭性不讨论。
半对称性,当k在前半窗时:
F(N−k)=∑n=0N−1f(n)∗e−i2πn(N−k)N=∑n=0N−1f(n)∗e−i2πn(−k)N∗e−i2πn=∑n=0N−1f(n)∗e−i2πn(−k)NF(N-k) = \sum_{n=0}^{N-1}f(n)*e^{-i\frac{2\pi n(N-k)}{N}} \\ = \sum_{n=0}^{N-1}f(n)*e^{-i\frac{2\pi n(-k)}{N}}*e^{-i2\pi n} \\ = \sum_{n=0}^{N-1}f(n)*e^{-i\frac{2\pi n(-k)}{N}} F(N−k)=n=0∑N−1f(n)∗e−iN2πn(N−k)=n=0∑N−1f(n)∗e−iN2πn(−k)∗e−i2πn=n=0∑N−1f(n)∗e−iN2πn(−k)
欧拉公式
eix=cos(x)+i∗sin(x)e−i2πn(−k)N=cos(2πnkN)+i∗sin(2πnkN)e−i2πnkN=cos(2πnkN)−i∗sin(2πnkN)e^{ix} = cos(x) + i*sin(x) \\ e^{-i\frac{2\pi n(-k)}{N}} = cos(\frac{2\pi nk}{N}) + i*sin(\frac{2\pi nk}{N}) \\ e^{-i\frac{2\pi nk}{N}} = cos(\frac{2\pi nk}{N}) - i*sin(\frac{2\pi nk}{N}) eix=cos(x)+i∗sin(x)e−iN2πn(−k)=cos(N2πnk)+i∗sin(N2πnk)e−iN2πnk=cos(N2πnk)−i∗sin(N2πnk)
则可以对比
F(k)=∑n=0N−1f(n)∗cos(2πnkN)−i∗∑n=0N−1f(n)∗sin(2πnkN)F(N−k)=∑n=0N−1f(n)∗cos(2πnkN)+i∗∑n=0N−1f(n)∗sin(2πnkN)0<=k<=N/2F(k) = \sum_{n=0}^{N-1}f(n)*cos(\frac{2\pi nk}{N}) - i*\sum_{n=0}^{N-1}f(n)*sin(\frac{2\pi nk}{N}) \\ F(N-k) =\sum_{n=0}^{N-1}f(n)*cos(\frac{2\pi nk}{N}) + i*\sum_{n=0}^{N-1}f(n)*sin(\frac{2\pi nk}{N}) \\ 0<= k <= N/2 F(k)=n=0∑N−1f(n)∗cos(N2πnk)−i∗n=0∑N−1f(n)∗sin(N2πnk)F(N−k)=n=0∑N−1f(n)∗cos(N2πnk)+i∗n=0∑N−1f(n)∗sin(N2πnk)0<=k<=N/2
变换结果的前半窗和后半窗的实部相等,虚部大小相反。换言之,存储频谱的时候只需要前一半的长度即可。
还有一点就是,正常变换频谱前后各有一半能量,修改频谱的时候,要对称着修改才自然。(虽然把能量集中到一个上也能成功)
频率单位计算
从上面可以得知,基频只能到N/2
ω=2πkN=2πTT=Nkf=kN,k=0,1,2...,N/2−1\omega = \dfrac{2\pi k}{N} \\ = \dfrac{2\pi }{T} \\ T = \dfrac{N }{k} \\ f = \dfrac{k }{N}\\ ,k=0,1,2...,N/2-1 ω=N2πk=T2πT=kNf=Nk,k=0,1,2...,N/2−1
显然,k=0的时候,周期是∞\infty∞,频率是0,就是底音强度。
频谱散列,假设每格代表的时长是t秒,
0,1N∗t,2N∗t,...,0,N/2N∗t.0,\dfrac{1 }{N*t},\dfrac{2 }{N*t},...,0,\dfrac{N/2 }{N*t}. 0,N∗t1,N∗t2,...,0,N∗tN/2.
例如16K 10ms的窗,频谱为:
0,10.01,20.01,...,0,800.01.=0,100,200,...,8000Hz0,\dfrac{1 }{0.01},\dfrac{2 }{0.01},...,0,\dfrac{80 }{0.01}.\\ = 0,100,200,...,8000Hz 0,0.011,0.012,...,0,0.0180.=0,100,200,...,8000Hz
k =1,k = 2的基频,即100Hz和200Hz。
频谱以百Hz为单位变化的话,在低频部分会相对不够细致。一个方法是加大采样宽度,当N=320时,20ms时
0,10.02,20.02,30.02,...,0,1600.02.=0,50,100,150,...,8000Hz0,\dfrac{1 }{0.02},\dfrac{2 }{0.02},\dfrac{3 }{0.02},...,0,\dfrac{160 }{0.02}.\\ = 0,50,100,150,...,8000Hz 0,0.021,0.022,0.023,...,0,0.02160.=0,50,100,150,...,8000Hz
看出来上限都是8000Hz,而采样率是16000Hz,这也满足奈奎斯特采样定律。
逆变换
f[n]=∑k=0N−1F[k]∗ej∗2πknN=∑k=0N/2−1[(F[k].r+j∗F[k].i)(cos(2πknN)+j∗sin(2πknN))+(F[N−k].r+j∗F[N−k].i)(cos(2π(N−k)nN)+j∗sin(2π(N−k)nN))]对称性:=∑k=0N/2−1[(F[k].r+j∗F[k].i)(cos(2πknN)+j∗sin(2πknN))+(F[k].r−j∗F[k].i)(cos(2πknN)−j∗sin(2πknN))]=∑k=0N/2−1[(2∗F[k].r∗cos(2πknN)−2∗F[k].i∗sin(2πknN))]=∑k=0N/2−12A[k]∗cos(2πknN−θ[k])f[n] = \sum_{k=0}^{N-1} F[k]*e^{j*\frac{2\pi kn}{N}} \\ = \sum_{k=0}^{N/2 -1}[ (F[k].r + j*F[k].i)(cos(\frac{2\pi kn}{N}) +j*sin(\frac{2\pi kn}{N})) + \\ (F[N-k].r + j*F[N-k].i)(cos(\frac{2\pi (N-k)n}{N}) +j*sin(\frac{2\pi (N-k)n}{N}))] \\ 对称性:\\ = \sum_{k=0}^{N/2 -1}[ (F[k].r + j*F[k].i)(cos(\frac{2\pi kn}{N}) +j*sin(\frac{2\pi kn}{N})) + \\ (F[k].r - j*F[k].i)(cos(\frac{2\pi kn}{N}) - j*sin(\frac{2\pi kn}{N}))] \\ = \sum_{k=0}^{N/2 -1}[ (2*F[k].r * cos(\frac{2\pi kn}{N}) - 2*F[k].i *sin(\frac{2\pi kn}{N})) ] \\ = \sum_{k=0}^{N/2 -1}2A[k] * cos(\frac{2\pi kn}{N} - \theta[k]) f[n]=k=0∑N−1F[k]∗ej∗N2πkn=k=0∑N/2−1[(F[k].r+j∗F[k].i)(cos(N2πkn)+j∗sin(N2πkn))+(F[N−k].r+j∗F[N−k].i)(cos(N2π(N−k)n)+j∗sin(N2π(N−k)n))]对称性:=k=0∑N/2−1[(F[k].r+j∗F[k].i)(cos(N2πkn)+j∗sin(N2πkn))+(F[k].r−j∗F[k].i)(cos(N2πkn)−j∗sin(N2πkn))]=k=0∑N/2−1[(2∗F[k].r∗cos(N2πkn)−2∗F[k].i∗sin(N2πkn))]=k=0∑N/2−12A[k]∗cos(N2πkn−θ[k])
A[k]A[k]A[k]是频谱复平面模长,θ[k]\theta[k]θ[k]是复平面向量和x轴夹角(相位角),可以看出频域复平面的模长影响时域的实际能量,复平面相位角影响时域实际相位。
可以看出 频谱的虚部和实部同时影响逆变换的效果。
逆变换之后理论时虚部为0,只有实部。
如果想只改变频谱中某分量的相位,则需要计算模长和角度之后,重新计算新相位;
只改变强度,则重新计算模长
第一基频移动 π\piπ
第一基频强度提升5倍
核心代码
real = (spec0_copy[1].real**2 + spec0_copy[1].imag**2)**0.5angle = np.arcsin(spec0_copy[1].imag/real) # [-pi/2,pi/2]real *= 5 # 修改实部或虚部angle += np.piprint(real,angle)spec0_copy[1] = complex(real*np.cos(angle), real*np.sin(angle)) #相位需要保持不变spec0_copy[-1] = complex(real*np.cos(angle), -real*np.sin(angle)) #相位需要保持不变rec_sig0_copy = np.fft.ifft(spec0_copy) # 逆变换
【音频分析】短时傅立叶变换结果为啥是对称?每个结果对应的频率是多少?相关推荐
- 关于短时傅立叶变换的基线的选取以及可靠频率点的关系
针对基线校正时的基线长度,短时傅立叶变换时,整个时间窗内傅立叶变换的结果会赋值给时间窗中间时间点.这样一来,基线开头和结尾各有一半时间窗长度的短时傅立叶结果是不太可靠的.例如,如果基线是-500-0m ...
- 时频分析:短时傅立叶变换实现(4)
目录: 前言 实验环境 Matlab spectrogram函数 1语法 2使用说明 3代码如下 3.1重新分配平方鸟声的谱图 3.2设置了下限的谱图 参考: 前言 之前讲了时频分析的原理,现在来讲讲 ...
- 时频分析:短时傅立叶变换实现(5)
目录: 前言 实验环境 Matlab spectrogram函数 1语法 2使用说明 3代码如下 3.1谱图聚集和门限设置 参考: 前言 之前讲了时频分析的原理,现在来讲讲它在matlab里面的实现. ...
- 非平稳信号的频谱分析方法---(短时傅立叶变换)
非平稳信号又称时变信号.对这一类信号,其一阶.二阶统计量和功率谱的估计显然不能简单的使用平稳信号的估计方法,必须考虑它们的时变因素. 基本原理 对非平稳信号,人们希望能有一种分析方法把时域分析和频域分 ...
- 深度学习 应用 扫地机器人_如何将机器学习和深度学习方法应用于音频分析
深度学习 应用 扫地机器人 要查看代码,培训可视化以及本文末尾有关python示例的更多信息,请访问Comet项目页面 . 介绍 尽管有关深度学习的许多著作和文献都涉及计算机视觉和自然语言处理(NLP ...
- 傅立叶变换和小波变换入门学习
这两东西主要是用在信号处理方面.总的来讲小波变换是傅里叶变换在实际中不够用以后提出的. 傅里叶基本属于是古人,小波变换最早提出是1974年. 计算机应用专业应该不学傅里叶变换.但是现在傅里叶变换和小波 ...
- 为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换?
https://www.douban.com/note/164400821/ 写在最前面:本文是我阅读了多篇相关文章后对它们进行分析重组整合而得,绝大部分内容非我所原创.在此向多位原创作者致敬!!! ...
- 【转】为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换?...
写在最前面:本文是我阅读了多篇相关文章后对它们进行分析重组整合而得,绝大部分内容非我所原创.在此向多位原创作者致敬!!!一.傅立叶变换的由来关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶 ...
- 傅立叶变换,时域,频域一
参考文献: 信号完整性分析 "信息传输调制和噪声"P31, "傅立叶变换的数学再认识"及若干网上博客. 目录 信号分析方法概述 时域 频域 ...
最新文章
- 微信小程序开发者工具升级自动预览功能,福利啊
- 创建自己的内容提供器
- Asp.Net中的MapPath目录问题
- ProE复杂曲线方程:Python Matplotlib 版本代码(L系统,吸引子和分形)
- C++从vector中删除指定元素
- [react] 可以使用TypeScript写React应用吗?怎么操作?
- 下载android版趣步最新版,趣步下载2021安卓最新版_手机app官方版免费安装下载_豌豆荚...
- jquery 常见选择器以及一些方法
- UITextField-IOS开发
- JVM、JRE、JDK、java ee sdk with jdk四者的区别
- Maven运行时异常java.lang.UnsupportedClassVersionError的解决方案
- 开源ONE兔3.0社交社区交友婚恋视频即时通讯双端APP原生源码
- ARM 指令集版本和ARM 版本
- 基于Python实现仿Windows标准计算器
- python操作wps表格_python3怎么用pandas读wps表格,pandas python教程
- ★★★HEU_KMS_Activator_v7.5 (附详细说明文档)
- 【IT项目管理】第1章 走进IT项目管理
- 解决Could not get a resource from the pool 异常问题
- Python网络爬虫数据采集实战(八):Scrapy框架爬取QQ音乐存入MongoDB
- 如何统计项目的代码行数
热门文章
- fnd_profile.value的用法
- codeblocks 添加多个工程文件 codeblocks添加已存在工程
- 发现一个微博图床API和图片上传代码
- 使用husky + lint-staged助力团队编码规范
- SDN相关组织——ONF
- Python 如何画出漂亮的地图?
- Android 自定义键盘布局
- 互联网晚报 | 6月28日 星期二|​ QQ回应大规模账号被盗;iPhone 14系列新机最快8月初量产;微信表情符号写入判决...
- C语言为何不会过时?你需要掌握多少种语言?
- 为什么要做访问学者?