- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用时librosa.stft()
要计算频谱图,如何取回相关的频率值?我对生成图像不感兴趣,如 librosa.display.specshow
,而是我想要掌握这些值。
y, sr = librosa.load('../recordings/high_pitch.m4a')
stft = librosa.stft(y, n_fft=256, window=sig.windows.hamming)
spec = np.abs(stft)
spec
给我每个频率的“幅度”或“功率”,但不是频率箱本身。我看到有一个
display.specshow
将在热图的垂直轴上显示这些频率值的函数,但不返回值本身。
nn.fft.fttfreq()
的东西对于单个 FFT,但在
librosa
中找不到它的等效项文档。
最佳答案
我想特别指出这个问题和答案: How do I obtain the frequencies of each value in an FFT? 。除了引用 documentation for the STFT from librosa ,我们知道横轴是时间轴,纵轴是频率。频谱图中的每一列都是时间切片的 FFT,其中该时间点的中心有一个放置有 n_fft=256
组件的窗口。
我们还知道有一个跳跃长度,它告诉我们在计算下一个 FFT 之前需要跳过多少音频样本。默认情况下,这是 n_fft / 4
,因此音频中每 256/4 = 64 个点,我们计算一个新的 FFT,该 FFT 以 n_fft=256
点长的这个时间点为中心。如果您想知道每个窗口所在的确切时间点,那就是 i / Fs
,其中 i
是音频信号的索引,它是 64 的倍数。
现在,对于每个 FFT 窗口,对于实际信号,频谱是对称的,因此我们只考虑 FFT 的正侧。这是由文档验证的,其中行数和频率分量的数量是 1 + n_fft / 2
,其中 1 是 DC 分量。既然我们现在有了这个,引用上面的帖子,bin号与对应频率的关系是i * Fs / n_fft
,i
是bin号,Fs
是采样频率,n_fft=256
是FFT窗口中的点数。由于我们只查看半频谱,而不是从 0 到 i
的 n_fft
,它从 0 到 1 + n_fft / 2
跨越,因为超出 1 + n_fft / 2
的 bin 只是半频谱的反射版本,因此我们不考虑频率Fs / 2
Hz 之外的组件。
如果你想生成这些频率的 NumPy 数组,你可以这样做:
import numpy as np
freqs = np.arange(0, 1 + n_fft / 2) * Fs / n_fft
freqs
将是一个将 FFT 中的 bin 编号映射到相应频率的数组。作为说明性示例,假设我们的采样频率为 16384 Hz,并且
n_fft = 256
。所以:
In [1]: import numpy as np
In [2]: Fs = 16384
In [3]: n_fft = 256
In [4]: np.arange(0, 1 + n_fft / 2) * Fs / n_fft
Out[4]:
array([ 0., 64., 128., 192., 256., 320., 384., 448., 512.,
576., 640., 704., 768., 832., 896., 960., 1024., 1088.,
1152., 1216., 1280., 1344., 1408., 1472., 1536., 1600., 1664.,
1728., 1792., 1856., 1920., 1984., 2048., 2112., 2176., 2240.,
2304., 2368., 2432., 2496., 2560., 2624., 2688., 2752., 2816.,
2880., 2944., 3008., 3072., 3136., 3200., 3264., 3328., 3392.,
3456., 3520., 3584., 3648., 3712., 3776., 3840., 3904., 3968.,
4032., 4096., 4160., 4224., 4288., 4352., 4416., 4480., 4544.,
4608., 4672., 4736., 4800., 4864., 4928., 4992., 5056., 5120.,
5184., 5248., 5312., 5376., 5440., 5504., 5568., 5632., 5696.,
5760., 5824., 5888., 5952., 6016., 6080., 6144., 6208., 6272.,
6336., 6400., 6464., 6528., 6592., 6656., 6720., 6784., 6848.,
6912., 6976., 7040., 7104., 7168., 7232., 7296., 7360., 7424.,
7488., 7552., 7616., 7680., 7744., 7808., 7872., 7936., 8000.,
8064., 8128., 8192.])
In [5]: freqs = _; len(freqs)
Out[5]: 129
我们可以看到我们生成了一个
1 + n_fft / 2 = 129
元素数组,它告诉我们每个对应的 bin 编号的频率。
librosa.display.specshow
的默认采样率为 22050 Hz,因此如果您未将采样率 (
sr
) 设置为与音频信号相同的采样频率,则纵轴和横轴将不正确。确保指定
sr
输入标志以匹配传入音频的采样频率。
关于python - 在 Librosa 中获取与 STFT 相关的频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63350459/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!