程序4-1%最小二乘法消除多项式趋势项%%%%%%%%%%%%%%%%%%%%%%%%clear % 清除内存中所有变量和函数clc % 清除工作窗口中所显示的内容close all hidden % 关闭所有隐藏的窗口%%%%%%%%%%%%%%%%%%%%%%%%%提示用键盘输入输入数据文件名fni=input('消除多项式趋势项-输入数据文件名:','s');%以只读方式打开数据文件fid=fopen(fni,'r');sf = fscanf(fid,'%f',1); %读入采样频率值m = fscanf(fid,'%d',1); %读入拟合多项式阶数fno = fscanf(fid,'%s',1);%读入输出数据文件名x = fscanf(fid,'%f',inf);%读入时程数据存成列向量%关闭数据文件status=fclose(fid);%取信号数据长度n=length(x);%建立离散时间列向量t=(0:1/sf:(n-1)/sf)';%计算趋势项的多项式待定系数向量aa=polyfit(t,x,m);%用x减去多项式系数a生成的趋势项y=x-polyval(a,t);%将分成2行1列的图形窗口的第1列设为当前绘图区域subplot(2,1,1);%绘制x对于t的时程曲线图形plot(t,x);%在图幅上添加坐标网格grid on;%将分成2行1列的图形窗口的第2列设为当前绘图区域subplot(2,1,2);%绘制y对于t的时程曲线图形plot(t,y);%在图幅上添加坐标网格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);程序4-2%五点滑动平均法平滑处理%%%%%%%%%%%%%%%%%%%%%%clearclcclose all hidden %%%%%%%%%%%%%%%%%%%%%%fni=input('五点滑动平均法平滑处理-输入数据文件名:','s'); fid=fopen(fni,'r');sf = fscanf(fid,'%f',1); %采样频率m = fscanf(fid,'%d',1); %平滑次数fno = fscanf(fid,'%s',1);%输出数据文件名x = fscanf(fid,'%f',inf);%输入数据存成列向量status=fclose(fid);%取信号数据长度n=length(x);%建立离散时间列向量t=(0:1/sf:(n-1)/sf)';%将x赋值给aa=x;%循环m次进行平滑处理计算for k=1:mb(1)=(3*a(1)+2*a(2)+a(3)-a(4))/5;b(2)=(4*a(1)+3*a(2)+2*a(3)+a(4))/10;for j=3:n-2b(j)=(a(j-2)+a(j-1)+a(j)+a(j+1)+a(j+2))/5;endb(n-1)=(a(n-3)+2*a(n-2)+3*a(n-1)+4*a(n))/10;b(n)=(-a(n-3)+a(n-2)+2*a(n-1)+3*a(n))/5;a=b;end%将a赋值给yy=a;%将分成2行1列的图形窗口的第1列设为当前绘图区域subplot(2,1,1);%绘制平滑前的时程曲线图形plot(t,x);%添加横向坐标轴的标注xlabel('时间(s)');%添加纵向坐标轴的标注ylabel('加速度(g)');%在图幅上添加坐标网格grid on;%将分成2行1列的图形窗口的第2列设为当前绘图区域subplot(2,1,2);%绘制平滑后的时程曲线图形plot(t,y);%添加横向坐标轴的标注xlabel('时间(s)');%添加纵向坐标轴的标注ylabel('加速度(g)');%在图幅上添加坐标网格grid on;%打开文件输出平滑后的数据fid=fopen(fno,'w');for k=1:n%每行写两个实型数据,t为时间,y为平滑后的数据fprintf(fid,'%f %f\n',t(k),y(k));endstatus=fclose(fid);程序4-2%五点滑动平均法平滑处理%%%%%%%%%%%%%%%%%%%%%%clearclcclose all hidden %%%%%%%%%%%%%%%%%%%%%%fni=input('五点滑动平均法平滑处理-输入数据文件名:','s'); fid=fopen(fni,'r');sf = fscanf(fid,'%f',1); %采样频率m = fscanf(fid,'%d',1); %平滑次数fno = fscanf(fid,'%s',1);%输出数据文件名x = fscanf(fid,'%f',inf);%输入数据存成列向量status=fclose(fid);%取信号数据长度n=length(x);%建立离散时间列向量t=(0:1/sf:(n-1)/sf)';%将x赋值给aa=x;%循环m次进行平滑处理计算for k=1:mb(1)=(3*a(1)+2*a(2)+a(3)-a(4))/5;b(2)=(4*a(1)+3*a(2)+2*a(3)+a(4))/10;for j=3:n-2b(j)=(a(j-2)+a(j-1)+a(j)+a(j+1)+a(j+2))/5;endb(n-1)=(a(n-3)+2*a(n-2)+3*a(n-1)+4*a(n))/10;b(n)=(-a(n-3)+a(n-2)+2*a(n-1)+3*a(n))/5;a=b;end%将a赋值给yy=a;%将分成2行1列的图形窗口的第1列设为当前绘图区域subplot(2,1,1);%绘制平滑前的时程曲线图形plot(t,x);%添加横向坐标轴的标注xlabel('时间(s)');%添加纵向坐标轴的标注ylabel('加速度(g)');%在图幅上添加坐标网格grid on;%将分成2行1列的图形窗口的第2列设为当前绘图区域subplot(2,1,2);%绘制平滑后的时程曲线图形plot(t,y);%添加横向坐标轴的标注xlabel('时间(s)');%添加纵向坐标轴的标注ylabel('加速度(g)');%在图幅上添加坐标网格grid on;%打开文件输出平滑后的数据fid=fopen(fno,'w');for k=1:n%每行写两个实型数据,t为时间,y为平滑后的数据fprintf(fid,'%f %f\n',t(k),y(k));endstatus=fclose(fid);程序4-3%滑动平均法消除趋势项%%%%%%%%%%%%%%%%%%%%%%%%%%%clearclcclose all hidden %%%%%%%%%%%%%%%%%%%%%%fni=input('滑动平均法消除趋势项-输入数据文件名:','s'); fid=fopen(fni,'r');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);%信号两端分别向外延伸l个数据a=[b*x(1),x,b*x(n)];b=a;%按平滑次数循环进行滑动平均处理计算趋势项for k=1:mfor j=l+1:n-lb(j)=mean(a(j-l:j+l));enda=b;end%用输入信号x减去与平滑趋势项ay=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));endstatus=fclose(fid);程序4-4%五点三次法平滑处理(时域和频域) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%clearclcclose all hidden %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%fni=input('五点三次平滑处理-输入数据文件名:','s');fid=fopen(fni,'r');sf = fscanf(fid,'%f',1); %采样频率it = fscanf(fid,'%d',1); %数据类型(1时域,2频域)m = fscanf(fid,'%d',1); %平滑次数fno = fscanf(fid,'%s',1); %输出数据文件名x = fscanf(fid,'%f',[it,inf]);%输入数据存成行向量status=fclose(fid);%取信号数据长度n=length(x(1,:));for l=1:ita=x(l,:);%循环m次进行平滑处理for k=1:mb(1)=(69*a(1)+4*(a(2)+a(4))-6*a(3)-a(5))/70;b(2)=(2*(a(1)+a(5))+27*a(2)+12*a(3)-8*a(4))/35;for j=3:n-2b(j)=(-3*(a(j-2)+a(j+2))+12*(a(j-1)+a(j+1))+17*a(j))/35;endb(n-1)=(2*(a(n)+a(n-4))+27*a(n-1)+12*a(n-2)-8*a(n-3))/35;b(n)=(69*a(n)+4*(a(n-1)+a(n-3))-6*a(n-2)-a(n-4))/70;a=b;endy(l,:)=a;end%绘制平滑前后的曲线图形if it==1 %时域信号%建立离散时间向量nn=1:2000;t=0:1/sf:(n-1)/sf;%同时绘制x对于t和y对于t的时域曲线plot(t(nn),x(nn),':',t(nn),y(nn));xlabel('时间(s)'); %添加横向坐标轴的标注ylabel('幅值'); %添加纵向坐标轴的标注legend('平滑前','平滑后');%在图幅上添加图例grid on;else %频域信号%建立离散频率向量nn=1:256;f=0:sf/n:(n-1)*sf/n;%同时绘制x的实部对于f和y的实部对于f的频域曲线subplot(2,1,1);plot(f(nn),x(1,nn),':',f(nn),y(1,nn));xlabel('频率(Hz)'); %添加横向坐标轴的标注ylabel('实部'); %添加纵向坐标轴的标注legend('平滑前','平滑后');%在图幅上添加图例grid on;%同时绘制x的虚部对于f和y的虚部对于f的频域曲线subplot(2,1,2);plot(f(nn),x(2,nn),':',f(nn),y(2,nn));xlabel('频率(Hz)'); %添加横向坐标轴的标注ylabel('虚部'); %添加纵向坐标轴的标注legend('平滑前','平滑后');%在图幅上添加图例grid on;end%打开文件输出平滑后的数据fid=fopen(fno,'w');for k=1:nif it==1 %时域信号输出时间和幅值fprintf(fid,'%f %f\n',t(k),y(k));else %频域信号输出频率、实部和虚部fprintf(fid,'%f %f %f\n',f(k),y(1,k),y(2,k));endendstatus=fclose(fid);程序5-1%频域低通和带通滤波%%%%%%%%%%%%%%%%%%%%%%clearclcclose all hidden %%%%%%%%%%%%%%%%%%%%%%fni=input('频域带通滤波-输入数据文件名:','s');fid = fopen(fni,'r');sf = fscanf(fid,'%f',1); %采样频率fmin = fscanf(fid,'%f',1); %最小截止频率fmax = fscanf(fid,'%f',1); %最大截止频率sx = fscanf(fid,'%s',1); %读入横向坐标轴的标注sy = 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);%四舍五入取整求最小截止频率对应数组元素的下标ni=round(fmin*nfft/sf+1);%四舍五入取整求最大截止频率对应数组元素的下标na=round(fmax*nfft/sf+1);%进行FFT变换,结果存于yy=fft(x,nfft);%建立一个长度为nfft元素全为0的向量a=zeros(1,nfft);%将y的正频率带通内的元素赋值给aa(ni:na)=y(ni:na);%将y的负频率带通内的元素赋值给aa(nfft-na+1:nfft-ni+1)=y(nfft-na+1:nfft-ni+1);%进行FFT逆变换,结果存于yy=ifft(a,nfft);%取逆变换的实部n个元素为滤波结果列向量y=(real(y(1:n)))';%绘制滤波前的时程曲线图形subplot(2,1,1);plot(t,x);%添加横向坐标轴的标注xlabel(sx);%添加纵向坐标轴的标注ylabel(sy);grid on;%绘制滤波后的时程曲线图形subplot(2,1,2);plot(t,y);%添加横向坐标轴的标注xlabel(sx);%添加纵向坐标轴的标注ylabel(sy);grid on;%打开文件输出滤波后的数据fid=fopen(fno,'w');for k=1:nfprintf(fid,'%f %f\n',t(k),y(k));endstatus=fclose(fid);程序5-2%频域高通和带阻滤波%%%%%%%%%%%%%%%%%%%%%%%%%%%clearclcclose all hidden %%%%%%%%%%%%%%%%%%%%%%fni=input('频域带阻滤波-输入数据文件名:','s');fid=fopen(fni,'r');sf = fscanf(fid,'%f',1); %采样频率fmin = fscanf(fid,'%f',1); %最小截止频率fmax = fscanf(fid,'%f',1); %最大截止频率sx = fscanf(fid,'%s',1); %读入横向坐标轴的标注sy = 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);%四舍五入取整求最小截止频率对应数组元素的下标ni=round(fmin*nfft/sf+1);%四舍五入取整求最大截止频率对应数组元素的下标na=round(fmax*nfft/sf+1);%进行FFT变换,结果存于yy=fft(x,nfft);%建立一个长度为nfft元素全为0的向量a=zeros(1,nfft);%将y的正频率带阻内的元素赋值为0y(ni:na)=a(ni:na);%将y的负频率带阻内的元素赋值为0y(nfft-na+1:nfft-ni+1)=a(nfft-na+1:nfft-ni+1);%进行IFFT变换,结果存于aa=ifft(y,nfft);%取逆变换的实部n个元素为滤波结果列向量y=real(a(1:n));%绘制滤波前的时程曲线图形subplot(2,1,1);plot(t,x);%添加横向坐标轴的标注xlabel(sx);%添加纵向坐标轴的标注ylabel(sy);grid on;%绘制滤波后的时程曲线图形subplot(2,1,2);plot(t,y);%添加横向坐标轴的标注xlabel(sx);%添加纵向坐标轴的标注ylabel(sy);grid on;%打开文件输出滤波后的数据fid=fopen(fno,'w');for k=1:nfprintf(fid,'%f %f\n',t(k),y(k));endstatus=fclose(fid);程序5-3%运用完全设计法的IIR滤波器滤波%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clearclcclose all hidden %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%fni=input('运用完全设计法的IIR滤波器滤波-输入数据文件名:','s'); fid=fopen(fni,'r');fs = fscanf(fid,'%f',1); %采样频率%滤波方式选择(1低通,2高通,3带通,4带阻)fun = fscanf(fid,'%d',1);%滤波器选择(1巴特沃斯,2切比雪夫Ⅰ,3切比雪夫Ⅱ,4椭圆)mod = fscanf(fid,'%d',1);if fun<=2wp = fscanf(fid,'%f',1);%通带截止频率(Hz)ws = fscanf(fid,'%f',1);%阻带截止频率(Hz)elsewp = fscanf(fid,'%f',2);%通带截止频率(Hz)ws = fscanf(fid,'%f',2);%阻带截止频率(Hz)endrp = fscanf(fid,'%f',1); %通带波动系数(dB)rs = fscanf(fid,'%f',1); %阻带衰减系数(dB)fno = fscanf(fid,'%s',1); %输出数据文件名x = fscanf(fid,'%f',[1,inf]);%输入数据存成行向量status=fclose(fid);%确定滤波方式switch funcase 1 %低通ft='low';case 2 %高通ft='high';case 3 %带通ft='bandpass';case 4 %带阻ft='stop';otherwiseft='low';end%根据滤波器种类进行IIR滤波器设计switch mod%巴特沃斯滤波器case 1[n wn]=buttord(wp/(fs/2),ws/(fs/2),rp,rs);[b a]= butter(n,wn,ft);%切比雪夫Ⅰ型滤波器case 2[n wn]=cheb1ord(wp/(fs/2),ws/(fs/2),rp,rs);[b a]= cheby1(n,rp,wn,ft);%切比雪夫Ⅱ型滤波器case 3[n wn]=cheb2ord(wp/(fs/2),ws/(fs/2),rp,rs);[b a]= cheby2(n,rs,wn,ft);%椭圆滤波器case 4[n wn]=ellipbuttord(wp/(fs/2),ws/(fs/2),rp,rs);[b a]= ellip(n,rp,rs,wn,ft);end%计算滤波器的频率响应[h w]=freqz(b,a,1024,fs);m=length(x);t=0:1/fs:(m-1)/fs;%用设计出的滤波器进行滤波y=filter(b,a,x);%绘制滤波器的频率响应图subplot(2,1,1);plot(w,abs(h));%添加横向坐标轴的标注xlabel('频率(Hz)');%添加纵向坐标轴的标注ylabel('幅值');%在图幅上添加坐标网格grid on;%绘制滤波前后的信号时程图subplot(2,1,2);plot(t,x,':',t,y);%添加横向坐标轴的标注xlabel('时间(s)');%添加纵向坐标轴的标注ylabel('加速度(g)');%在图幅上添加图例legend('滤波前','滤波后');grid on;%打开文件输出滤波后的数据fid=fopen(fno,'w');for k=1:mfprintf(fid,'%f %f \n',t(k),y(k));endstatus=fclose(fid);程序5-4%多带FIR滤波器滤波%%%%%%%%%%%%%%%%%%%%%%%%%%%clearclcclose all %%%%%%%%%%%%%%%%%%%%%%%%%%%fni=input('多带FIR滤波器滤波-输入数据文件名:','s');fid=fopen(fni,'r');fs = fscanf(fid,'%f',1); %采样频率%滤波器函数选择(1=fir2,2=firls,3=remez,4=cremez)mod = fscanf(fid,'%d',1);n = fscanf(fid,'%d',1); %滤波器阶数k = fscanf(fid,'%d',1); %频率点数f = fscanf(fid,'%f',k); %指定频率点(Hz)%通阻状态(0=阻or 1=通),对于函数cremez为期望幅值a = fscanf(fid,'%f',k);w = fscanf(fid,'%f',k/2); %权向量fno = fscanf(fid,'%s',1); %输出数据文件名%输入数据存成行向量(1加噪信号,2原始信号)x = fscanf(fid,'%f',[2,inf]);status=fclose(fid);m=length(x(1,:));t=0:1/fs:(m-1)/fs;%频率归一化处理f=2*f/fs;%多带FIR滤波器设计switch modcase 1 %fir2滤波函数b= fir2(n,f,a);case 2 %firls滤波函数b= firls(n,f,a,w);case 3 %remez滤波函数b= remez(n,f,a,w);case 4 %cremez滤波函数b= cremez(n,f,a,w,'real');end%用多带FIR滤波器进行滤波v=filter(b,1,x(1,:));%消除延时处理y=zeros(1,m);y(1:m-n/2)=v(n/2+1:m);%计算滤波器的频率响应[h w]=freqz(b,1,1024,fs);%绘制滤波器的频率响应图subplot(2,1,1)plot(w,abs(h));%添加横向坐标轴的标注xlabel('频率(Hz)');%添加纵向坐标轴的标注ylabel('幅值');grid on;%绘制滤波前后的信号时程比较图subplot(2,1,2)nn=1:200;plot(t(nn),x(1,nn),'-.',t(nn),x(2,nn),':',t(nn),y(nn)); %添加横向坐标轴的标注xlabel('时间(s)');%添加纵向坐标轴的标注ylabel('幅值');%在图幅上添加图例legend('加噪信号','原始信号','滤波信号');grid on;%打开文件输出滤波后的数据fid=fopen(fno,'w');for k=1:mfprintf(fid,'%f %f \n',t(k),y(k));endstatus=fclose(fid);程序5-5%频域积分%%%%%%%%%%%%%%%%%%%%%%%%%%% clearclcclose 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%进行一次积分的相位变换real(y)=imag(a);imag(y)=-real(a);enda=zeros(1,nfft);%消除指定正频带外的频率成分a(ni:na)=y(ni:na);%消除指定负频带外的频率成分a(nfft-na+1:nfft-ni+1)=y(nfft-na+1:nfft-ni+1);%IFFT变换y=ifft(a,nfft);%取逆变换的实部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:nfprintf(fid,'%f %f\n',t(k),y(k));endstatus=fclose(fid);程序5-6%频域微分%%%%%%%%%%%%%%%%%%%%%%%%%%%clearclcclose all hiddenformat long %%%%%%%%%%%%%%%%%%%%%%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=y.*w;if it==2%进行二次微分的相位变换y=-a;else%进行一次微分的相位变换real(y)=imag(a);imag(y)=-real(a);enda=zeros(1,nfft);%消除指定正频带外的频率成分a(ni:na)=y(ni:na);%消除指定负频带外的频率成分a(nfft-na+1:nfft-ni+1)=y(nfft-na+1:nfft-ni+1);%IFFT变换y=ifft(a,nfft);%取逆变换的实部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:nfprintf(fid,'%f %f\n',t(k),y(k));endstatus=fclose(fid);程序5-7%相关函数%%%%%%%%%%%%%%%%%%%%%%%%%%%clearclcclose all hidden %%%%%%%%%%%%%%%%%%%%%%fni=input('相关函数-输入数据文件名:','s');fid=fopen(fni,'r');sf = fscanf(fid,'%f',1); %采样频率%分析内容(1=自相关,2=互相关)fun = fscanf(fid,'%d',1);m = fscanf(fid,'%d',1); %相关数据长度(点数)fno = fscanf(fid,'%s',1); %输出数据文件名x = fscanf(fid,'%f',[fun,inf]);%输入数据存成行向量status=fclose(fid);n=length(x(1,:));%建立离散时间向量t=0:1/sf:(n-1)/sf;if fun==1%计算自相关函数向量a=xcorr(x(1,:),m);else%计算互相关函数向量a=xcorr(x(1,:),x(2,:),m);end%取正频率段的相关函数y=a(m+1:2*m+1);%绘制输入数据的时程曲线图形subplot(2,1,1);nn=1:4000;if fun==1plot(t(nn),x(1,nn));elseplot(t(nn),x(1,nn),':',t(nn),x(2,nn));legend('x','y');endgrid on;%绘制相关函数曲线图形subplot(2,1,2);nn=1:m;plot(t(nn),y(nn));grid on;%打开文件输出相关函数数据fid=fopen(fno,'w');for k=1:mfprintf(fid,'%f %f\n',t(k),y(k));endstatus=fclose(fid);程序6-1%随机信号谱分析%%%%%%%%%%%%%%%%%%%%%%%%%%% clearclcclose all hiddenformat long %%%%%%%%%%%%%%%%%%%%%%fni=input('随机信号谱分析-输入数据文件名:','s'); fid=fopen(fni,'r');%分析内容(1=自谱,2=互谱,3=频响函数,4=相干函数) fun = fscanf(fid,'%d',1);sf = fscanf(fid,'%f',1); %采样频率nfft = fscanf(fid,'%d',1);%FFT长度%窗函数(1=矩形,2=汉宁,3=海明,4=布莱克曼,5=三角) win = fscanf(fid,'%d',1);fno = fscanf(fid,'%s',1); %输出数据文件名%按行读入数据,第1行激励,第2行响应a = fscanf(fid,'%f',[2,inf]);status=fclose(fid);%取激励信号向量x=a(1,:);%取相对的响应信号向量y=a(2,:)-a(1,:);%建立频率向量f=0:sf/nfft:sf/2-sf/nfft;%加窗处理switch wincase 1 %矩形窗w=boxcar(nfft);case 2 %汉宁窗w=hanning(nfft);case 3 %海明窗w=hamming(nfft);case 4 %布莱克曼窗w=blackman(nfft);case 5 %三角窗w=triang(nfft);otherwisew=boxcar(nfft);endswitch funcase 1 %计算自谱函数z=psd(y,nfft,sf,w,nfft/2);case 2 %计算互谱函数z=csd(x,y,nfft,sf,w,nfft/2);case 3 %计算频响函数z=tfe(x,y,nfft,sf,w,nfft/2);case 4 %计算相干函数z=cohere(x,y,nfft,sf,w,nfft/2);otherwise;end%绘制幅频曲线图nn=1:nfft/4;subplot(2,1,1);plot(f(nn),abs(z(nn)));xlabel('频率(Hz)');ylabel('幅值');grid on;if fun>1&fun<4%绘制相频曲线图subplot(2,1,2);plot(f(nn),angle(z(nn)));xlabel('频率(Hz)');ylabel('相位');grid on;end%以写的方式打开文件或建立一个新文件fid=fopen(fno,'w');%输出自谱和相干函数数据if fun>1&fun<4for k=1:nfft/2%每行输出2个实型数据,f为频率,z为幅值fprintf(fid,'%f %f\n',f(k),abs(z(k)));end%输出互谱和频响函数数据elsefor k=1:nfft/2%每行输出3个实型数据,f为频率,z的实、虚部fprintf(fid,'%f %f %f\n',f(k),real(z(k)),imag(z(k)));endendstatus=fclose(fid);程序6-2%窗函数(MATLAB中没有这些窗函数)%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clearclcclose all hidden %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fni=input('窗函数-输入数据文件名:','s');fid=fopen(fni,'r');n = fscanf(fid,'%d',1); %数据长度%窗函数(1=余弦坡度窗,2=帕曾窗,3=指数窗,4=高斯窗) win = fscanf(fid,'%d',1);%参数(除指数类窗需要输入参数外其余输入1)c = fscanf(fid,'%f',1);fno = fscanf(fid,'%s',1);%输出数据文件名status=fclose(fid);%建立数据长度向量l=0:n-1;%计算窗函数switch wincase 1 %余弦坡度窗m=round(n*4/5);w=[ones(1,m),(1+cos(5*pi*l(m:n-1)/n))/2];case 2 %帕曾窗w=[1-6*(l(1:n/2)/n).^2+6*(l(1:n/2)/n).^3,2*(1-l(n/2+1:n)/n).^3]; case 3 %指数窗w=exp(-c*l);case 4 %高斯窗w=exp(-c*l.^2);end%绘制窗函数曲线图形plot(l/n,w);grid on;%打开文件输出窗函数的数据fid=fopen(fno,'w');for k=1:nfprintf(fid,'%d %f\n',k,w(k));endstatus=fclose(fid);程序6-3%细化FFT %%%%%%%%%%%%%%%%%%%%%%%%%%%clearclcclose all hiddenformat long %%%%%%%%%%%%%%%%%%%%%%fni=input('细化FFT处理-输入数据文件名(20041010):','s');fid=fopen(fni,'r');fs = fscanf(fid,'%f',1); %采样频率fi = fscanf(fid,'%f',1); %最小细化截止频率np = fscanf(fid,'%d',1); %放大倍数nfft = fscanf(fid,'%d',1); %FFT长度fno = fscanf(fid,'%s',1); %输出数据文件名x = fscanf(fid,'%f',[1,inf]); %按行读入原始信号数据status=fclose(fid);%计算输入数据长度nt=length(x);%最大细化截止频率fa=fi+0.5*fs/np;%取大于nt且与nt最接近的2的整数次方为FFT长度nf=2^nextpow2(nt);%确定细化带宽的数据长度na=round(0.5*nf/np+1);%频移%建立一个按1递增的向量n=0:nt-1;%确定单位旋转因子向量b=n*pi*(fi+fa)/fs;%乘以单位旋转因子进行频移y=x.*exp(-i*b);%频移后的低通滤波(频域滤波)%FFT变换b=fft(y,nf);%正频率带通内的元素赋值a(1:na)=b(1:na);%负频率带通内的元素赋值a(nf-na+1:nf)=b(nf-na+1:nf);%IFFT变换b=ifft(a,nf);%重采样c=b(1:np:nt);%进行细化FFT变换a=fft(c,nfft)*2/nfft;%变换结果重新排序y2=zeros(1,nfft/2);%排列负频率段的数据y2(1:nfft/4)=a(nfft-nfft/4+1:nfft);%排列正频率段的数据y2(nfft/4+1:nfft/2)=a(1:nfft/4);n=0:(nfft/2-1);%定义细化FFT频率向量f2=fi+n*2*(fa-fi)/nfft;%对输入数据做FFT用来变换比较%FFT变换y1=fft(x,nfft)*2/nfft;f1=n*fs/nfft;%定义与细化FFT频率向量相同的频率范围ni=round(fi*nfft/fs+1);na=round(fa*nfft/fs+1);%绘制输入时程曲线图形subplot(2,1,1);t=0:1/fs:(nt-1)/fs;plot(t,x);xlabel('时间(s)');ylabel('幅值');grid on;%在相同的频率范围下绘制幅频曲线图nn=ni:na;plot(f1(nn),abs(y1(nn)),':',f2,abs(y2));xlabel('频率(Hz)');ylabel('幅值');legend('普通','细化');grid on;%打开文件输出细化后的数据fid=fopen(fno,'w');for k=1:nfft/2%每行输出3个实型数据,f为频率,y2的实和虚部fprintf(fid,'%f %f %f\n',f2(k),real(y2(k)),imag(y2(k))); endstatus=fclose(fid);程序6-4%三分之一倍频程处理%%%%%%%%%%%%%%%%%%%%%%%%%%%clearclcclose all hidden %%%%%%%%%%%%%%%%%%%%%%fni=input('三分之一倍频程处理-输入数据文件名:','s'); fid=fopen(fni,'r');sf = fscanf(fid,'%f',1); %采样频率fno = fscanf(fid,'%s',1); %输出数据文件名x = fscanf(fid,'%f',[1,inf]); %按行输入数据status=fclose(fid);%定义三分之一倍频程的中心频率f = [1.00 1.25 1.60 2.00 2.50 3.15 4.00 5.00 6.300 8.00]; fc =[f,10*f,100*f,1000*f,10000*f];%中心频率与下限频率的比值oc6=2^(1/6);%取中心频率总的长度nc=length(fc);%输入数据的长度n=length(x);%大于并最接近n的2的幂次方长度nfft=2^nextpow2(n);%FFT变换a=fft(x,nfft);for j=1:nc%下限频率fl=fc(j)/oc6;%上限频率fu=fc(j)*oc6;%下限频率对应的序号nl=round(fl*nfft/sf+1);%上限频率对应的序号nu=round(fu*nfft/sf+1);%如果上限频率大于折叠频率则循环中断if fu > sf/2m=j-1; breakend%以每个中心频率段为通带进行带通频域滤波b=zeros(1,nfft);b(nl:nu)=a(nl:nu);b(nfft-nu+1:nfft-nl+1)=a(nfft-nu+1:nfft-nl+1);c=ifft(b,nfft);%计算对应每个中心频率段的有效值yc(j)=sqrt(var(real(b(1:n))));end%绘制输入时程曲线图形subplot(2,1,1);t=0:1/sf:(n-1)/sf;plot(t,x);xlabel('时间(s)');ylabel('加速度(g)');grid on;%绘制三分之一倍频程有效值图形subplot(2,1,2);plot(fc(1:m),yc(1:m));xlabel('频率(Hz)');ylabel('有效值');grid on;%打开文件输出三分之一倍频程数据fid=fopen(fno,'w');for k=1:mfprintf(fid,'%f %f\n',fc(k),yc(k));endstatus=fclose(fid);程序6-5%倒频谱函数%%%%%%%%%%%%%%%%%%%%%%%%%%% clearclcclose all hidden %%%%%%%%%%%%%%%%%%%%%%fni=input('倒频谱函数-输入数据文件名:','s'); fid=fopen(fni,'r');sf = fscanf(fid,'%f',1); %采样频率%分析内容(1=实倒频谱,2=复倒频谱)fun = 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;%计算倒频谱函数if fun==1y=rceps(x); %计算实倒频谱,elsey=cceps(x); %计算复倒频谱end%绘制输入时程曲线图形subplot(2,1,1);plot(t,x);xlabel('时间(s)');ylabel('幅值');grid on;%绘制倒频谱时程曲线图形subplot(2,1,2);plot(t,y);xlabel('时间(s)');ylabel('幅值');grid on;%打开文件输出倒频谱的数据fid=fopen(fno,'w');for k=1:nfprintf(fid,'%d %f\n',t(k),y(k));endstatus=fclose(fid);程序6-6%地震信号加速度反应谱%%%%%%%%%%%%%%%%%%%%%%%%%%%clearclcclose all hiddenformat long %%%%%%%%%%%%%%%%%%%%%%fni=input('地震信号加速度反应谱-输入数据文件名:','s'); fid=fopen(fni,'r');sf = fscanf(fid,'%f',1); %采样频率dp = fscanf(fid,'%f',1); %阻尼比hf = fscanf(fid,'%f',1); %计算最高截止频率df = fscanf(fid,'%f',1); %频率间隔fno = fscanf(fid,'%s',1); %输出数据文件名xg = fscanf(fid,'%f',[1,inf]); %输入地震波数据存成行向量status=fclose(fid);%计算输入数据长度n=length(xg);%计算反应谱长度m=round(hf/df)+1;%定义频率向量f=0:df:(m-1)*df;%定义时间向量t=0:1/sf:(n-1)/sf;%计算加速度反应谱for j=0:m-1%计算单位脉冲反应w=2*pi*df*j;wd=w*sqrt(1-dp*dp);e=exp(-t*w*dp);a=t.*wd;s=sin(a).*((1-2*dp*dp)/(1-dp*dp));c=cos(a).*(2*dp/sqrt(1-dp*dp));h=wd*e.*(s+c)/sf;%用卷积计算加速度反应谱值r(j+1)=max(abs(conv(xg,h)));end%绘制输入地震波加速度曲线subplot(2,1,1);plot(t,xg);xlabel('时间(s)');ylabel('加速度(g)');grid on;%绘制地震波加速度反应谱曲线subplot(2,1,2);plot(f,r);xlabel('频率(Hz)');ylabel('加速度(g)');grid on;%打开文件输出地震波加速度反应谱数据fid=fopen(fno,'w');for k=1:m%每行输出两个实型数据,f为频率,r为反应谱值fprintf(fid,'%f %f\n',f(k),r(k));endstatus=fclose(fid);程序7-1%生成扫频信号%%%%%%%%%%%%%%%%%%%%%%%%%%% clearclcclose all %%%%%%%%%%%%%%%%%%%%%%fni=input('生成扫频信号-输入数据文件名:','s');fid=fopen(fni,'r');sf = fscanf(fid,'%f',1); %采样频率f0 = fscanf(fid,'%f',1); %最小截止频率f1 = fscanf(fid,'%f',1); %最大截止频率t0 = fscanf(fid,'%f',1); %开始时刻(s)t1 = fscanf(fid,'%f',1); %终止时刻(s)am = fscanf(fid,'%f',1); %扫频信号幅值md = fscanf(fid,'%d',1); %扫频方式(1=线性,2=对数,3=指数) fno = fscanf(fid,'%s',1); %输出数据文件名status=fclose(fid);%四舍五入取整求扫频信号开始时刻对应数组元素的下标n0=round(sf*t0)+1;%四舍五入取整求扫频信号终止时刻对应数组元素的下标n1=round(sf*t1)+1;%建立离散时间向量tt=0:1/sf:(n1-1)/sf;%按指定的扫频方式计算随时间变化频率向量switch md%计算扫频方式为线性时随时间变化频率向量case 1ft=(t-t0)./(t1-t0);%计算扫频方式为对数时随时间变化频率向量case 2ft=log(t-t0)./log(t1-t0+1);%计算扫频方式为指数时随时间变化频率向量case 3ft=exp((t-t0)./(t1-t0)-1);otherwiseft=(t-t0)./(t1-t0);end%计算随时间变化的园频率向量w=2*pi*(ft.*(f1-f0)+f0);%建立一个长度与时间长度相同元素全为0的向量y=zeros(1,n1);%计算扫频信号y(n0:n1)=am*sin(w(n0:n1).*t(n0:n1));%绘制算扫频信号随时间变化的曲线图plot(t,y);xlabel('时间(s)');ylabel('幅值');grid on;%打开文件输出扫频信号数据fid=fopen(fno,'w');for k=1:n1%每一行输出两个实型数据,t为时间,y为扫频信号值fprintf(fid,'%f %f\n',t(k),y(k));endstatus=fclose(fid);程序7-2%生成拍波信号%%%%%%%%%%%%%%%%%%%%%%%%%%%clearclcclose all hidden %%%%%%%%%%%%%%%%%%%%%%%%%%%fni=input('生成拍波信号-输入数据文件名:','s');fid=fopen(fni,'r');sf = fscanf(fid,'%f',1); %采样频率fp = fscanf(fid,'%f',1); %拍波频率np = fscanf(fid,'%d',1); %拍波个数mp = fscanf(fid,'%d',1); %每个拍波内的周波数ti = fscanf(fid,'%f',1); %拍波之间的时间间隔am = fscanf(fid,'%f',1); %拍波幅值fno = fscanf(fid,'%s',1) %输出数据文件名status=fclose(fid);%建立完整拍波的离散时间向量ts=0:1/sf:(round(sf*mp/fp)-1)/sf;%建立拍波之间的离散时间间隔向量t0=zeros(1,round(ti*sf)+1);%计算拍波圆频率向量w=2*pi*fp;%生成单个拍波的离散信号y1=am*sin(w*ts).*sin(0.5*w*ts/mp);%建立时间间隔和单个拍波信号的组合向量y=[t0,y1];%通过循环建立完整的拍波信号向量for k=1:np-1y=[y,t0,y1];end%建立与整个拍波信号长度相同的离散时间向量t=0:1/sf:(length(y)-1)/sf;%绘制拍波信号随时间变化的曲线图plot(t,y);xlabel('时间(s)');ylabel('幅值');grid on;%打开文件输出生成的拍波信号数据fid=fopen(fno,'w');for k=1:length(y)%每一行输出两个实型数据,t为时间,y为拍波信号值fprintf(fid,'%f %f\n',t(k),y(k));。