我已经制作了这个脚本来计算给定数据集的频率,但是matlab不够精确,是否有可能使matlab读取更准确的数字而不是切断数字?我希望它使用8位数(0.12345678)而不是现在的4位(0.1234)
fid = fopen('forceCoeffs.dat','rt');
A = textscan(fid, '%f%f%f%f%f%f', 'HeaderLines',9,'Collect', 9);
A = A{1};
fclose(fid);
t = A(:,1);
Fs = 1/(A(1,1));
x = A(:,2)
x = detrend(x,0);
xdft = fft(x);
freq = 0:Fs/length(x):Fs/2;
xdft = xdft(1:length(x)/2+1);
plot(freq,abs(xdft));
[~,I] = max(abs(xdft));
fprintf('Maximum occurs at %d Hz.\n',freq(I));
档案:https://drive.google.com/file/d/0B9CEsYCSSZUSb1JmcHRkbFdWYUU/view?usp=sharing
答案 0 :(得分:2)
感谢您提供mv
文件,因为它允许我运行您的代码。以下是您所看到的内容的解释。
首先,我想指出MATLAB并非四舍五入。您可以检查forceCoeffs.dat
的数据类型,以确保您具有足够的精度。
A
由于您使用>> class(A)
ans =
double
读取每个列的文件,因此MATLAB将使用%f
类型提供的所有位。好的,现在看一下你文件的内容。第一列最多只有2位小数。
double
由于不再需要MATLAB,因此当您查看变量资源管理器中的变量时,MATLAB只会打印四个小数位。尝试查看其他列之一,看看我在说什么。我注释掉了代码的0.05 -7.013874e-09 1.410717e+02 -6.688450e-02 -3.344226e-02 -3.344224e-02
...
349.95 -1.189524e-03 1.381022e+00 -2.523909e-01 -1.273850e-01 -1.250059e-01
350 -1.423947e-03 1.380908e+00 -2.471767e-01 -1.250123e-01 -1.221644e-01
部分并查看了第二列。单击数字时,您会看到完整的精度。
答案 1 :(得分:0)
您可以使用长型显示16位
答案 2 :(得分:0)
要获得超过4位数的精度,您可以使用
format long
但是,要准确获得8位数字,您需要对其进行舍入。如果您的号码为a
,请使用:
format long
round(1e8*a)*1e-8