首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >频谱时间序列

频谱时间序列
EN

Stack Overflow用户
提问于 2014-01-22 13:02:48
回答 1查看 2.4K关注 0票数 2

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

我有一个时间序列,比如:

当我计算光谱时,我做的是:点数% nPoints=length(timeSeries);

代码语言:javascript
复制
%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');

我得到了:

我认为光谱计算得很好。然而,现在我需要回去从这个光谱中得到一个时间序列,我这样做了:

代码语言:javascript
复制
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);

然而,情节看上去如下:

它比原来的意甲低一个数量级。有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-22 15:14:08

这里(至少)发生了两件事。首先是你丢弃了信息,然后用随机数代替了这些信息。

实序列的FFT是由实部和虚部组成的复数序列。把这些数字转换成极坐标,就会得到震级和相位角。您正在用p=aps(fft(...))捕获震级部分,但没有捕获相位角(这将涉及到atan2(...))。然后,当你重建你的时间序列时,你正在合成随机数(epsilon=...),并使用这些数字来代替原来的数字。另外,由于实序列的FFT有一种特殊的对称性,用随机数代替相位角会破坏这种对称性,这意味着IFFT通常不再是一个实数序列,而是一个复数序列--再一次,您只查看IFFT的真实部分,所以您再次丢弃信息。如果这是一个音频信号,结果可能听起来有点像原来的(或他们可能完全不同),但波形肯定不匹配.

第二个问题是,在许多实现中,ifft(fft(...))将根据信号中的点数来缩放结果。有几种不同的方法可以避免这种情况,结果不同,但有时在不同的场景中更有吸引力,这取决于您想要做什么。您可以在执行fft()之前对ifft()结果进行缩放,或者在结束时缩放ifft()结果,或者在某些情况下,我甚至看到这两种结果都被sqrt(N)的因子缩放过--两次操作都会导致N缩放最终结果的最终结果,但由于您进行了两次缩放,效率要低一些.

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21283722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档