最近需要读取swan的波谱数据,文件挺多的,写了一个稍有规则的matlab函数。贴出来,方便及时找到,以及希望不足之处能到大佬们的指点。
%% ntime表示数据的时间长度,
function S1=read_swan_S1(file,ntime)
fid=fopen(file,'r');
%跳过头文件信息
for i=1:6;
temp=fgetl(fid);
end
% 读取站点数量
location_number=fscanf(fid,'%d\n',1);
% 读取站点的坐标
location=fscanf(fid,'%f%f\n',[2,location_number]);
location=location';
% 读取 absolute frequencies in Hz (AFREQ)
temp=fgetl(fid); % 跳过AFREQ
AFREQ_number=fscanf(fid,'%d',4);
temp=fscanf(fid,'%s\n',3); % 读文字
AFREQ=fscanf(fid,'%f\n',AFREQ_number);
temp=fgetl(fid); % 跳过文字
QUANT=fscanf(fid,'%d\n',1); % number of quantities in table
for i=1:10
temp=fgetl(fid); % 读文字以及一些异常值(58-66)
end
%%
for t=1:ntime;
time=fscanf(fid,'%s\n',1);
temp=fscanf(fid,'%s\n',3);
for s=1:location_number;
temp=fscanf(fid,'%s\n',2);
data=fscanf(fid,'%f%f%f\n',[3,AFREQ_number]);
vadens=data(1,:);
ndir=data(2,:);
dsprdegr=data(3,:);
vadens(vadens==-99)=nan;
ndir(ndir==-999.0)=nan;
dsprdegr(dsprdegr==-9)=nan;
Vadens(s,:,t)=vadens;
Ndir(s,:,t)=ndir;
Dsprdegr(s,:,t)=dsprdegr;
Time(t,:)=time;
end
end
S1.Vadens=Vadens;
S1.Ndir=Ndir;
S1.Dsprdegr=Dsprdegr;
S1.Time=Time;
S1.QUANT=QUANT;
S1.AFREQ=AFREQ;
S1.AFREQ_number=AFREQ_number;
S1.location=location;
S1.location_number=location_number;
S1.AFREQ_unit='Hz';
S1.vadens_unit='m^2/Hz';
S1.Dir_unit='degr';
S1.Dsprdegr_unit='degr';
end
%% 主程序,调用上述函数
file='...............';
ntime=217;
S1=read_swan_S1(file,ntime);
for s=1:S1.location_number;
for t=1:ntime
figure('position',[50 50 800 200]);
plot(S1.AFREQ,S1.Vadens(s,:,t));
xlabel('Frequence(Hz)','fontsize',10);
ylabel('variance density(m^2/Hz)')
print(gcf,'./...............png');
close
end
end