使用快速傅里叶变换分析音频

2023-11-27

我正在尝试用 python 创建图形频谱分析仪。

我当前正在读取 16 位双通道 44​​,100 Hz 采样率音频流的 1024 字节,并对 2 个通道的幅度进行平均。现在我有 256 条签名短裤。我现在想使用 numpy 之类的模块对该数组执行 fft,并使用结果创建图形频谱分析仪,该分析仪一开始只有 32 个条。

我已阅读有关快速傅里叶变换和离散傅里叶变换的维基百科文章,但我仍然不清楚结果数组代表什么。这是我使用 numpy 对数组执行 fft 后数组的样子:

   [ -3.37260500e+05 +0.00000000e+00j   7.11787022e+05 +1.70667403e+04j
   4.10040193e+05 +3.28653370e+05j   9.90933073e+04 +1.60555003e+05j
   2.28787050e+05 +3.24141951e+05j   2.09781047e+04 +2.31063376e+05j
  -2.15941453e+05 +1.63773851e+05j  -7.07833051e+04 +1.52467334e+05j
  -1.37440802e+05 +6.28107674e+04j  -7.07536614e+03 +5.55634993e+03j
  -4.31009964e+04 -1.74891657e+05j   1.39384348e+05 +1.95956947e+04j
   1.73613033e+05 +1.16883207e+05j   1.15610357e+05 -2.62619884e+04j
  -2.05469722e+05 +1.71343186e+05j  -1.56779748e+04 +1.51258101e+05j
  -2.08639913e+05 +6.07372799e+04j  -2.90623668e+05 -2.79550838e+05j
  -1.68112214e+05 +4.47877871e+04j  -1.21289916e+03 +1.18397979e+05j
  -1.55779104e+05 +5.06852464e+04j   1.95309737e+05 +1.93876325e+04j
  -2.80400414e+05 +6.90079265e+04j   1.25892113e+04 -1.39293422e+05j
   3.10709174e+04 -1.35248953e+05j   1.31003438e+05 +1.90799303e+05j...

我想知道这些数字到底代表什么以及如何将这些数字转换为 32 个条形中每个条形的高度百分比。另外,我应该将 2 个通道一起平均吗?


您显示的数组是音频信号的傅里叶变换系数。这些系数可用于获取音频的频率内容。 FFT 是为复数值输入函数定义的,因此即使您的输入都是实数值,您得到的系数也将是虚数。为了获得每个频率的功率量,您需要计算每个频率的 FFT 系数的幅度。这是not只是系数的实部,您需要计算其实部和虚部的平方和的平方根。也就是说,如果你的系数是 a + b*j,那么它的大小就是 sqrt(a^2 + b^2)。

计算出每个 FFT 系数的幅度后,您需要弄清楚每个 FFT 系数属于哪个音频频率。 N 点 FFT 将为您提供从 0 开始的 N 个等间隔频率处的信号的频率内容。因为您的采样频率是 44100 个样本/秒。 FFT 中的点数为 256,频率间隔为 44100 / 256 = 172 Hz(大约)

数组中的第一个系数将是 0 频率系数。这基本上是所有频率的平均功率水平。其余系数将从 0 以 172 Hz 的倍数递增,直到达到 128。在 FFT 中,您最多只能测量采样点一半的频率。阅读以下链接奈奎斯特频率 and 奈奎斯特-香农采样定理如果你是一个贪图惩罚的人并且需要知道为什么,但基本结果是你的较低频率将被复制或aliased在较高频率的桶中。因此,频率将从 0 开始,每个系数增加 172 Hz,直到 N/2 系数,然后减少 172 Hz,直到 N - 1 系数。

这些信息应该足以帮助您入门。如果您想要比维基百科上提供的更平易近人的 FFT 介绍,您可以尝试了解数字信号处理:第二版。。这对我很有帮助。

这就是这些数字所代表的意义。可以通过将每个频率分量幅度乘以所有分量幅度的总和来转换为高度的百分比。尽管如此,这只会给你一个相对频率分布的表示,而不是每个频率的实际功率。您可以尝试按频率分量可能的最大幅度进行缩放,但我不确定这是否会显示得很好。找到可行的缩放因子的最快方法是对响亮和柔和的音频信号进行试验,以找到正确的设置。

最后,如果您想整体显示整个音频信号的频率内容,则应该对两个通道进行平均。您正在将立体声音频混合为单声道音频并显示组合频率。如果您想要左右频率有两个单独的显示,那么您将需要分别对每个通道执行傅里叶变换。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用快速傅里叶变换分析音频 的相关文章

随机推荐

  • Pydub - 将 split_on_silence 与最小长度/文件大小结合起来

    我有两个脚本 其中一个会分割一定长度的音频 另一个会在每次出现无声段落时分割音频 是否可以在静音时分割音频 但只能在经过一定时间后 我需要在静音状态下分割成不少于 5 分钟的视频块 分割脚本忽略静音 from pydub import Au
  • 我应该创建一个可以为空的外键还是创建一个新表?

    我有一个关于如何设计数据库的小问题 我有一个动物收容所的桌狗 我有一个桌主人 所有现在和曾经在收容所的狗都被安置在餐桌狗中 现在我想在桌狗和桌主人之间建立联系 问题是 在这个例子中 并不是所有的狗都有主人 并且由于一个主人可以有不止一只狗
  • Kotlin:当 Java 库同时重载原始类型和装箱类型时我该怎么办?

    例如 FastUtil 的IntArrayList has a push接受两者的方法int 原始 和Integer 盒装 但 Kotlin 将它们视为同一个函数push Int 因此我根本无法使用该函数 因为该函数不明确 当 Java 库
  • Java 停止服务器线程

    以下代码是我的应用程序中的服务器代码 private int serverPort private Thread serverThread null public void networkListen int port serverPort
  • 通过将数字列与固定值进行比较来创建类别

    考虑iris data iris Sepal Length Sepal Width Petal Length Petal Width Species 1 5 1 3 5 1 4 0 2 setosa 2 4 9 3 0 1 4 0 2 se
  • 如何“清除”绝对定位的元素

    好吧 我知道 1 仅靠 CSS 可能是不可能的 2 这确实不应该是可能的 不幸的是 由于用户的一些要求 我需要找到一种方法来使其成为可能 好的 一些大大简化的标记 div div div div Stuff1 div div Stuff2
  • Spring mvc @PathVariable

    你能给我一个简短的解释和使用示例吗 PathVariable在 Spring MVC 中 请说明您如何输入网址 我正在努力获取正确的 url 来显示 jsp 页面 谢谢 假设你想写一个 url 来获取一些订单 你可以说 www mydoma
  • 分页不正确显示页码 Codeigniter

    我的控制器功能 function test start from 0 this gt load gt library pagination data array per page 3 total this gt activity model
  • 如何使用 javascript 获取 firebase 3 的 accessToken

    我需要使用带有 firebase REST Api 的 javascript 进行浅层休息调用 在过去的版本中我需要像这样传递访问令牌 var authKey ref getAuth token var s firebaseUrl json
  • LinearLayout、RelativeLayout 和 AbsoluteLayout 之间有什么区别?

    我对 LinearLayout RelativeLayout 和 AbsoluteLayout 之间的区别感到困惑 有人可以告诉我它们之间的确切区别吗 LinearLayout意味着您可以将视图一一对齐 垂直 水平 RelativeLayo
  • 如何ptrace多线程应用程序?

    编辑 取得进展 我正在尝试 ptrace vsftpd 守护进程 我有以下附加到守护进程的代码 然后它成功显示第一个生成的进程的 PID 然而 对于这个生成进程的子进程 它返回的 PID 为 2 3 该程序确实捕获了生成进程的退出 这让我觉
  • 运行 npm install create-react-app 时出现错误 404

    出现错误404在跑步的时候npm install create react app or npm install g npm latest Log 0 info it worked if it ends with ok 1 verbose
  • 使关键字自动全局链接

    有没有办法让单词的每个实例自动变成链接 例如 每次我写 apple 时 它都会自动格式化为 a href www apple com class whatever target blank apple a 我假设我可以使用 javascri
  • Seaborn load_dataset

    我正在尝试使用 Seaborn 按照以下方式进行分组箱线图工作example 我可以让上面的例子工作 但是行 tips sns load dataset tips 根本没有解释 我已经找到 Tips csv 文件 但我似乎无法找到有关 lo
  • 使用 Criteria API 的动态 JPA 2.0 查询

    我在使用 JPA 2 0 的 CriteriaBuilder 构建动态查询时有点卡住了 我猜想我有一个相当常见的用例 用户提供任意数量的搜索参数 X 和 或连接 例如 select e from Foo where name X1 or n
  • 为什么C++中的静态thread_local对象被构造两次?

    这段代码 include
  • 有 UIView 调整大小事件吗?

    我有一个视图 其中包含图像视图的行和列 如果调整此视图的大小 我需要重新排列图像视图的位置 该视图是另一个已调整大小的视图的子视图 有没有办法检测该视图何时调整大小 正如 Uli 在下面评论的那样 正确的方法是覆盖layoutSubview
  • 如何告诉 Gem 文件使用 gem 的特定本地副本

    假设我有一颗宝石幸福地生活在 MyPath MyGem gem 我想使用本地且独特的 gem 而不是来自 Github 或从任何地方获取的 gem 版本 我如何指定我要使用gem mygem from MyPath MyGem gem 尝试
  • 检测文本是否溢出[重复]

    这个问题在这里已经有答案了 如何检测文本是否溢出 例如 以下文本的长度超出了 div 容器允许的长度 我如何在 JavaScript 中检测到这一点 div style max width 100px Lorem ipsum dolor s
  • 使用快速傅里叶变换分析音频

    我正在尝试用 python 创建图形频谱分析仪 我当前正在读取 16 位双通道 44 100 Hz 采样率音频流的 1024 字节 并对 2 个通道的幅度进行平均 现在我有 256 条签名短裤 我现在想使用 numpy 之类的模块对该数组执