找到正确的测量来比较频域中的声音信号

信息处理 matlab 信号分析 功率谱密度 声音
2022-01-29 07:00:06

我正在将一些声音信号的频谱内容与 MATLAB 进行比较。我有很多措施,但想要一个代表频谱重心的措施。

我用SpecCentroid()在 File Exchange中找到来计算线性平均谱质心。然后我还使用了函数meanfreq()medianfreq()来自 MATLAB。

我正在努力理解(从数学上和感知上)这些措施的差异,所以我不太确定选择哪一个来最好地比较彼此之间的信号。

非常感谢。

编辑:

我有两种来自不同来源的声音,并尝试比较它们的频谱“特征”,以预测它们是否都与某些动物物种相关。在这一点上,我只对频域感兴趣(尽管最终时域同样重要)。到目前为止,我已经比较了峰值频率。然而,由于信号非常嘈杂,我想知道其他措施是否更合适。这就是我探索质心、均值、中值选项的原因。

这是与之前线性比例相同的图:

PSD线性示例

编辑2:

在Laurent Duval的回答和建议之后,我用不同的权重测试了估计的峰值位置。对于上面给出的信号示例,我得到:

pfdispersion d1979.69792493.12627332729542961355291.1465628535

发现的峰值频率findpeaks()285

让我们来看看我比较嘈杂的信号之一:

pfdispersion d114608262129576831122719495564858115626698470

发现的峰值频率findpeaks()处的示例427p=4

在此处输入图像描述

很明显,色散远高于最后一个(噪声较小的)信号。

1个回答

[编辑:关于(功率)频谱质心的相关讨论可以在如何计算频谱的平均/中心频率?] 让我们假设您有一个相对集中的峰值,带有噪声。我假设你的最大频率没问题。如果太高,您可以将频谱修剪到较低的频率,这可能会有所帮助。

下面的代码给出了一个简单的模型,估计了一个峰值位置,以及离散度(或不确定性)的粗略测量。它基于加权平均值或质心。如果峰值很窄,质心(和中值)将向频率轴的中心( 's)漂移。因为即使很低,噪音也会传播。这是阿基米德杠杆原理的说明:fi

给我一个立足点,我可以移动地球。

阿基米德杠杆原理

为了达到你的目标,你可以给你的幅度谱更多的权重,并计算一个估计的峰值位置aif¯

f¯=iwifiiwi.

如果您选择,您将获得标准平均值。这还不够。您可以使用以下幂增加峰值权重:这是代码中的目标。位置由红色 给出,从加权标准差得出的左右边界。越高,估计越清晰,如果数据与模型不同,则存在重大错误的风险。wi=aiwi=aipweightPower = 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