频谱时间序列

时间:2014-01-22 13:02:48

标签: matlab fft time-series spectrum ifft

在将频谱转换为时间序列时,我遇到了一个小问题。我读了许多文章沙子我想我正在应用正确的程序,但我没有得到正确的结果。你能帮忙找到错误吗?

我有一个时间序列如: enter image description here

当我计算光谱时,我做:     %点数     nPoints =长度(时间序列);

%time interval
dt=time(2)-time(1);

%Fast Fourier transform
p=abs(fft(timeSeries))./(nPoints/2);

%power of positive frequencies
spectrum=p(1:(nPoints/2)).^2;

%frequency
dfFFT=1/tDur;
frequency=(1:nPoints)*dfFFT;
frequency=frequency(1:(nPoints)/2);

%plot spectrum
semilogy(frequency,spectrum); grid on;
xlabel('Frequency [Hz]');
ylabel('Power Spectrum [N*m]^2/[Hz]');
title('SPD load signal');

我获得了:

enter image description here

我认为频谱计算得很好。但是现在我需要回过头来从这个频谱中获取时间序列,我这样做:

df=frequency(2)-frequency(1);
ap = sqrt(2.*spectrum*df)';
%random number form -pi to pi    
epsilon=-pi + 2*pi*rand(1,length(ap));
%transform to time series
randomSeries=length(time).*real(ifft(pad(ap.*exp(epsilon.*i.*2.*pi),length(time))));
%Add the mean value
randomSeries=randomSeries+mean(timeSeries);

然而,情节如下:

enter image description here

它比原始系列低一个数量级。 有什么建议吗?

1 个答案:

答案 0 :(得分:4)

这里至少有两件事情。首先是你丢弃信息,然后用随机数替换该信息。

实序列的FFT是由实部和虚部组成的复数序列。将这些数字转换为极坐标形式可以得到幅度和相位角。您正在使用p=aps(fft(...))捕获幅度部分,但您没有捕获相角(这将涉及atan2(...))。然后,您将编制随机数字(epsilon=...),并在重建时间序列时使用这些数字替换原始数字。此外,由于真实序列的FFT具有特定的对称性,用相位角代替随机数会破坏该对称性,这意味着IFFT通常不再是真实序列,而是一系列复数 - 并且,你只关注IFFT的真实部分,所以你再次丢弃信息。如果这是一个音频信号,结果可能听起来有点像原始(或者它们可能完全不同),但波形绝对不会匹配......

第二个问题是,在许多实现中,ifft(fft(...))将根据信号中的点数来缩放结果。有几种不同的方法可以避免这种情况,结果不同,但有时在不同情况下更具吸引力,具体取决于您的尝试。您可以在执行fft()之前缩放ifft()结果,也可以在结束时缩放ifft()结果,或者在某些情况下,我甚至看到两者都按比例缩放sqrt(N) - 做两次的最终结果是按N缩放最终结果,但由于你进行了两次缩放,效率稍差......