找到频率的加权平均值,同时还考虑到幅度 - 使用matlab / octave

时间:2014-12-07 16:39:44

标签: matlab math octave

我正在尝试使用matlab / octave来查找数组的加权频率(以赫兹为单位),同时还要考虑每个频率的振幅。

阵列的第1列是频率(以赫兹为单位),第2列是幅度,第3列是另一幅度。 下面的示例代码只是复制并粘贴到matlab或octave

xfreq_orig=[0.00000;100;150;160;178;234;300;323;422;444];
yamp_orig=[7.5171e-20;1.1928e-05;5.4066e-06;4.1968e-05;3.0595e-05;3.6598e-05;2.8549e-05;4.3255e-05;2.2584e-05;2.7170e-05];
yamp_inv=[0.0090570;0.0090451;0.0090516;0.0090150;0.0090264;0.0090204;0.0090284;0.0090137;0.0090344;0.0090298];

a1=[xfreq_orig,yamp_orig,yamp_inv]
[row_orig_max,col_orig_max] = find(a1(:,2)==max(a1(:,2))) %max orig freq index
max_orig_freq=a1(row_orig_max,col_orig_max) %max orig freq

[row_inv_max,col_inv_max] = find(a1(:,3)==max(a1(:,3))) %max inv freq index
max_inv_freq=a1(row_inv_max,col_orig_max) %max inv freq

per_orig_amp=yamp_orig/sum(yamp_orig); %gets percentage of each amp
wgt_orig_tmp=xfreq_orig.*(yamp_orig.* per_orig_amp); %used to get orig weighted avg
wgtavg_orig=sum(wgt_orig_tmp)/sum(yamp_orig)  %to get orig weighted avg
sum(per_orig_amp) %check percentages equal 1

per_inv_amp=yamp_inv/sum(yamp_inv);%gets percentage of each amp
wgt_inv_tmp=xfreq_orig.*(yamp_inv.*per_inv_amp); %used to get inv weighted avg
wgtavg_inv=sum(wgt_inv_tmp)/sum(yamp_inv) %to get inv weighted avg
sum(per_inv_amp) %check percentages equal 1

我得到的答案是:

    >>>a1 =

     0.00000     0.00000     0.00906
   100.00000     0.00001     0.00905
   150.00000     0.00001     0.00905
   160.00000     0.00004     0.00902
   178.00000     0.00003     0.00903
   234.00000     0.00004     0.00902
   300.00000     0.00003     0.00903
   323.00000     0.00004     0.00901
   422.00000     0.00002     0.00903
   444.00000     0.00003     0.00903

>>>row_orig_max =  8
>>>col_orig_max =  1
>>>max_orig_freq =  323
>>>row_inv_max =  1
>>>col_inv_max =  1
>>>max_inv_freq = 0
>>>wgtavg_orig =  35.305
>>>ans =  1
>>>wgtavg_inv =  23.089
>>>ans =  1

我已经检查过百分比的总和是否等于一个,而不是加权平均值接近最大频率323 ,它远不如 wgtavg_orig = 35.305 wgtavg_inv = 23.089 知道我的公式/逻辑有什么问题。

PS:我使用的是octave 3.8.1,它应与matlab兼容

1 个答案:

答案 0 :(得分:0)

你在寻找质量中心吗?如果是这样,您可以使用

找到
wgtavg_orig = xfreq_orig'*yamp_orig/sum(yamp_orig)
wgtavg_inv = xfreq_orig'*yamp_inv/sum(yamp_inv)

你将获得

wgtavg_orig =

  269.5325


wgtavg_inv =

  230.9942
顺便说一句,我不熟悉Octave,但在MATLAB中你可以使用 [max_orig_freq, row_orig_max] = max(a(:,2))代替

[row_orig_max,col_orig_max] = find(a1(:,2)==max(a1(:,2)))
max_orig_freq=a1(row_orig_max,col_orig_max)