如何从 wav 文件中获取时域频率?

Posted

技术标签:

【中文标题】如何从 wav 文件中获取时域频率?【英文标题】:How can i get frequency in time domain from a wav file? 【发布时间】:2014-09-17 14:18:00 【问题描述】:

换句话说,我正在尝试播放一个 .wav 文件,为此我需要知道它的频率和持续时间;我正在使用的 API 有一个方法,该方法需要一个具有两个字段(频率和时间)的向量作为参数!

我尝试使用快速傅立叶变换,但它给了我频率和幅度!

杂志 /\ | | -|-----> 频率

但我需要这样的东西: 频率 /\ | | -|----->时间

我想知道是否可以从 wav 文件中获取这些信息!

【问题讨论】:

除非 WAV 文件只包含一个恒定频率的正弦波,否则就不能只测量一个频率 - 对于语音、音乐等,会有各种各样的复杂的时变分量.您真正想要实现的目标是什么?音高检测? “频率”真的是指采样率吗?无论您使用什么来打开 wav 文件,都应该为您提供该信息。 @PaulR 我想知道是否可以通过频率和时间来描述声音。例如:132 HZ.....1ms、350.....1ms、300 Hz....5ms,等等。我不知道这是否可能,这就是我问的原因 您需要了解通常没有单一的“频率”(除非您处理的是纯正弦音调)。在任何给定的瞬间,声音都有一个频谱,它是幅度与频率的关系图。因此,对于整个声音文件,您最终会得到一个 频谱图,它是一个 3D 图:通常是 X 轴上的时间,Y 轴上的频率,以及作为强度值的幅度(通常是调色板用于此)。如果您实际上是在寻找 pitch 而不是频率,那么情况就完全不同了。 【参考方案1】:

数字音频信号是一系列对(幅度、时间)。 或者你可以说它是时间的函数。 如果您获取一个音频信号序列并对该序列执行傅立叶变换 (DFT/FFT),您将得到一个包含(幅度、频率)对的新序列。 或者你可以说是频率的函数。

这个序列描述了频域中信号的属性。 它根本不包含任何时间信息。

我想,你想要的是一个函数,它描述了音频信号的频率分量随时间的变化。这不能通过简单的 FFT 来完成。

你可以做的是:

对音频数据流进行 N 个样本,样本 (0, ..., N-1) 执行 FFT 对音频数据流再取 N 个样本,(m, ..., m+N-1) 与 m 执行 FFT 对音频数据流再取 N 个样本,(2m, ..., 2m+N-1) 执行 FFT 等等

如果你的采样时间是ts,你会在T = m*ts之后得到一个新的频率分析。

也许,这就是你想要的。

【讨论】:

以上是关于如何从 wav 文件中获取时域频率?的主要内容,如果未能解决你的问题,请参考以下文章

python 问题。。。 对一个波形文件做fft,然后怎么获取那些频率分量? numpy有这个函数

我从 wav 文件中获取峰值频率。但是对于录制的 2 个频道 wav,它不起作用

如何从 .wav 文件中提取特定频率范围?

为 android 设备开发应用程序以从 WAV 文件中获取频率值

从 wav 文件 python 中提取频率

将音频样本的字节数组更改为频率