|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
本帖最后由 牛小贱 于 2014-3-28 10:05 编辑
源程序如下:
数据以及数据输入格式见附件中的txt文件
振动的幅值加速度为5m/ss,频率为35Hz
运行出的结图见附件
问题是:
理论上加速度信号进行一次积分后,幅值加速度和幅值速度的关系应该是:v=a/(2*pi*f)
但一次积分出来结果完全不同!不过这个程序进行二次积分结果还是蛮吻合的。
请不惜赐教!
- %频域积分
- %%%%%%%%%%%%%%%%%%%%%%%%%%
- clear; clc; close all hidden
- %%%%%%%%%%%%%%%%%%
- fni=input('频域积分-输入数据文件名:','s');
- fid=fopen(fni,'r');
- sf=fscanf(fid,'%f',1);%采样频率
- fmin=fscanf(fid,'%f',1);%最小截止频率
- fmax=fscanf(fid,'%f',1);%最大截止频率
- c=fscanf(fid,'%f',1);%单位变换系数
- it=fscanf(fid,'%f',1);%积分次数
- sx=fscanf(fid,'%s',1);%横向坐标轴的标注
- sy1=fscanf(fid,'%s',1);%纵向坐标轴输入单位的标注
- sy2=fscanf(fid,'%s',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;
- %大于并最接近n的2的幂次方为FFT长度
- nfft=2^nextpow2(n);
- %FFT变换
- y=fft(x,nfft);
- %计算频率间隔(Hz/s)
- df=sf/nfft;
- %计算指定频带对应频率数组的下标
- ni=round(fmin/df+1);
- na=round(fmax/df+1);
- %计算圆频率间隔(rad/s)
- dw=2*pi*df;
- %建立正的离散圆频率向量
- w1=0:dw:2*pi*(0.5*sf-df);
- %建立负的离散圆频率向量
- w2=2*pi*(0.5*sf-df):-dw:0;
- %将正负圆频率向量组合成一个向量
- w=[w1,w2];
- %以积分次数为指数,建立圆频率变量向量
- w=w.^it;
- %进行积分的频域变换
- a=zeros(1,nfft); a(2:nfft-1) =y(2:nfft-1)./w(2:nfft-1);
- if it == 2
- y=-a; %进行二次积分的相位变换
- else
- a1=imag(a); a2=real(a); y=a1-a2*i; %进行一次积分的相位变换
- end
- a=zeros(1,nfft);
- %消除指定正频带外的频率成分
- a(ni:na)=y(ni:na);
- %消除指定负频带外的频率成分
- a(nfft-na+1:nfft-ni+1)=y(nfft-na+1:nfft-ni+1);
- y=ifft(a,nfft); %IFFT变换
- %取逆变换的实部n个元素并乘以单位变换系数为积分结果
- y=real(y(1:n))*c;
- subplot(2,1,1); plot(t,x); xlabel(sx); ylabel(sy1); grid on; %绘制几分钱的时程曲线图形
- subplot(2,1,2); plot(t,y); xlabel(sx); ylabel(sy2); grid on; %绘制积分后的时程曲线图形
- %打开文件输出积分后的数据
- fid=fopen(fno,'w');
- for k=1:n, fprintf(fid,'%f \n',y(k)); end
- status=fclose(fid);
复制代码
|
|