我需要根据dB
中Hz
与频率中包含功率的数据计算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循环方法?
答案 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;
如果将此方法应用于不会上升然后下降的数据,或者将其应用于噪声数据,则此方法将会失效。