use*_*184 6 matlab speech-recognition fft octave
我正在使用Octave开发语音识别系统.我试图通过检测频率的差异来检测音素.目前我已经阅读了wav文件,将值组织成块并应用于fft整体数据.之后,我绘制了plot(abs(real(fft(q))))用于创建此图的新数据:

我怎样才能得到频率值(图表的峰值)?
ray*_*ica 16
如果您无法访问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
Run Code Online (Sandbox Code Playgroud)
idx将包含峰值出现位置的索引位置.请记住,我们开始在第二个位置搜索峰值,因此您需要添加1以适应此转变.如果你想找到(你的情况或频率)值的实际时间,你只需使用idx索引成被用来生成信号,并找到他们的时间(或次数)阵列.因此,让我们使用一个人工案例,我生成一个0到3秒的正弦曲线,频率为1 Hz.因此:
t = 0 : 0.01 : 3;
f = sin(2*pi*t);
Run Code Online (Sandbox Code Playgroud)
现在,如果我们用这个信号运行上面的代码,我们就会找到峰值的位置.然后我们可以使用这些位置索引t并f和我们在那里发现了峰绘制信号为好.因此:
plot(t, f, t(idx), f(idx), 'r.')
Run Code Online (Sandbox Code Playgroud)
这就是我得到的:

请记住,这是检测峰值的一种非常简单的方法,但这基本上是完成的findpeaks.如果您使用上面的代码,它基本上会找到所有峰值.因此,代码会在上图中找到数十个峰值,因为您的频谱中存在局部最大值.您可能想要确定强峰的位置.人们通常做的是在确定峰值是否为有效峰值之前使用阈值来表示峰值应该有多大.因此,您可以强制执行阈值,并执行以下操作:
thresh = ... ; %// Define threshold here
idx = find(f1 > f2 & f1 > f3 & f1 > thresh) + 1; %// Get the locations of where we find our peaks
Run Code Online (Sandbox Code Playgroud)
在您的图表中,您可能需要设置此值,以便找到幅度大于10的峰值.
还有很多其他findpeaks功能,例如滤除噪声峰值和其他一些强大的措施.如果要使用findpeaks,则需要确保安装信号包.您只需使用pkg installOctave命令提示符并安装该signal程序包即可.具体来说,试试这个:
pkg install -forge signal
Run Code Online (Sandbox Code Playgroud)
安装signal软件包后,您可以通过执行以下操作将其加载到Octave环境中:
pkg load signal
Run Code Online (Sandbox Code Playgroud)
如果您必须安装依赖项,它会在您尝试安装signal软件包时告诉您.有关详细信息,请查看此链接:https: //www.gnu.org/software/octave/doc/interpreter/Installing-and-Removing-Packages.html
mkoctfile代表制作/编译Octave文件.如果没有mkoctfile,请确保安装了最新版本的Octave.我建议您简单的做法是安装Homebrew或MacPorts并以这种方式获得Octave.一旦你安装它,那么你应该能够mkoctfile工作.但是,如果仍然不能,则可能需要安装兼容的编译器.简单的方法是从Xcode安装Command Line Developer工具.转到此链接,然后转到其他工具.
祝好运!