音频信号中的峰值检测
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
是你的y
和locs
是你的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
中。以上是关于音频信号中的峰值检测的主要内容,如果未能解决你的问题,请参考以下文章
实时时间序列数据中的峰值信号检测Matlab R Golang Python Swift Groovy C ++ C ++ Rust Scala Kotlin Ruby Fortran Julia C