我要加入 登录
声振论坛 返回首页

octopussheng的个人空间 http://home.vibunion.com/?51118 [收藏] [复制] [分享] [RSS]

日志

关于时间序列的功率谱

已有 952 次阅读2007-9-28 15:23 |个人分类:非线性理论

功率谱表示随机运动过程在各频率成分上的统计特性,是研究随机振动的基本工具。对于给定的随机信号,可以采用标准程序软件计算货专用的频谱分析仪测定其功率谱。
为了描述混沌振动的随机性,可以应用研究随机振动的频谱分析方法识别混沌振动。通常假设混沌是各态历经的,即时间上的平均量与空间上的平均量相等。

在试验测量和计算机仿真中,得到的往往是相差相同时间间隔τ的时间序列:
x(1),x(2),...,x(N)
方法一:
对该序列附加周期性条件x(N+i)=x(i)(i=1,2,...)后可以计算相关函数c(i),在matlab中采用xcrr命令可直接求解,然后对结果作离散傅立叶变换,得到的结果p(j)即表示x(k)中第j个频率成分,即为时间序列的功率谱。
方法二:
不经求解自相关函数,而直接求解x(i)的离散傅立叶系数a(j)和b(j)(计算公式这里就不给出了,很多书上都有的),然后计算
p(j)=a(j)^2+b(j)^2)
通常为许多组{x(i)}计算一批{p(j)},平均后即逼近序列的功率谱。

下面以duffing系统为例进行求解说明!
系统:x''=f*cos(1.2*t)-x^3+x-0.3*x'

定义系统微分方程程序:
function df=dafen(t,x,flag,force)
df=[x(2);force*cos(1.2*t)-x(1)^3+x(1)-0.3*x(2)];

求解系统微分方程程序:
clear
ff=0.222;
options=odeset('RelTol',1e-7);
t0=0;
tf=100;
[t,x]=ode45(@dafen,[t0:0.001:tf],[0,0],options,[],ff);
plot(x(10002:end,1),x(10002:end,2))

这里对时间序列的获取进行一些说明:
求解微分方程的时候,步长h=0.001,在略去前10002个瞬态解(这个数量可以自己按照求解精度来确定)后,取采样时间
τ=0.1s,共选取900个数据,即序列长度N=900,显然采样频率f=100。

方法一的代码:
%第一种方法:
%先对时间序列求自相关函数
%然后对自相关函数进行傅立叶变换,即可得到时间序列的功率谱
Fs=100;%采样频率
N=length(xx1);
nfft=1024;
cxx1=xcorr(xx1);%计算序列的自相关函数
CXX1k=fft(cxx1,nfft);%求功率谱
Pxx1=abs(CXX1k);
index=0:round(nfft/2-1);
k=index*Fs/nfft;
plot_Pxx1=10*log10(Pxx1(index+1));
plot(k,plot_Pxx1)
同样,x(2)的功率谱也可以绘制了!

方法二的代码:
采用方法二的时候,我比较了一下用periodogram函数和直接求平方和的方法之间的区别,代码分别如下:
采样窗函数
Fs=100;%采样频率
window1=boxcar(length(xx1));%矩形窗
nfft=1024;
[Pxx1,f1]=periodogram(xx1,window1,nfft,Fs);
plot(f1,10*log10(Pxx1))

fft之后求平方和:
y1=fft(xx1);
N1=length(y1);
y1(1)=[];
power1=log(real(y1).^2+imag(y1).^2);
nyquist=1/2;
freq1=(1:N1/2)/(N1/2)*nyquist;
plot(freq1(1:N1/2),power1(1:N1/2));

结果图比较如下:
虽然功率谱这个东东论坛里面讨论的也很多了,我还是迎大家一起参与讨论,把这个东东搞透彻!

发表评论 评论 (1 个评论)

回复 zhangli840915 2008-12-1 15:22
我也在做功率谱估计,看看你的总结。呵呵。

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 我要加入

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-21 10:49 , Processed in 0.033880 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部