www.pudn.com > Eliminate-the-trend-method.zip > 滑动平均法消除振动信号的趋势项.m, change:2012-05-04,size:1417b


%滑动平均法消除振动信号的趋势项 
 clear; %清除内存中所有变量和函数 
 clc; %清除工作窗口中所显示的内容 
 close all hidden;%关闭所有隐藏的窗口 
 fni = input('消除多项式趋势项-输入数据文件名:','s');%input:提示用户进行键盘输入并获取输入内容 
 fid = fopen(fni,'r');%以只读方式打开fni文件 
 sf = fscanf(fid,'%f',1);%读入采样频率值 
 l = fscanf(fid,'%d',1);%滑动阶数 
 m = fscanf(fid,'%d',1);%平滑次数 
 fno = fscanf(fid,'%s',1);%读入输出数据名 
 x = fscanf(fid,'%f',[1,inf]);%读入时程数据存成列向量 
 %关闭数据文件 
 status = fclose(fid); 
 %取信号数据长度 
 n = length(x); 
 %建立离散时间列向量 
 t = (0:1/sf:(n-1)/sf)'; 
 %生成一个元素全为1的行向量 
 b=ones (1,l); 
 %信号两端分别向外延伸1个数据 
 a=[b*x(1),x,b*x(n)]; 
 b=a; 
 %按平滑次数循环进行滑动平均处理计算趋势项 
 for k=1:m 
    for j=l+1:n-1 
     b(j)=mean(a(j-1:j+1)); 
    end 
  a=b; 
 end 
 %用输入信号x减去与平滑趋势项a 
 y=x(1:n)-a(l+1:n+l); 
 %同时绘制x对于t和y对于t的时程曲线 
 plot(t,x,t,y,':',t,a(l+1:n+l),'-.'); 
 %添加横坐标轴的标注 
 xlabel('时间(s)'); 
 %添加纵坐标轴的标注 
 ylabel('位移(mm)'); 
 %在图幅添加图例 
 legend('输入','输出','趋势'); 
 %在图幅上添加坐标网格 
 grid on; 
 %以写的方式打开文件或建立一个新文件 
 fid=fopen(fno,'w'); 
 %进行n次循环将计算结果写到输出数据文件中 
 for k=1:n 
 %每行输出两个实型数据,t为时间,y为消除趋势项后的结果 
 fprintf(fid,'%f%f\n',t(k),y(k)); 
 %循环体结束语句 
 end 
 %关闭数据文件 
status=fclose(fid);