1

伙计们,

Matlab 2007b (7.5.0) 有一个 avgpower 函数。见这里

“avgpower 方法使用积分的矩形近似值,使用存储在对象中的 PSD 数据计算信号的平均功率。

“avgpower 方法返回信号的平均功率,即 PSD 曲线下的面积。”

示例调用:

    numSamples = 10000
    频率 = 20
    幅度 = 10
    Fs = 1000
    t = [0:1/numSamples:1];
    sig = 幅度 * sin(2*pi*频率*t);
    h = 光谱.周期图('矩形');
    hopts = psdopts(h, 信号);
    设置(跳跃,'Fs',Fs);
    p = psd(h,信号,跳数);
    较低 = 12
    上 = 30
    beta_power = p.avgpower([下上]);

我希望在 Octave 中复制这种功能。功能“pwelch”似乎是一种可能性。以机智:

    ...
    sig = 幅度 * sin(2*pi*频率*t);
    pwelch('R12+');
    [光谱,频率]=pwelch(信号,[],[],[],Fs,plot_type='dB');

现在我认为频谱具有PSD的y值,而频率具有x值。所以,我可以在频率中找到介于“下”和“上”之间的样本,并且......呃,平均光谱中的相应值?我对此很模糊。

此外,“频率”中的值不一定对应于我想要的上限和下限,我不知道该怎么做。如果下部或上部正好位于宽频率箱的中间怎么办?例如,我是否需要半个 bin(即线性插值)?

也有可能从某种 FFT 中获取单个值,而不是使用 pwelch。

建议?

4

1 回答 1

2

显然我是在自言自语,但这里有一些建议的 Octave 代码,供那些走这条路的人使用。

函数[avgp] = oavgpower(信号,采样频率,低频率,高频率,窗口)

[光谱,频率]=pwelch(信号,窗口,[],[],采样频率);

idx1=max(find(freq = highfreq));

% 索引和下层和上层的实际频率
%idx1
%频率(idx1)
%idx2
%频率(idx2)

% 0: 不包括最后一个 bin
宽度 = [差异(频率);0];

pvec = 宽度(idx1:idx2).*光谱(idx1:idx2);
avgp = sum(pvec);
于 2009-03-20T14:05:39.353 回答