0

我有一个大约大小的音频信号7000000 x 1。我使用peakfinderMATLAB 中的 m 文件来查找音频文件中高于特定阈值的所有峰值的位置。我现在正试图找到一个1000000 x 1包含最多峰值的帧大小。我完全不知道如何做到这一点,任何帮助将不胜感激。谢谢!

4

1 回答 1

1

好吧,所有峰值查找器功能正在做的就是取二阶导数并寻找结果值为负的任何地方。这表示局部最大值。所以你可以做一些非常相似的事情来找到任何局部最大值。

一旦有了这些索引,您就可以将包含位置逻辑表示的数组窗口化,并计算那里有多少个峰值。

下面的代码将完成我所说的。它将跨越窗口并计算找到的峰值数量,并返回一个计数向量,然后您可以找到最大值,然后您就有了起始索引。

clc; close all; clear all;
A = randi(10,[1,100])
plot(A)
hold on
C = diff(diff(A))
indices = find(C < 0)+1;
scatter(indices,A(indices),'r')
temp = zeros(size(A));
temp(indices) = 1;
window = ones(1,5);
results = conv(temp,window,'same');
max(results)

这当然是一个宠物示例, A 将是您的矩阵,而 window 将是您要检查的范围长度的矩阵,在您的情况下为 1000000

编辑

正如 Try Hard 在下面的评论中所指出的那样,这种方法相当容易受到噪声的影响,因此您首先可以做的是在进行任何导数之前对信号运行平滑滤波器,如下所示。

filt = (1/filtLength) * ones(1,filtLength);
A = conv(A,filt,'same')

这是一个简单的平均滤波器,有助于消除一些噪声

于 2013-07-22T16:32:15.793 回答