我正在尝试使用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兼容
答案 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)