我的音频信号大小为7000000 x 1
。我在MATLAB中使用peakfinder
m文件来查找音频文件中特定阈值以上的所有峰的位置。我现在正在尝试找到一个包含最大峰值的1000000 x 1
框架。我完全迷失了如何做到这一点,任何帮助将不胜感激。谢谢!
答案 0 :(得分: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将是您的矩阵,窗口将是您要检查的范围长度的矩阵,在您的情况下为1000000
修改强>
正如Try Hard在下面的评论中已经注意到,这种方法很容易受到噪声的影响,所以你可以先做的是在做任何导数之前对信号运行一个平滑滤波器,如下所示。
filt = (1/filtLength) * ones(1,filtLength);
A = conv(A,filt,'same')
这是一个简单的平均滤波器,可以帮助消除一些噪声