【发布时间】:2021-12-12 15:00:01
【问题描述】:
我试图在频谱中找到峰值,但我只需要提取基频峰值及其谐波,红色矩形。如何排除基频之前的任何内容,仅包括基频及其 3 个谐波。我使用此代码,但它没有帮助。有什么想法吗?
pks = findpeaks(q);
findpeaks(q,'MinPeakDistance',99)
%findpeaks(q,'MinPeakHeight',0.0004)
xlim([0.1 500])
使用时:
Fs = 1000;
t = 0:0.001:1-0.001; % 250-Hz sine wave modulated at 100 Hz
x = [1+cos(2*pi*100*t)].*cos(2*pi*250*t);
%envspectrum(x,Fs)
[ES,F]=envspectrum(x,Fs);
%%
findpeaks(ES,F)
% Now for only > 99 Hz (choose the freq you fancy)
idx = F >= 99; % greater than 99 Hz
findpeaks(ES(idx),F(idx)) % idx only select those F > 99
% Good? Keep the values of amplitud and location (in frequencies) of the ES
[pks,loc] = findpeaks(ES(idx),F(idx));
% If you just want to have the first 5 peaks (or the n? you choose):
% Select only 3 first.
if length(pks) > 3 % Check you didnt get less peaks
pks = pks(1:3);
loc = loc(1:3);
end
% To plot the peaks in the envelope
plot(F(idx),ES(idx),loc,pks,'r*')
我明白了:
【问题讨论】:
-
我使用
findpeaks函数绘制所有包络谱图,它发现峰值为 5、75 和 172 Hz 的频率,这是错误的。这些值似乎与它们的邻居相等。为什么findpeaks将它们视为“峰值”?我不知道,函数的算法出了点问题。但这是一个内部问题,不是我的代码。由于高度是寻找假峰的问题,您可以使用一些参数来避免这种情况(下一个) -
您可以尝试 3 个选项:使用输入:
'MinPeakHeight'指定绝对幅度,'MinPeakProminence '指定相对幅度,'Threshold' 指定其邻居之间的相对差异。这 3 个输入中的任何一个都应该足以避免选择错误的峰值。另外我刚刚读到有一个特定的输入来说明你想要找到的峰值数量('NPeaks')。那我会编辑我的答案。供参考:es.mathworks.com/help/signal/ref/findpeaks.html#namevaluepairs -
另外,很明显峰值或你的 ES 是谐波,所以更快的方法:
findpeaks(ES,F,'MinPeakDistance',99, 'Npeak', 3)。你做得很好。很抱歉造成混乱,但从一开始就没有示例会更加困难。 -
谢谢,这适用于特定生成的信号,findpeaks(ES,F,'MinPeakDistance',99, 'Npeak', 3) 但它不适用于任何信号,我试过了。我也不能使用“MinPeakHeight”、“MinPeakProminence”或“Threshold”,因为只需要谐波幅度,它可能是非常接近谐波的周围峰值。
-
这是一个更具体的问题,可能超出了我的范围。抱歉,我帮不上忙。
标签: matlab