在Octave中实现Matlab的avgpower?

时间:2009-03-19 15:07:00

标签: matlab signal-processing octave spectral-density

民间,

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。

建议?

1 个答案:

答案 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);