音频信号中的峰值检测

Posted

技术标签:

【中文标题】音频信号中的峰值检测【英文标题】:Peak detection in an audio signal 【发布时间】:2014-02-18 14:08:38 【问题描述】:

我需要使用 matlab 找到音频信号的最大峰值。我使用wavread 命令获得了输入,并使用 FFT 将信号转换为频域。找到它的大小后,我需要存储峰值以供进一步计算。我怎样才能做到这一点?

【问题讨论】:

信号处理工具箱中有findpeaks函数。 我用过,但它告诉我一个错误。例如,如果我将幅度存储在变量 IN_MAG 中,并创建了另一个变量 PEAK = findpeaks(IN_MAG),它会像这样告诉错误。 ???使用 ==> findpeaks 时出错 预期 X 是一个向量。 ==> findpeaks 中的错误 42 validateattributes(X,'numeric','nonempty','real','vector',... 您可以查看IN_MAG的尺寸。输入“需要具有实值元素且最小长度为 3 的行或列向量” @Gogui 请发布一些代码,说明如何存储幅度和图表。这完全取决于有多少个峰等等。 Kumar 和 Pal 有一个很好的 ALE 陷波滤波器,可以非常有效地找到中心频率。 ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=414768 【参考方案1】:

我猜您的 IN_MAG 不是实数向量,这意味着您存储了 FFT 的实部和虚部。我建议您阅读 matlab 文档的doc fft,以便创建合适的向量。

如果你能完成这个,如果你想要一个唯一的峰值,最大值,只需使用函数max。如果不是,您可以个性化您要查找的内容,

假设找到最小高度为 0.5 且彼此距离为 10 个点的前 3 个峰,

[pks, locs] = findpeaks(IN_MAG, 'NPEAKS', 3, 'MINPEAKHEIGHT', 0.5, 'MINPEAKDISTANCE', 10);

那么pks 是你的ylocs 是你的x 与你的峰值坐标。

编辑:

关于 FFT,

假设sig 是您的信号,

t = linspace(0,L/Fs,L); % Fs is the sampling rate in Hz and L the signal length

NFFT = 2^nextpow2(L);
f = Fs/2*linspace(0,1,NFFT/2+1);

fft_sig = fft(sig, NFFT)/L;

magnitude_sig = = 2*abs(fft_sig(1:NFFT/2+1));

这是您正确的 fft 幅度信号。

【讨论】:

非常感谢。我会注意的。这是我的代码。 in = wavread('C:\Users\Gogul\Desktop\C note mono.wav'); IN=fft(in); IN_MAG=abs(IN);情节(IN_MAG); title('音频样本的大小'); SRATE = 44100; LEN = 长度(IN_MAG);频率 = (SRATE*PEAK)/LEN; % PEAK 是音频样本中的最大峰值。 非常感谢。这是一个关于音频处理的项目。这种 fft 转换是为了检测吉他声音的频率,比如 C 音符。如果我能找到它的最大峰值,并将 x 轴值乘以采样率,然后除以音频信号的长度,我就能找到输入信号的确切频率。你能得到什么吗? @Gogui FFT信号幅度的x轴实际上已经在Hz中。

以上是关于音频信号中的峰值检测的主要内容,如果未能解决你的问题,请参考以下文章

检测音频文件中的小峰值

峰值频率python的时间戳

实时时间序列数据中的峰值信号检测Matlab R Golang Python Swift Groovy C ++ C ++ Rust Scala Kotlin Ruby Fortran Julia C

心电信号基于matlab心电图峰值检测含Matlab源码 1548期

Objective-C 峰值检测加速框架

如何检测时间序列中的峰值