[编辑:关于(功率)频谱质心的相关讨论可以在如何计算频谱的平均/中心频率?]
让我们假设您有一个相对集中的峰值,带有噪声。我假设你的最大频率没问题。如果太高,您可以将频谱修剪到较低的频率,这可能会有所帮助。
下面的代码给出了一个简单的模型,估计了一个峰值位置,以及离散度(或不确定性)的粗略测量。它基于加权平均值或质心。如果峰值很窄,质心(和中值)将向频率轴的中心( 's)漂移。因为即使很低,噪音也会传播。这是阿基米德杠杆原理的说明:fi
给我一个立足点,我可以移动地球。

为了达到你的目标,你可以给你的幅度谱更多的权重,并计算一个估计的峰值位置:
aif¯
f¯=∑iwifi∑iwi.
如果您选择,您将获得标准平均值。这还不够。您可以使用以下幂增加峰值权重:。这是代码中的目标。位置由红色 给出,是从加权标准差得出的左右边界。越高,估计越清晰,如果数据与模型不同,则存在重大错误的风险。wi=aiwi=apiweightPower = 4oxp
请报告您的测试,以调整答案。结果如下。使用,你得到,使用,你得到,使用 , ,在我的模型中非常接近如果您需要更高的稳健性,您可以选择加权中位数而不是加权平均值。p=1360p=2243p=4f¯=201200

freqAxis = linspace(0,1000,1000)';
freqPeak = 200;
freqPeakAmplitude = 1;
freqGGDExponent = 2;
freqGGDWidth = 50;
freqNoise = 0.2;
dataSpectrum = exp(-((freqAxis-freqPeak)/freqGGDWidth).^freqGGDExponent)+freqNoise*rand(size(freqAxis));
weightPower = 4;
freqEstLocation = sum((dataSpectrum.^weightPower).*freqAxis)/sum(dataSpectrum.^weightPower);
freqEstDispersion = sqrt(sum((dataSpectrum.^weightPower).*(freqAxis-freqEstLocation).^2)/sum(dataSpectrum.^weightPower));
freqEstAmplitude = interp1(freqAxis,dataSpectrum,freqEstLocation);
clf;hold on
plot(freqAxis,dataSpectrum);
plot(freqEstLocation,freqEstAmplitude,'or');
plot([freqEstLocation-freqEstDispersion freqEstLocation+freqEstDispersion],freqEstAmplitude,'xr');
axis tight;grid on