为了账号安全,请及时绑定邮箱和手机立即绑定

从数据获取FFT峰

从数据获取FFT峰

Qyouu 2020-01-05 08:00:36

我正在使用Octave从零开始开发语音识别系统。我试图通过检测频率差异来检测音素。目前,我已经阅读了wav文件,将值组织为块,然后应用于fft了整体数据。之后,我绘制了plot(abs(real(fft(q))))用于创建此图的新数据:

如何获得频率值(图形的峰值)?


查看完整描述

2 回答

?
子衿沉夜

TA贡献1653条经验 获得超8个赞

如果您无权访问findpeaks,则其工作原理的基本前提是,对于信号中的每个点,它都会搜索一个以该点为中心的三元素窗口,并检查该窗口的中心是否大于此窗口的左侧和右侧元素。您希望能够同时找到正峰和负峰,因此需要检查绝对值。


这样,您可以做的是制作两个附加信号,使信号向左移动1,向右移动1。当我们这样做时,我们实际上将检查从信号中第二个元素开始的峰值。为了让空间向左看。我们会一直进行检查,直到倒数第二个元素为止,以便为向右看提供空间。因此,我们实际上将检查N - 2信号版本中的峰值,N即您的信号长度。因此,当我们创建左移信号时,我们提取信号的第一个元素,直到最后一个元素。当我们创建右移信号时,我们从第三个元素中提取直到最后一个元素。原始信号将仅删除其第一个和最后一个元素。


因此,通过这种方式检查峰,我们将丢失数据的第一个和最后一个点,但这应该是合适的,因为在开始和结束时很可能不会出现任何峰。之后,创建所有这些信号,只需使用逻辑索引即可查看原始信号中的相应值(没有第一个和最后一个元素)是否比其他两个信号在其相应位置大。


这样,假设您的信号存储在中f,您将执行以下操作:


f1 = abs(f(2:end-1)); %// Original signal

f2 = abs(f(1:end-2)); %// Left shift

f3 = abs(f(3:end)); %// Right shift


idx = find(f1 > f2 & f1 > f3) + 1; %// Get the locations of where we find our peaks

idx将包含出现峰值的索引位置。请记住,我们开始在第二个位置搜索峰,因此您需要加1来适应这种变化。如果您想查找实际的时间(或频率)值,只需idx索引用于生成信号并找到它们的时间(或频率)数组即可。因此,让我们使用一个人工情况,其中我会以0 Hz的频率生成0到3秒的正弦波。因此:


t = 0 : 0.01 : 3;

f = sin(2*pi*t);

现在,如果使用此信号运行上述代码,我们将找到峰值的位置。然后我们可以使用这些位置索引t并f和我们在那里发现了峰绘制信号为好。因此:


plot(t, f, t(idx), f(idx), 'r.')

这是我得到的:


在此处输入图片说明

请记住,这是一种检测峰的非常简单的方法,但这实际上是在中完成的findpeaks。如果您使用上述代码,则基本上可以找到所有峰。因此,该代码将在上图中显示数十个峰,因为在您的频谱中都存在局部最大值。您可能想要确定强峰的位置。人们通常要做的是在确定该峰是否为有效峰之前,使用阈值来表示该峰应为多大。这样,您可以强制执行阈值,并执行以下操作:


thresh = ... ; %// Define threshold here

idx = find(f1 > f2 & f1 > f3 & f1 > thresh) + 1; %// Get the locations of where we find our peaks

就您的图形而言,您可能需要进行设置,以便找到幅度大于10的任何峰。


还有很多其他findpeaks功能,例如滤除噪声峰值和其他一些可靠的措施。如果要使用findpeaks,则需要确保安装信号包。您只需pkg install在Octave命令提示符中使用并安装signal软件包即可。具体来说,请尝试以下操作:


pkg install -forge signal

安装signal软件包后,可以执行以下操作将其加载到Octave环境中:


pkg load signal

如果必须安装依赖项,它将在尝试安装signal软件包时告诉您。请查看此链接以获取更多详细信息:https : //www.gnu.org/software/octave/doc/interpreter/Installing-and-Removing-Packages.html


mkoctfile代表制作/编译八度音阶文件。如果没有mkoctfile,请确保已安装了最新版本的Octave。我建议您使事情变得简单的方法是安装Homebrew或MacPorts并以这种方式获取Octave。一旦安装,就可以开始mkoctfile工作了。但是,如果仍然不能,则可能需要安装兼容的编译器。一种简单的方法是从Xcode安装Command Line Developer工具。转到此链接,然后转到“其他工具”。



查看完整回答
反对 回复 2020-01-06

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信