从幅度 - 频率图计算峰值处的3dB带宽

时间:2017-03-26 21:32:55

标签: matlab signal-processing

我需要根据dBHz频率中包含功率的数据计算3dB带宽。例如:

X = 
    2.9640   -5.0568
    2.9705   -4.5819
    2.9770   -4.1277
    2.9835   -3.7016
    2.9900   -3.3095
    2.9965   -2.9560
    3.0030   -2.6446
    3.0095   -2.3776
    3.0160   -2.1569
    3.0225   -1.9839
    3.0290   -1.8596
    3.0355   -1.7847
    3.0420   -1.7596
    3.0485   -1.7849
    3.0550   -1.8609
    3.0615   -1.9877
    3.0680   -2.1655
    3.0745   -2.3944
    3.0810   -2.6741
    3.0875   -3.0044
    3.0940   -3.3843
    3.1005   -3.8126
    3.1070   -4.2872
    3.1135   -4.8051
    3.1200   -5.3616
    3.1265   -5.9505

我使用findpeaks内置函数获得了我感兴趣的高峰:

[pks, locs, w, p] = findpeaks(X.data(:,2), 'MinPeakProminence',3);
fstpeak = locs(1);
frequency = X(fstpeak,1);
peak_magnitude = X(fstpeak,2);

我显然可以创建一个for循环并从fstpeak向前和向后看,直到我得到一个低于peak_magnitude - 3的值,然后插入,如果需要更高的精度。

这似乎是一个非常常见的操作,但我试图找到一个内置的matlab函数但没有成功。是否有我可以使用的内置函数,或者更快的自定义for循环方法?

1 个答案:

答案 0 :(得分:2)

我认为你这样做的问题是你的数据不是单调增加的。话虽如此,它确实遵循一条很好的曲线 - 它上升到最大值然后开始减小,并且没有噪音。因此,您可以将曲线分成两条较短的曲线,这些曲线单调增加/减少,并使用“interp1”找到-3dB点。

frequency = X(:,1);
magnitude = (X:,2);
magnitude = magnitude - max(magnitude); % Normalise to maximum

indmax = find(magnitude == max(magnitude));

f1 = interp1(magnitude(1:indmax), frequency(1:indmax), -3);
f2 = interp1( magnitude(indmax:end), frequency(indmax:end), -3);
BW = f2 - f1;

如果将此方法应用于不会上升然后下降的数据,或者将其应用于噪声数据,则此方法将会失效。