数据集具有不同的矢量长度时的FFT

时间:2011-10-04 06:38:36

标签: matlab time fft

我有正在运行的模型的数据。然而,在每个时间步骤收集数据并且存在不同数量的时间步长。虽然有不同的时间步长,但它可以通过时间步长的变化来补偿,这样所有的运行都会在同一时间运行。

然而,我认为当我有一个长度为200的矢量和一个长度为900的矢量时,采用FFT会给我本来不同的频率。我觉得我应该对所有样本的同一时间轴进行FFT。

现在我拥有数据的方式就像行向量一样,每个条目都没有及时关联。

有没有办法将每个向量的fft相对于它们在时间轴上的位置而不是它们在向量数组中的位置?

我的目标是编写一个for循环并获取许多数据集的fft,然后绘制它们以比较频率签名的变化。

2 个答案:

答案 0 :(得分:3)

如果您在1秒(200 Hz)内收集200个样本,则可以将输入数据从1 Hz(1 /(1秒))解析为100 Hz。如果采样1秒钟收集900个样本,则可以解析1 Hz至450 Hz的输入。因此,两个样本的间距相同(频率轴采样为1 Hz),但它们会达到不同的最大频率!

如果您的问题只是绘图,您可以丢弃所有情节中都没有的高频:

totaltime=1; %# common total time of all datasets, in seconds
minsamplenumber=200;
figure;
hold all;
cutofffreq=((minsamplenumber/2+1)/totaltime);
freqscale=0:(1/totaltime):cutofffreq;
datasetcount=42;
ffts=NaN(minsamplenumber,datasetcount);
for i=1:datasetcount
   data{i}=... %# collect your data; to make life easier always collect an even number..
   ffts(:,i)=fft(data{i},minsamplenumber);
   plot(freqscale,ffts{i}(1:end/2+1));
end

...或与现实一起生活,并绘制您拥有的所有数据:

totaltime=1; %# common total time of all datasets, in seconds
figure;
hold all;
for i=1:42
   data{i}=... %# collect your data; to make life easier always collect an even number..
   ffts{i}=fft(data{i});
   maxfreq(i)=((numel(ffts{i})/2+1)/totaltime);
   freqscale{i}=0:(1/totaltime):maxfreq(i);
   plot(freqscale{i},ffts{i}(1:end/2+1));
end

答案 1 :(得分:0)

您可以将数据(通过滤波插值)重新采样为恒定长度向量,其中采样率在每帧中是相同的恒定速率。您可能还必须重叠FFT帧以获得恒定的帧或窗口偏移。