【问题标题】:Selecting certain time range in Matlab在 Matlab 中选择特定的时间范围
【发布时间】:2013-12-01 07:48:35
【问题描述】:

我有一个项目要做,我面临一些问题。请帮我。我还不太擅长matlab。 基本上,我有一组连续记录 3 天的运动数据(data.mat)。我需要: 1. 仅选择这整组数据中的某些特定时刻(时间范围) 2. 将这些时刻分成 2.56 秒的小部分 3.对每个小零件做FFT,看频域的运动,只选择5-25Hz 4.找到几个最大的频率峰值

我编写了一个代码来为我的整个数据“Data.mat”制作 FFT 和峰值,它正在工作。 这是我的代码:

load('Data.mat');
P=data1(,2); %  
Fs=100       
Ts=1/Fs        
L=length(P)     
t = (0:L-1)*Ts;    
nfft = 256    

figure(1)      % raw signal plotting
plot(t,P);

y = fft(P,nfft)/L;       % FFT
ymag = abs(y(1:length(y)/2+1));
ft = Fs/2*linspace(0,1,nfft/2+1);

figure(2)    % FFT plotting
plot(ft,2*abs(y(1:nfft/2+1)))

indx=ft>= 5 & ft<= 25; % only 5-25Hz
ftsub=ft(indx);
ymagsub=ymag(indx);

% highest peaks
[pks,locs] = findpeaks(ymagsub,'MinPeakHeight',0.02)
plot(ftsub,ymagsub,ftsub(locs),pks,'rv','MarkerFaceColor','r')

现在我试图只选择数据的某些时刻,但我遇到了问题。 例如。可以说,我只想选择时间范围:13-03-2013 9:20:00-9:45:00 AM

我试过了:

t_start =datenum('13-03-2013 9:20:00 AM', 'dd-mm-yyyy HH:MM:SS AM');
t_end = datenum('13-03-2013 9:45:00 AM', 'dd-mm-yyyy HH:MM:SS AM');
rows=find(P>= t_start & P<= t_end); 

但我得到了答案: 行= 空矩阵:0×1

怎么了?如果此代码错误,那么如何选择某个时间范围呢? 以及如何选择成2.56秒?

请帮助我,几周以来我一直在寻找解决方案,我现在真的很沮丧。

【问题讨论】:

    标签: matlab time fft


    【解决方案1】:

    要使这条线正常工作: rows=find(P&gt;= t_start &amp; P&lt;= t_end);P 必须是MATLAB中datenum格式的一系列时间。

    我猜 P 是您的实际数据 - 所以它不起作用,因为 find 只是将 P 中的数值与数值日期值进行比较 - 您的“P”值在 MATLAB 中没有日期标记。需要记住的重要一点是,datenum 的输出只是一个数字,因此 MATLAB 允许您将其与其他数字进行比较,即使结果在现实世界中没有意义。

    您的选择是:

    1. 如果您的数据包含时间戳,请加载该时间戳,检查其格式是否正确(使用datestr 转换回来以进行完整性检查)。这可能是您数据的第一列。对时间值执行查找,然后使用它来绘制/提取P 的适当部分。
    2. 构造一个时间向量 - 使用您所知道的第一个数据点的时间 + 采样率,并执行相同的操作。与您的 t 类似,但在 datenums 中。如果您的数据采集意味着您只有文件开始以来的时间加上开始时间,这也将起作用。

    然后就是这样:

    r=find(t>= t_start & t<= t_end); 
    plot(t(r),P(r);
    

    【讨论】:

    • 在第一列中,我有测量值:1025600、1025601、1025602、1025603 等,所以我尝试这样做:datestr(1025600,'dd-mm-yyyy HH:MM:SS AM' ) ans =30-12-2807 12:00:00 AM >> datestr(1025601,'dd-mm-yyyy HH:MM:SS AM') ans =31-12-2807 12:00:00 AM >> datestr (1025602,'dd-mm-yyyy HH:MM:SS AM') ans =01-01-2808 12:00:00 AM 为什么会这样?
    • 我也执行了: datenum('13-03-2013 9:20:00 AM', 'dd-mm-yyyy HH:MM:SS AM') 我得到 ans =7.3531e+ 05 ,然后我做了: datenum('13-03-2013 940:00 AM', 'dd-mm-yyyy HH:MM:SS AM') 我得到 ans =7.3531e+05.为什么我得到相同的号码?然后我执行:time='13-03-2013 9:20:00 AM'; timen=datenum(time,'dd-mm-yyyy HH:MM:SS AM'); datestr(timen,'dd-mm-yyyy HH:MM:SS AM') 我得到了 ans = 13-03-2013 9:20:00 AM
    • 好吧,我不知道“1025600”应该是什么时间格式; MATLAB datenum 不会自动与所有其他时间格式或计数器互换。您将需要计算出您的计数与实时时间的对应关系,并进行适当的转换。您似乎在两个关闭时间获得相同数字的原因是 datenum 结果每天递增,并且显示器未显示所有有效数字。如果您将一个输出与另一个输出分开,您会看到一个小的差异。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多