admin 管理员组

文章数量: 1087652


2024年3月7日发(作者:eof错误代码)

程序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)';

%计算趋势项的多项式待定系数向量a

a=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 %fn',t(k),y(k));

%循环体结束语句

end

%关闭数据文件

status=fclose(fid);

程序4-2

%五点滑动平均法平滑处理

%%%%%%%%%%%%%%%%%%%%%%

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)';

%将x赋值给a

a=x;

%循环m次进行平滑处理计算

for k=1:m

b(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-2

b(j)=(a(j-2)+a(j-1)+a(j)+a(j+1)+a(j+2))/5;

end

b(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赋值给y

y=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 %fn',t(k),y(k));

end

status=fclose(fid);

程序4-2

%五点滑动平均法平滑处理

%%%%%%%%%%%%%%%%%%%%%%

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)';

%将x赋值给a

a=x;

%循环m次进行平滑处理计算

for k=1:m

b(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-2

b(j)=(a(j-2)+a(j-1)+a(j)+a(j+1)+a(j+2))/5;

end

b(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赋值给y

y=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 %fn',t(k),y(k));

end

status=fclose(fid);

程序4-3

%滑动平均法消除趋势项

%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear

clc

close 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:m

for j=l+1:n-l

b(j)=mean(a(j-l:j+l));

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 %fn',t(k),y(k));

end

status=fclose(fid);

程序4-4

%五点三次法平滑处理(时域和频域)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear

clc

close 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:it

a=x(l,:);

%循环m次进行平滑处理

for k=1:m

b(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-2

b(j)=(-3*(a(j-2)+a(j+2))+12*(a(j-1)+a(j+1))+17*a(j))/35;

end

b(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;

end

y(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:n

if it==1 %时域信号输出时间和幅值

fprintf(fid,'%f %fn',t(k),y(k));

else %频域信号输出频率、实部和虚部

fprintf(fid,'%f %f %fn',f(k),y(1,k),y(2,k));

end

end

status=fclose(fid);

程序5-1

%频域低通和带通滤波

%%%%%%%%%%%%%%%%%%%%%%

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); %最大截止频率

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变换,结果存于y

y=fft(x,nfft);

%建立一个长度为nfft元素全为0的向量

a=zeros(1,nfft);

%将y的正频率带通内的元素赋值给a

a(ni:na)=y(ni:na);

%将y的负频率带通内的元素赋值给a

a(nfft-na+1:nfft-ni+1)=y(nfft-na+1:nfft-ni+1);

%进行FFT逆变换,结果存于y

y=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:n

fprintf(fid,'%f %fn',t(k),y(k));

end

status=fclose(fid);

程序5-2

%频域高通和带阻滤波

%%%%%%%%%%%%%%%%%%%%%%%%%%%

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); %最大截止频率

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变换,结果存于y

y=fft(x,nfft);

%建立一个长度为nfft元素全为0的向量

a=zeros(1,nfft);

%将y的正频率带阻内的元素赋值为0

y(ni:na)=a(ni:na);

%将y的负频率带阻内的元素赋值为0

y(nfft-na+1:nfft-ni+1)=a(nfft-na+1:nfft-ni+1);

%进行IFFT变换,结果存于a

a=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:n

fprintf(fid,'%f %fn',t(k),y(k));

end

status=fclose(fid);

程序5-3

%运用完全设计法的IIR滤波器滤波

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear

clc

close 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<=2

wp = fscanf(fid,'%f',1);%通带截止频率(Hz)

ws = fscanf(fid,'%f',1);%阻带截止频率(Hz)

else

wp = fscanf(fid,'%f',2);%通带截止频率(Hz)

ws = fscanf(fid,'%f',2);%阻带截止频率(Hz)

end

rp = 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 fun

case 1 %低通

ft='low';

case 2 %高通

ft='high';

case 3 %带通

ft='bandpass';

case 4 %带阻

ft='stop';

otherwise

ft='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:m

fprintf(fid,'%f %f n',t(k),y(k));

end

status=fclose(fid);

程序5-4

%多带FIR滤波器滤波

%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear

clc

close 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 mod

case 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:m

fprintf(fid,'%f %f n',t(k),y(k));

end

status=fclose(fid);

程序5-5

%频域积分

%%%%%%%%%%%%%%%%%%%%%%%%%%%

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

%进行一次积分的相位变换

real(y)=imag(a);

imag(y)=-real(a);

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);

%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:n

fprintf(fid,'%f %fn',t(k),y(k));

end

status=fclose(fid);

程序5-6

%频域微分

%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear

clc

close all hidden

format 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);

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);

%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:n

fprintf(fid,'%f %fn',t(k),y(k));

end

status=fclose(fid);

程序5-7

%相关函数

%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear

clc

close 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==1

plot(t(nn),x(1,nn));

else

plot(t(nn),x(1,nn),':',t(nn),x(2,nn));

legend('x','y');

end

grid on;

%绘制相关函数曲线图形

subplot(2,1,2);

nn=1:m;

plot(t(nn),y(nn));

grid on;

%打开文件输出相关函数数据

fid=fopen(fno,'w');

for k=1:m

fprintf(fid,'%f %fn',t(k),y(k));

end

status=fclose(fid);

程序6-1

%随机信号谱分析

%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear

clc

close all hidden

format 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 win

case 1 %矩形窗

w=boxcar(nfft);

case 2 %汉宁窗

w=hanning(nfft);

case 3 %海明窗

w=hamming(nfft);

case 4 %布莱克曼窗

w=blackman(nfft);

case 5 %三角窗

w=triang(nfft);

otherwise

w=boxcar(nfft);

end

switch fun

case 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<4

for k=1:nfft/2

%每行输出2个实型数据,f为频率,z为幅值

fprintf(fid,'%f %fn',f(k),abs(z(k)));

end

%输出互谱和频响函数数据

else

for k=1:nfft/2

%每行输出3个实型数据,f为频率,z的实、虚部

fprintf(fid,'%f %f %fn',f(k),real(z(k)),imag(z(k)));

end

end

status=fclose(fid);

程序6-2

%窗函数(MATLAB中没有这些窗函数)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear

clc

close 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 win

case 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:n

fprintf(fid,'%d %fn',k,w(k));

end

status=fclose(fid);

程序6-3

%细化FFT

%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear

clc

close all hidden

format long

%%%%%%%%%%%%%%%%%%%%%%

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 %fn',f2(k),real(y2(k)),imag(y2(k)));

end

status=fclose(fid);

程序6-4

%三分之一倍频程处理

%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear

clc

close 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/2

m=j-1; break

end

%以每个中心频率段为通带进行带通频域滤波

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:m

fprintf(fid,'%f %fn',fc(k),yc(k));

end

status=fclose(fid);

程序6-5

%倒频谱函数

%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear

clc

close 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==1

y=rceps(x); %计算实倒频谱,

else

y=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:n

fprintf(fid,'%d %fn',t(k),y(k));

end

status=fclose(fid);

程序6-6

%地震信号加速度反应谱

%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear

clc

close all hidden

format 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 %fn',f(k),r(k));

end

status=fclose(fid);

程序7-1

%生成扫频信号

%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear

clc

close 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;

%建立离散时间向量t

t=0:1/sf:(n1-1)/sf;

%按指定的扫频方式计算随时间变化频率向量

switch md

%计算扫频方式为线性时随时间变化频率向量

case 1

ft=(t-t0)./(t1-t0);

%计算扫频方式为对数时随时间变化频率向量

case 2

ft=log(t-t0)./log(t1-t0+1);

%计算扫频方式为指数时随时间变化频率向量

case 3

ft=exp((t-t0)./(t1-t0)-1);

otherwise

ft=(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 %fn',t(k),y(k));

end

status=fclose(fid);

程序7-2

%生成拍波信号

%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear

clc

close 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-1

y=[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 %fn',t(k),y(k));

end

status=fclose(fid);

程序7-3

%生成白噪声信号

%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear

clc

close all hidden

%%%%%%%%%%%%%%%%%%%%%%%%%%%

fni=input('生成白噪声信号-输入数据文件名:','s');

fid=fopen(fni,'r');

sf = fscanf(fid,'%f',1); %采样频率

fi = fscanf(fid,'%f',1); %最小截止频率

fa = fscanf(fid,'%f',1); %最大截止频率

tl = fscanf(fid,'%f',1); %时间长度(秒)

am = fscanf(fid,'%f',1); %最大幅值

fno = fscanf(fid,'%s',1); %输出数据文件名

status=fclose(fid);

%计算白噪声信号数据长度n

n=round(sf*tl)+1;

%建立信号离散时间向量t

t=0:1/sf:(n-1)/sf;

%大于并最接近n的2的幂次方为FFT长度

nfft=2^nextpow2(n);

%四舍五入取整求最小截止频率对应数组元素的下标

ni=round(fi*nfft/sf+1);

%四舍五入取整求最大截止频率对应数组元素的下标

na=round(fa*nfft/sf+1);

%建立一个长度为nfft/2元素全为0的向量

r=zeros(1,nfft/2);

%将r的正频率带通内的元素赋值1,生成幅值谱

r(ni:na)=1;

%生成0~2pi的随机数为随机相位

a=2*pi*rand(1,nfft/2);

%将幅值谱和相位谱转换成实部和虚部

b=r.*exp(i*a)*nfft/2;

%将正负圆频率向量组合成一个向量

a=[b,b(nfft/2:-1:1)];

%IFFT变换,并取实部为生成白噪声信号

x=real(ifft(a,nfft));

%取指定长度的数据并使数据的最大值为指定的幅值

y=am*x(1:n)/max(abs(x(1:n)));

%定义自功率谱的FFT长度

nft=1024;

%计算生成白噪声信号自功率谱

y1=psd(y,nft,sf,boxcar(nft),nft/2);

%定义自功率谱的离散频率向量

f=0:sf/nft:(nft/2-1)*sf/nft;

%绘制白噪声信号随时间变化的曲线图

subplot(2,1,1);

plot(t,y);

xlabel('时间 (s)');

ylabel('幅值');

grid on;

%绘制自功率谱曲线图

subplot(2,1,2);

plot(f(1:nft/4),y1(1:nft/4));

xlabel('频率 (Hz)');

ylabel('幅值');

grid on;

%打开文件输出生成的白噪声信号数据

fid=fopen(fno,'w');

for k=1:n

%每一行输出两个实型数据,t为时间,y为白噪声信号值

fprintf(fid,'%f %fn',t(k),y(k));

end

status=fclose(fid);

程序7-4

%生成加速度人工地震波

%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear

clc

close all hidden

%%%%%%%%%%%%%%%%%%%%%%

fid=fopen(fni,'r');

fs = fscanf(fid,'%f',1); %采样频率

tu = fscanf(fid,'%f',1); %上升时间长度

%上升时间包络线线形(1-直线、2-抛物线、3-指数曲线)

iu = fscanf(fid,'%f',1);

%上升时间包络线线形参数(只有指数曲线需要具体参数,其余均为1)

cu = fscanf(fid,'%f',1);

ta = fscanf(fid,'%f',1); %持续时间长度

td = fscanf(fid,'%f',1); %下降时间长度

%下降时间包络线线形(1-直线、2-抛物线、3-指数曲线)

id = fscanf(fid,'%f',1);

%下降时间包络线线形参数(只有抛物线,指数曲线需要具体参数,其余为1)

cd = fscanf(fid,'%f',1);

dp = fscanf(fid,'%f',1); %阻尼比值

p = fscanf(fid,'%f',1); %概率系数(一般可取p=0.85)

nn = fscanf(fid,'%d',1); %迭代次数

fno = fscanf(fid,'%s',1);%输出数据文件名

x = fscanf(fid,'%f',[2,inf]);%反应谱频率和幅值数据

tatus=fclose(fid);

%计算地震波总的时间长度

tl=tu+ta+td;

%计算生成地震波的数据长度

nt=round(fs*tl+1);

%大于并最接近nt的2的幂次方为FFT长度

nfft=2^nextpow2(nt);

%计算频率间隔(Hz)

df=fs/nfft;

%定义反应谱的离散频率向量

f=0:df:(nfft/2-1)*df;

%计算时间间隔(s)

dt=1/fs;

%定义的离散时间向量

t=0:dt:(nt-1)*dt;

%生成0~2pi的随机数为随机相位

g=rand(1,nfft/2)*2*pi;

%建立时间包络线

%建立与地震波长度相同元素全为1的向量

en=ones(1,nt);

%上升时间阶段

%确定上升时间段的长度

l=round(tu*fs)+1;

%产生上升时间段的包络线数组元素

switch iu

case 1 %直线

en(1:l)=linspace(0,1,l);

case 2 %抛物线

a=0:l-1;

en(1:l)=(a/(l-1)).^2;

case 3 %指数曲线

a=0:l-1;

en(1:l)=1-exp(-cu*a/(l-1));

end

%持续时间阶段

%确定0时刻到持续结束时刻的时间段的长度

m=round((tu+ta)*fs)+1;

%下降时间阶段

%产生下降时间段的包络线数组元素

switch id

case 1 %直线、

en(m:nt)=linspace(1,0,nt-m+1);

case 2 %抛物线

a=0:nt-m;

en(m:nt)=1-cd*(a/(nt-m)).^2;

case 3 %指数曲线

a=0:nt-m;

en(m:nt)=exp(-cd*a/(nt-m));

end

%按线性插值建立目标反应谱离散数据

%按目标反应谱的长度生成元素全为0的向量

a0=zeros(1,nfft/2);

%取目标反应谱数据的长度

n=length(x(1,:));

%四舍五入取整求反应谱最小频率对应数组元素的下标

nb=round(x(1,1)/df)+1;

%四舍五入取整求反应谱最大频率对应数组元素的下标

ne=round(x(1,n)/df)+1;

for k=1:n-1

%四舍五入取整求反应谱前一个频率数据对应数组元素的下标

l=round(x(1,k)/df)+1;

%四舍五入取整求反应谱后一个频率数据对应数组元素的下标

m=round(x(1,k+1)/df)+1;

%线性插值产生前后两个频率数据间反应谱数组元素

a0(l:m)=linspace(x(2,k),x(2,k+1),m-l+1);

end

%根据目标反应谱计算对应的近似功率谱

a1=a0;

s=zeros(1,nfft/2);

k=nb:ne;

s(k)=2*dp/pi.*(a1(k).^2)./f(k)./(-2*log(-(log(p)*pi/tl)./f(k)));

%将功率谱转换成傅立叶幅值谱

b1=sqrt(4*df*s)*nfft/2;

%定义元素全为0的反应谱传递函数矩阵,

hf=zeros(ne,nfft);

%计算加速度反应谱传递函数矩阵

for j=0:ne-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)/fs;

%通过FFT变换求加速度反应谱传递函数向量

hf(j+1,:)=fft(h,nfft);

end

mm=nn;

%进行生成人工地震波迭代计算

%100为最大迭代次数

for k=1:100

%将幅值谱和相位谱转换成实部和虚部

c=b1.*exp(i*g);

%将正负圆频率傅立叶谱向量组合成一个向量

d=[c,c(nfft/2:-1:1)];

%IFFT变换,并取变换结果实部为生成的地震波

e=ifft(d,nfft);

%给生成的地震波加上强度包络线

y=en.*real(e(1:nt));

%计算反应谱

%对生成的地震波进行FFT变换

yf=fft(y,nfft);

for j=1:ne

%用地震波FFT变换结果和反应谱传递函数的乘积的逆变换做卷积运算

d=ifft(yf.*hf(j,:),nfft);

%求各频率对应地震的最大响应

a1(j)=max(real(d(1:nt)));

end

%如果达到指定迭代次数显示图形

if k==mm

subplot(2,1,1);

%同时显示生成的地震波和强度包络线

plot(t,y,t,en,t,-en);

xlabel('时间 (s)');

ylabel('加速度 (g)');

grid on;

subplot(2,1,2);

%同时显示期望反应谱与反应计算谱

l=1:ne;

plot(f(l),a0(l),':',f(l),a1(l));

xlabel('频率 (Hz)');

ylabel('加速度 (g)');

legend('目标谱','计算谱');

grid on;

ig=input('继续迭代次数[取值1-9,否则退出]:');

if ig>0 & ig<10 %如果输入数字是1-9

mm=mm+ig; %增加迭代次数1-9

else %否则

break; %中断循环

end

end

c=b1;

%期望谱与计算谱的比值来修改傅立叶幅值谱

j=nb:ne;

b1(j)=c(j).*a0(j)./a1(j);

end

%打开文件输出人工地震波数据

fid=fopen(fno,'w');

for k=1:nt

%每一行输出两个实型数据,t为时间,y为人工地震波信号值

fprintf(fid,'%f %fn',t(k),y1(k));

end

status=fclose(fid);

程序8-1

%导纳圆法模态参数识别

%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear

clc

close all hidden

format long

%%%%%%%%%%%%%%%%%%%%%%

%声明为全局变量

global mn;

fni=input('导纳圆法模态参数识别-输入文件名:','s');

fid=fopen(fni,'r');

mn = fscanf(fid,'%d',1); %模态阶数

df = fscanf(fid,'%f',1); %频率间隔

f0 = fscanf(fid,'%f',[1,mn]); %模态频率初值数组

fno = fscanf(fid,'%s',1); %输出数据文件名

H0 = fscanf(fid,'%f',[2,inf]); %实测频响函数实部虚部数据

status=fclose(fid);

%定义的离散频率向量

f=0:df:(length(H0(1,:))-1)*df;

%定义的离散圆频率向量

w=2*pi*f;

%建立模态参数向量

fds=zeros(1,3*mn);

%进行4次迭代分离频响函数各模态

for n=1:4

for j=1:mn

%消除其它模态的叠加影响

l=3*(j-1);

fds(l+1:l+3)=zeros(1,3);

H1=fun81(fds,w);

H=H0-H1;

%确定拟合导纳圆的数据

k=round(f0(j)/df)+1;

[m,kc]=max(abs(H(2,k-4:k+4)));

kc=kc+k-5;

%设频响函数虚部模态峰值的0.15作为取数据的条件

v=0.15*abs(H(2,kc));

%依照条件进行取数据

for k=2:30

l=kc-k;

if abs(H(2,l))>v & abs(H(2,l))<=abs(H(2,l+1))

k1=l;

else

break;

end

end

for k=2:30

l=kc+k;

if abs(H(2,l))>v & abs(H(2,l))<=abs(H(2,l-1))

k2=l;

else

break;

end

end

%将确定的频响函数的实部和虚部数据分别存入x和y

x=H(1,k1:k2);

y=H(2,k1:k2);

%用最小二乘法进行导纳圆的拟合

A=[sum(x.^2),sum(x.*y),sum(x);

sum(x.*y),sum(y.^2),sum(y);

sum(x),sum(y),length(x)];

B=[-sum(x.^3+x.*y.^2);

-sum(x.^2.*y+y.^3);

-sum(x.^2+y.^2)];

%解线性方程

c=inv(A)*B;

%计算圆心X坐标

x0=-c(1)/2;

%计算圆心Y坐标

y0=-c(2)/2;

%计算圆半径

r=sqrt(x0^2+y0^2-c(3));

%用抛物线插值法计算模态频率值

%y1、y2、y3分别频响函数虚部模态峰值及左右的3个点

%x1、x2、x3是对应于y1、y2、y3的频率值

x1=f(kc-1);

x2=f(kc);

x3=f(kc+1);

y1=H(2,kc-1);

y2=H(2,kc);

y3=H(2,kc+1);

fc=((y2-y1)*(x3^2-x2^2)-(y3-y2)*(x2^2-x1^2))/(2*(2*y2-y1-y3)*(x2-x1));

yc=(y1*(x2-fc)^2-y2*(x1-fc)^2)/((x2-fc)^2-(x1-fc)^2);

if abs(y1)>abs(y3)

xc=H(1,kc-1)+(H(1,kc)-H(1,kc-1))*(fc-x1)/(x2-x1);

else

xc=H(1,kc)+(H(1,kc+1)-H(1,kc))*(fc-x2)/(x3-x2);

end

F(j)=fc;

%计算对应模态频率的阻尼比值

[m,k]=max(abs(y));

%根据三角形的余弦定理计算峰值点与其左右点的夹角

a=(xc-x(k-1))^2+(yc-y(k-1))^2;

b=(x0-xc)^2+(y0-yc)^2;

c=(x0-x(k-1))^2+(y0-y(k-1))^2;

a1=acos((b+c-a)/(2*sqrt(b)*sqrt(c)))/2;

a=(x(k+1)-xc)^2+(y(k+1)-yc)^2;

b=(x0-x(k+1))^2+(y0-y(k+1))^2;

c=(x0-xc)^2+(y0-yc)^2;

a2=acos((b+c-a)/(2*sqrt(b)*sqrt(c)))/2;

D(j)=(f(l+1)-f(l-1))/(F(j)*(tan(a1)+tan(a2)));

%计算对应模态频率的振型系数

S(j)=yc*2*D(j);

l=3*(j-1);

fds(l+1:l+3)=[2*pi*F(j) D(j) S(j)];

end

end

%计算拟合的频响函数

H1=fun81(fds,w);

%绘制频响函数实部拟合曲线图

figure(1)

subplot(2,1,1);

plot(f,H0(1,:),':',f,H1(1,:));

xlabel('频率 (Hz)');

ylabel('实部');

legend('实测','拟合');

grid on;

%绘制频响函数虚部拟合曲线图

subplot(2,1,2);

plot(f,H0(2,:),':',f,H1(2,:));

xlabel('频率 (Hz)');

ylabel('虚部');

legend('实测','拟合');

grid on;

%绘制频响函数导纳圆拟合曲线图

figure(2)

plot(H0(1,:),H0(2,:),':',H1(1,:),H1(2,:));

axis('equal');

xlabel('实部');

ylabel('虚部');

legend('实测','拟合');

grid on;

%打开文件输出模态参数数据

fid=fopen(fno,'w');

fprintf(fid,' 频率(Hz) 阻尼比(%%) 振型系数n');

for k=1:mn

l=(k-1)*3;

fprintf(fid,'%10.4f %10.4f %10.6fn',fds(l+1),fds(l+2)*100.0,fds(l+3));

end

status=fclose(fid);

函数8-1(用于程序8-1)

function m=fun81(x,w)

%通过实模态参数计算拟合频响函数

%输入参数

%x-实模态参数向量

%w-频率变量向量

%输出参数

%m-拟合频响函数向量

global mn

m=zeros(2,length(w));

for k=0:mn-1

l=k*3;

if x(l+1)==0

continue;

end

x1=x(l+1); %模态频率

x2=x(l+2); %阻尼比

x3=x(l+3); %振型系数

%计算拟合频响函数的实部

m(1,:)=m(1,:)-x3*(x1^2-w.^2).*w.^2./((x1^2-w.^2).^2+(2*x2*x1*w).^2);

%计算拟合频响函数的虚部

m(2,:)=m(2,:)+2*x3*x2*x1*w.^3./((x1^2-w.^2).^2+(2*x2*x1*w).^2);

end

程序8-2

%最小二乘法模态参数识别(复模态-频响函数实虚部)

%%%%%%%%%%%%%%%%%%%%%%%

clear

clc

close all hidden

format long

%%%%%%%%%%%%%%%%%%%%%%%

%声明全局变量

global mn

fni=input('最小二乘法模态参数识别-输入数据文件名:','s');

fid=fopen(fni,'r');

mn = fscanf(fid,'%d',1); %模态阶数

df = fscanf(fid,'%f',1); %频率间隔

f0 = fscanf(fid,'%f',mn); %输入模态频率初值数组

d0 = fscanf(fid,'%f',mn); %输入模态阻尼比初值数组

fno = fscanf(fid,'%s',1); %输出数据文件名

b = fscanf(fid,'%f',[2,inf]); %实测频响函数实部虚部数据

status=fclose(fid);

%建立离散频率向量

f=0:df:(length(b(1,:))-1)*df;

%建立离散圆频率向量

w=2*pi*f;

%建立实测频响函数复数向量

H =b(1,:)+b(2,:)*i;

%计算模态圆频率初值向量

w0=2*pi*f0;

%建立模态初参数向量

for j=1:mn

l=4*(j-1);

x0(l+1:l+4)=[-w0(j)*d0(j),w0(j)*sqrt(1-d0(j)^2),1,1];

end

%用最小二乘非线性数据拟合法估计复模态参数

x=lsqcurvefit('fun82',x0,w,H);

%计算模态频率、阻尼比和振型系数

for j=1:mn

l=4*(j-1);

c=x(l+1)+i*x(l+2);

d=x(l+3)+i*x(l+4);

F(j)=abs(c)/(2*pi); %模态频率

D(j)=-real(c)/abs(c);%阻尼比

S(j)=d; %复振型系数

end

%计算拟合的频响函数向量

H1=fun82(x,w);

%绘制频响函数实部拟合曲线图

subplot(2,1,1);

plot(f,real(H),':',f,real(H1));

xlabel('频率 (Hz)');

ylabel('实部');

legend('实测','拟合');

grid on;

%绘制频响函数虚部拟合曲线图

subplot(2,1,2);

plot(f,imag(H),':',f,imag(H1),'r');

xlabel('频率 (Hz)');

ylabel('虚部');

legend('实测','拟合');

grid on;

%打开文件输出模态参数数据

fid=fopen(fno,'w');

fprintf(fid,' 频率(Hz) 阻尼比(%%) 振型系数n');

for k=1:mn

fprintf(fid,'%10.4f %10.4f %10.6fn',F(k),D(k)*100.0,imag(S(k)));

end

status=fclose(fid);

函数8-2(用于程序8-2)

function m=fun82(x,w)

%通过模态参数计算拟合频响函数值

%输入参数

%x-复模态参数向量

%w-频率变量向量

%输出参数

%m-拟合频响函数向量

global mn

m=zeros(1,length(w));

for k=0:mn-1

l=4*k;

x1=x(l+1); %特征值实部

x2=x(l+2); %特征值虚部

x3=x(l+3); %特征向量实部

x4=x(l+4); %特征向量虚部

m=m-w.^2.*((x3+i*x4)./(w*i-(x1+i*x2))+(x3-i*x4)./(w*i-(x1-i*x2)));

end

程序8-2a

%最小二乘法模态参数识别(实模态-频响函数虚部)

%%%%%%%%%%%%%%%%%%%%%%%

clear

clc

close all hidden

format long

%%%%%%%%%%%%%%%%%%%%%%

%声明为全局变量

global mn

fni=input('最小二乘法模态参数识别-输入数据批文件名:','s');

fid=fopen(fni,'r');

mn = fscanf(fid,'%d',1); %模态阶数

df = fscanf(fid,'%f',1); %频率间隔

f0 = fscanf(fid,'%f',mn); %输入模态频率初值数组

d0 = fscanf(fid,'%f',mn); %输入模态阻尼比初值数组

s0 = fscanf(fid,'%f',mn); %输入模态振型系数初值数组

fno = fscanf(fid,'%s',1); %输出数据文件名

b = fscanf(fid,'%f',[2,inf]); %输入实测频响函数实虚部数据数组

status=fclose(fid);

%取频响函数长度

n=length(b(1,:));

%建立离散频率向量

f=0:df:(n-1)*df;

%建立离散圆频率向量

w=2*pi*f;

%建立实测频响函数虚部向量

H =b(2,:);

%建立模态圆频率初值向量

w0=2*pi*f0;

%建立模态初参数向量

for j=1:mn

l=3*(j-1);

x0(l+1:l+3)=[w0(j) d0(j) s0(j)];

end

%用最小二乘非线性拟合法估计实模态参数

x=lsqcurvefit('fun82a',x0,w,H);

%计算模态频率、阻尼比和振型系数

for j=1:mn

l=3*(j-1);

F(j)=x(l+1)/(2*pi);%模态频率

D(j)=x(l+2); %阻尼比

S(j)=x(l+3); %振型系数

end

%建立实测频响函数复数向量

H=b(1,:)+i*b(2,:);

%计算拟合频响函数的实部

c=zeros(1,n);

for k=0:mn-1

l=k*3;

x1=x(l+1);

x2=x(l+2);

x3=x(l+3);

c=c+x3*(x1^2-w.^2).*w.^2./((x1^2-w.^2).^2+(2*x1*x2*w).^2);

end

%计算拟合频响函数的虚部

d=fun82a(x,w);

%建立拟合频响函数复数向量

H1=c+i*d;

%绘制频响函数实部拟合曲线图

subplot(2,1,1);

plot(f,real(H),':',f,real(H1));

xlabel('频率 (Hz)');

ylabel('实部');

legend('实测','拟合');

grid on;

%绘制频响函数虚部拟合曲线图

subplot(2,1,2);

plot(f,imag(H),':',f,imag(H1),'r');

xlabel('频率 (Hz)');

ylabel('虚部');

legend('实测','拟合');

grid on;

%打开文件输出模态参数数据

fid=fopen(fno,'w');

fprintf(fid,' 频率(Hz) 阻尼比(%%) 振型系数n');

for k=1:mn

fprintf(fid,'%10.4f %10.4f %10.6fn',F(k),D(k)*100.0,S(k));

end

status=fclose(fid);

函数8-2a(用于程序8-2a)

function m=funlsq(x,w)

%通过实模态参数计算拟合频响函数虚部

%输入参数

%x-实模态参数向量

%w-频率变量向量

%输出参数

%m-拟合频响函数虚部向量

global mn

m=zeros(1,length(w));

for k=0:mn-1

l=k*3;

x1=x(l+1); %模态频率

x2=x(l+2); %阻尼比

x3=x(l+3); %振型系数

m=m-2*x3*x2*x1*w.^3./((x1^2-w.^2).^2+(2*x2*x1*w).^2);

end

程序8-3

%加权最小二乘法模态参数识别(复模态-频响函数实虚部)

%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear

clc

close all hidden

format long

%%%%%%%%%%%%%%%%%%%%%%

%声明为全局变量

global mn w H W ig

fni=input('加权最小二乘法模态参数识别-输入数据文件名:','s');

fid=fopen(fni,'r');

mn = fscanf(fid,'%d',1); %模态阶数

df = fscanf(fid,'%f',1); %频率间隔

f0 = fscanf(fid,'%f',mn); %输入模态频率初值数组

d0 = fscanf(fid,'%f',mn); %输入模态阻尼比初值数组

fno = fscanf(fid,'%s',1); %输出数据文件名

b = fscanf(fid,'%f',[2,inf]);%输入实测频响函数实部虚部数据数组

status=fclose(fid);

n=length(b(1,:));

%建立离散频率向量

f=0:df:(n-1)*df;

%建立离散圆频率向量

w=2*pi*f;

%建立实测频响函数复数向量

H =b(1,:)+b(2,:)*i;

%计算模态圆频率初值向量

w0=2*pi*f0;

%建立模态初参数向量

for j=1:mn

l=4*(j-1);

x0(l+1:l+4)=[-w0(j)*d0(j),w0(j)*sqrt(1-d0(j)^2),1,1];

end

%建立权向量

W=(abs(H)./max(abs(H))).^0.2;

%%用加权非线性最小二乘求解法估计复模态参数

ig=1;

x=lsqnonlin('fun83',x0);

%计算模态频率、阻尼比和振型系数

for j=1:mn

l=4*(j-1);

c=x(l+1)+i*x(l+2);

d=x(l+3)+i*x(l+4);

F(j)=abs(c)/(2*pi); %模态频率

D(j)=-real(c)/abs(c);%阻尼比

S(j)=d; %复振型系数

end

%计算拟合频响函数

ig=0;

H1=fun83(x);

%绘制频响函数实虚部拟合曲线图

subplot(2,1,1);

plot(f,real(H),':',f,real(H1));

xlabel('频率 (Hz)');

ylabel('实部');

legend('实测','拟合');

grid on;

subplot(2,1,2);

plot(f,imag(H),':',f,imag(H1));

xlabel('频率 (Hz)');

ylabel('虚部');

legend('实测','拟合');

grid on;

%打开文件输出模态参数数据

fid=fopen(fno,'w');

fprintf(fid,' 频率(Hz) 阻尼比(%%) 振型系数n');

for k=1:mn

fprintf(fid,'%10.4f %10.4f %10.6fn',F(k),D(k)*100.0,imag(S(k)));

end

status=fclose(fid);

函数8-3(用于程序8-3)

function m=fun83(x)

%通过复模态参数计算拟合频响函数

%x-复模态参数向量

%w-频率变量向量

%H-实测频响函数向量

%W-权函数向量

%ig=0计算拟合频响函数

%ig=1计算拟合频响函数与实测频响函数的差值

global mn w H W ig

m=zeros(1,length(w));

for k=0:mn-1

l=4*k;

x1=x(l+1); %特征值实部

x2=x(l+2); %特征值虚部

x3=x(l+3); %特征向量实部

x4=x(l+4); %特征向量虚部

m=m-w.^2.*((x3+i*x4)./(w*i-(x1+i*x2))+(x3-i*x4)./(w*i-(x1-i*x2)));

end

if ig>0

m=(m-H).*W;

end

程序8-3a

%加权最小二乘法模态参数识别(实模态-频响函数虚部)

%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear

clc

close all hidden

format long

%%%%%%%%%%%%%%%%%%%%%%

%声明为全局变量

global mn w H W ig

fni=input('加权最小二乘法模态参数识别-输入数据文件名:','s');

fid=fopen(fni,'r');

mn = fscanf(fid,'%d',1); %模态阶数

df = fscanf(fid,'%f',1); %频率间隔

f0 = fscanf(fid,'%f',mn); %输入模态频率初值数组

d0 = fscanf(fid,'%f',mn); %输入模态阻尼比初值数组

s0 = fscanf(fid,'%f',mn); %输入模态振型系数初值数组

fno = fscanf(fid,'%s',1); %输出数据文件名

b = fscanf(fid,'%f',[2,inf]); %输入实测频响函数实虚部数据

status=fclose(fid);

%取频响函数长度

n=length(b(1,:));

%建立离散频率向量

f=0:df:(n-1)*df;

%建立离散圆频率向量

w=2*pi*f;

%建立实测频响函数虚部向量

H =b(2,:);

%建立模态圆频率初值向量

w0=2*pi*f0;

%建立模态初参数向量

for j=1:mn

l=3*(j-1);

x0(l+1:l+3)=[w0(j) d0(j) s0(j)];

end

%建立权向量

W=(abs(H)./max(abs(H))).^0.3;

%用加权非线性最小二乘求解法估计实模态参数

ig=1;

x=lsqnonlin('fun83a',x0);

%计算模态频率、阻尼比和振型系数

for j=1:mn

l=3*(j-1);

F(j)=x(l+1)/(2*pi); %模态频率

D(j)=x(l+2); %阻尼比

S(j)=x(l+3); %振型系数

end

%建立实测频响函数复数向量

H=b(1,:)+i*b(2,:);

%计算拟合频响函数的实部

c=zeros(1,n);

for k=0:mn-1

l=k*3;

x1=x(l+1);

x2=x(l+2);

x3=x(l+3);

c=c+x3*(x1^2-w.^2).*w.^2./((x1^2-w.^2).^2+(2*x2*x1*w).^2);

end

%计算拟合频响函数的虚部

ig=0;

d=fun83a(x);

%计算拟合频响函数复数向量

H1=c+i*d;

%绘制频响函数实部拟合曲线图

subplot(2,1,1);

plot(f,real(H),':',f,real(H1));

xlabel('频率 (Hz)');

ylabel('实部');

legend('实测','拟合');

grid on;

%绘制频响函数虚部拟合曲线图

subplot(2,1,2);

plot(f,imag(H),':',f,imag(H1));

xlabel('频率 (Hz)');

ylabel('虚部');

legend('实测','拟合');

grid on;

%打开文件输出模态参数数据

fid=fopen(fno,'w');

fprintf(fid,' 频率(Hz) 阻尼比(%%) 振型系数n');

for k=1:mn

fprintf(fid,'%10.4f %10.4f %10.6fn',F(k),D(k)*100.0,S(k));

end

status=fclose(fid);

函数8-3a(用于程序8-3a)

function m=fun83(x)

%通过实模态参数计算拟合频响函数虚部及与实测值的差值

%输入参数

%x-实模态参数向量

%w-频率变量向量

%ig=0计算拟合频响函数虚部

%ig=1计算拟合频响函数与实测频响函数虚部的差值

%输出参数

%拟合频响函数向量或差值向量

global mn w H W ig

m=zeros(1,length(w));

for k=0:mn-1

l=k*3;

x1=x(l+1); %模态频率

x2=x(l+2); %阻尼比

x3=x(l+3); %振型系数

m=m-2*x3*x2*x1*w.^3./((x1^2-w.^2).^2+(2*x2*x1*w).^2);

end

if ig>0

m=(m-H).*W;

end

程序8-4

%有理分式多项式法模态参数识别

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear

clc

close all hidden

format long

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

fni=input('有理分式多项式法模态参数识别-输入数据文件名:','s');

fid=fopen(fni,'r');

mn = fscanf(fid,'%d',1); %模态阶数

df = fscanf(fid,'%f',1); %频率间隔

fno = fscanf(fid,'%s',1); %输出数据文件名

b = fscanf(fid,'%f',[2,inf]); %实测频响函数实、虚部数据

status=fclose(fid);

%定义幂多项式的阶次

nm = mn*2;

%取频响函数的长度

n=length(b(1,:));

%建立离散频率向量

f=0:df:(n-1)*df;

%建立离散圆频率向量

w=2*pi*f;

%建立归一化离散频率向量

wi = w/max(w);

%建立实测频响函数复数向量

H=b(1,:)+i*b(2,:);

%计算拟合频响函数的分子和分母系数向量

[A,B] = invfreqs(H,wi,nm,nm,[],100);

%幂多项式方程求根(零点)

P = roots(B);

%计算模态频率向量

F1 = abs(P)*max(w)/(2*pi);

%计算阻尼比向量

D1 = -real(P)./(abs(P));

%计算振型系数向量

for k=1:nm

if k==1

p(1:nm-1)=P(2:nm);

else

p(1:k-1)=P(1:k-1);

p(k:nm-1)=P(k+1:nm);

end

y=poly(p);

S1(k)=polyval(A,P(k))/polyval(y,P(k));

end

%计算拟合的频响函数

H1 = freqs(A,B,wi);

%绘制频响函数实部拟合曲线图

figure(2)

nn=1:n;

subplot(2,1,1);

plot(f,real(H(nn)),':',f,real(H1(nn)),'r');

xlabel('频率 (Hz)');

ylabel('实部');

legend('实测','拟合');

grid on;

%绘制频响函数虚部拟合曲线图

subplot(2,1,2);

plot(f,b(2,:),':',f,imag(H1(nn)),'r');

xlabel('频率 (Hz)');

ylabel('虚部');

legend('实测','拟合');

grid on;

%将模态频率从小到大排序

[F2,I]=sort(F1);

%剔除方程解中的非模态项(非共轭根)和共轭项(重复项)

m=0;

for k=1:nm-1

if F2(k)~=F2(k+1)

continue;

end

m=m+1;

l=I(k);

F(m)=F1(l); %模态频率

D(m)=D1(l); %阻尼比

S(m)=S1(l); %振型系数

end

%打开文件输出模态参数数据

fid=fopen(fno,'w');

fprintf(fid,' 频率(Hz) 阻尼比(%%) 振型系数n');

for k=1:m

fprintf(fid,'%10.4f %10.4f %10.6fn',F(k),D(k)*100.0,imag(S(k)));

end

status=fclose(fid);

程序8-5

%正交多项式法模态参数识别

%%%%%%%%%%%%%%%%%%%%%%%%%

clear

clc

close all hidden

format long

%%%%%%%%%%%%%%%%%%%%%%%%%

fni=input('正交多项式法模态参数识别-输入数据文件名:','s');

fid=fopen(fni,'r');

mn = fscanf(fid,'%d',1); %模态阶数

df = fscanf(fid,'%f',1); %频率间隔

fno = fscanf(fid,'%s',1); %输出数据文件名

h = fscanf(fid,'%f',[2,inf]); %实测频响函数实部虚部数据

status=fclose(fid);

%定义正交多项式的阶次

nm=2*mn;

%取频响函数的长度

n=length(h(1,:));

%建立离散频率向量

f=0:df:(n-1)*df;

%建立从负到正的归一化频率向量

w=[-f(n:-1:1) f(1:n)]/max(f);

%建立对应频率向量的实测频响函数向量

H=[h(1,n:-1:1)-i*h(2,n:-1:1) h(1,1:n)+i*h(2,1:n)];

%将频率向量设置为列向量

[k,l]=size(w);

if k

w=w.';

end

%将频响函数向量设置为列向量

[k,l]=size(H);

if k

H=H.';

end

%建立分子正交多项式及幂多项式的转换矩阵

[p,cp]=fun85(H,w,1,nm);

%建立分母正交多项式及幂多项式的转换矩阵

[q,cq]=fun85(H,w,2,nm);

%最小二乘法求解正交多项式的分子系数C和分母向量D

P=p;

for k=1:nm

Q(:,k)=(H.*q(:,k));

end

T=-real(P'*Q);

g=real(P'*(H.*q(:,nm+1)));

D=-inv(eye(nm)-T'*T)*T'*g;

C=g-T*D;

D(nm+1)=1;

%通过转换矩阵计算分子幂多项式系数向量A

A=cp*C;

%将A设置成按降幂排序的列向量

A=A(nm+1:-1:1).';

%通过转换矩阵计算分母幂多项式系数向量A

B=cq*D;

%将B转换成按降幂排序的列向量

B=B(nm+1:-1:1).';

%计算有理分式多项式的极点和留数

[R,U,K]=residue(A,B);

%计算模态频率向量

F1 = abs(U)*max(f);

%计算阻尼比向量

D1 = -real(U)./(abs(U));

%计算振型系数向量

for k=1:nm

if k==1

u(1:nm-1)=U(2:nm);

else

u(1:k-1)=U(1:k-1);

u(k:nm-1)=U(k+1:nm);

end

y=poly(u);

S1(k)=polyval(A,U(k))/polyval(y,U(k));

end

%建立正频率的频响函数向量

H=h(1,1:n)+i*h(2,1:n);

%计算生成的频响函数

for l=1:n

H1(l)=sum(C'.*p(n+l,:))/sum(D'.*q(n+l,:));

end

%绘制频响函数实部拟合曲线图

subplot(2,1,1);

plot(f,real(H),':',f,real(H1),'r');

xlabel('频率 (Hz)');

ylabel('实部');

legend('实测','拟合');

grid on;

%绘制频响函数虚部拟合曲线图

subplot(2,1,2);

plot(f,imag(H),':',f,imag(H1),'r');

xlabel('频率 (Hz)');

ylabel('虚部');

legend('实测','拟合');

grid on;

%将模态频率从小到大排序

[F2,I]=sort(F1);

%剔除方程解中的非模态项(非共轭根)和共轭项(重复项)

m=0;

for k=1:nm-1

if F2(k)~=F2(k+1)

continue;

end

m=m+1;

l=I(k);

F(m)=F1(l); %模态频率

D(m)=D1(l); %阻尼比

S(m)=S1(l); %振型系数

end

%打开文件输出模态参数数据

fid=fopen(fno,'w');

fprintf(fid,' 频率(Hz) 阻尼比(%%) 振型系数n');

for k=1:m

fprintf(fid,'%10.4f %10.4f %10.6fn',F(k),D(k)*100.0,imag(S(k)));

end

status=fclose(fid);

函数8-5(用于程序8-5)

function [P,cf]=fun85(H,w,ig,m)

%建立分子或分母正交多项式矩阵及相应幂多项式的转换矩阵

%输入参数

% H = 频响函数向量

% w = 频率向量

% ig = 1为计算分子多项式,=2为计算分母多项式

% m = 多项式的阶次

%输出参数

% P = 正交多项式矩阵

% cf = 转换正交多项式系数成幂多项式系数的转换矩阵

%

%建立分子或分母正交多项式矩阵的权向量

if ig==1

%计算分子正交多项式矩阵的权向量

W=ones(size(w));

else

%计算分母正交多项式矩阵的权向量

W=(abs(H)).^2;


本文标签: 数据 频率 向量 函数 模态