下面是一些MATLAB代码,它位于循环内,每个循环递增position
。但是,在运行此代码后,向量F1
中的值全部为NaN
。我将A
打印到屏幕上,然后输出预期值。
% 500 Hz Bands
total_energy = sum(F(1:(F_L*8)));
A = (sum(F(1:F_L))) /total_energy %% correct value printed to screen
F1(position) = (sum(F(1:F_L))) /total_energy;
感谢任何帮助
答案 0 :(得分:1)
假设F_L = position * interval
,我建议你使用类似的东西:
cumulative_energy_distribution = cumsum(abs(F).^2);
positions = 1:q;
F1 = cumulative_energy_distribution(positions * interval) ./ cumulative_energy_distribution(positions * 8 * interval);
平方和,即能量密度(也见于Parseval定理中)是单调递增的,因此您不必担心能量会回落到零。
答案 1 :(得分:1)
在MATLAB中,如果将零除零,则得到NaN
。因此,总是更好地在分母中添加无穷小数字,使得它的加法不会改变最终结果,但它避免了除零。您可以选择任何小值作为无穷小数字(例如10 ^ -10),但MATLAB已经有一个名为eps
的变量。
eps(n)
给出了可以在MATLAB中表示的下一个最大数字(其精度与n
相同)的距离。例如,如果n=1
,您可以从1获得的下一个双精度数字是1+eps(1)=1+2.2204e-16
。如果n=10^10
,则下一个数字为10^10+1.9073e-06
。 eps
与eps(1)=2.2204e-16
相同。添加eps
不会更改输出并避免出现0/0
。