民间,
Matlab 2007b(7.5.0)具有avgpower功能。见here:
“avgpower方法使用矩形逼近积分 使用存储在中的PSD数据计算信号的平均功率 对象
“avgpower方法返回信号的平均功率 PSD曲线下的区域。“
示例调用:
numSamples = 10000 frequency = 20 amplitude = 10 Fs = 1000 t = [0:1/numSamples:1]; sig = amplitude * sin(2*pi*frequency*t); h = spectrum.periodogram('rectangular'); hopts = psdopts(h, signal); set(hopts,'Fs',Fs); p = psd(h,signal,hopts); lower = 12 upper = 30 beta_power = p.avgpower([lower upper]);
我希望在Octave中复制这种功能。该 功能“pwelch”似乎是一种可能性。即:
... sig = amplitude * sin(2*pi*frequency*t); pwelch('R12+'); [spectra, freq]=pwelch(signal, [], [], [], Fs, plot_type='dB');
现在我认为光谱具有PSD的y值,而freq具有x 值。所以,我可以找到频率介于“低”之间的样本 和“上”和...呃,平均光谱中的相应值? 我对此非常模糊。
此外,“freq”中的值不一定与我的相对应 期望的上下,我不知道该怎么做。如果下部或上部落在宽频率箱的中间怎么办?例如,我是否需要半个bin(即线性插值)?
也可能从某种FFT获得单个值 而不是使用pwelch。
建议?
答案 0 :(得分:2)
显然我正在和自己说话,但是对于那些以这种方式游荡的人来说,这里有一些拟议的Octave代码。
function[avgp] = oavgpower(signal, sampling_freq, lowfreq, highfreq, window) [spectra, freq]=pwelch(signal, window, [], [], sampling_freq); idx1=max(find(freq = highfreq)); % Index and actual frequency of lower and upper bins %idx1 %freq(idx1) %idx2 %freq(idx2) % 0: don't include the last bin width = [diff(freq); 0]; pvec = width(idx1:idx2).*spectra(idx1:idx2); avgp = sum(pvec);