首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于FFT、PSD和STFT的音频特征提取及最强频率提取

基于FFT、PSD和STFT的音频特征提取及最强频率提取
EN

Stack Overflow用户
提问于 2013-01-21 06:06:14
回答 2查看 4.9K关注 0票数 2

1)假设我有使用F = fft(x)S = spectrogram(x)获得的快速傅立叶变换和短时傅立叶变换系数。如何将这些系数用作音频特征?(这里使用的是模式识别意义上的音频特征)。

2)以下代码是否给出了信号中的功率谱密度和最强频率(以kHz为单位)?

代码语言:javascript
复制
Hs = spectrogram.periodogram;
p = psd(Hs, x, 'Fs', 22050);
[C, I] = max(p.data);
max_f = p.Frequencies(I);

3)如果(2)是OK的,我如何使用PSD在信号中找到最强大的n频率?

4)如何使用类似于PSD的FFT和/或STFT找到最强大的频率?

提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2013-01-21 14:56:50

1) S = spectrogram(x)通过将信号x细分为多个部分并计算每个部分的功率谱密度,得到作为时间函数的快速傅立叶变换。fft(X)一次给你整个信号的快速傅立叶变换。前者更有可能跟踪频率内容的变化,而后者更有助于查看整体频率内容。我不太熟悉音频处理,但即使两个信号具有相同的功率谱,FFT复杂相位的微小变化也会导致时域上的信号截然不同。

2)语法似乎与我在Matlab中习惯的稍有不同,但答案是肯定的。频率的单位取决于您所使用的确切语法。

3)您可以使用sort函数来获取n个最强大的频率段。例如,[B,IX] = sort(p.data)freq_maxn = p.Frequencies(IX(1:n))

4) PSD = | FFT |^2/N。换句话说,PSD只是FFT的平方幅度的缩放版本。然而,对于实值信号,只使用一半的FFT,因为另一半只是复数共轭。一旦你有了这个序列,最大频率和前n个频率的计算仍然与(2)和(3)相同。有关详细信息,请参阅periodogram

票数 2
EN

Stack Overflow用户

发布于 2013-01-21 17:52:36

我认为你需要定义你所说的“音频特征”是什么意思。有许多不同类型的功能,这取决于您试图实现的目标(例如,请参阅these papers中的一些功能)。

当你谈到‘最强大的频率’时,我假设你想要做某种形式的基音检测?如果是这样的话,PSD的峰值确实会给出最主要的频率,但这不一定是你听到的音高。例如,一个乐器可能正在以200 the的频率演奏一个音符,它将在200,400,600,800等处有频谱峰值,而不一定是200 the的最高振幅。事实上,你可以应用低通滤波器来去除200 it的分量,但你仍然会感觉到它是音调(如果你在电话里听到音乐,你会听到这种效果-它被称为Virtual Pitch)。

如果你想检测基音,那么我建议阅读Pitch Estimation算法。

编辑:有相当多的论文研究音频分类,所以有一个由Eric Scheirer,George Tzanetakis和Martin McKinney等人工作的search。我也会在MIR mailing list上注册,因为在那个名单上有很多这个领域的核心人物,档案馆也有很多有用的东西。至于你关于“最强频率”的问题,我不太明白你说的是什么意思。当听不止一种乐器演奏的音乐时,通常不会有一个主导频率。通常有一种可感知的旋律,由于混音的原因,它通常是突出的,但我不确定这是否是你的意思。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14429885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档