2014-01-22 127 views
2

我在將頻譜轉換爲時間序列時遇到了一個小問題。我讀過很多文章,我討論了我正在應用正確的程序,但是我沒有得到正確的結果。你能幫忙找到錯誤嗎?來自頻譜的時間序列

我有一個時間序列,如: 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

凡經幅度低一個數量級比原來的系列。 有什麼建議嗎?

回答

3

這裏有(至少)兩件事。首先是你扔掉信息,然後用隨機數字代替這些信息。

實數序列的FFT是由實部和虛部組成的一系列複數。將這些數字轉換爲極座標形式給出了幅度和相位角。您正在使用p=aps(fft(...))捕獲大小部分,但是您沒有捕獲相位角(涉及到atan2(...))。然後,您將編制隨機數字(epsilon=...),並在您重新構建時間序列時使用這些數字替換原始數字。另外,由於實數序列的FFT具有特定的對稱性,因此用隨機數代替相位角會破壞對稱性,這意味着IFFT通常不再是實數序列,而是一系列複數 - 再一次,你只是看着IFFT的真實部分,所以你再次扔掉信息。如果這是一個音頻信號,結果可能聽起來有些像原來的(或者它們可能完全不同),但波形肯定不會匹配...

第二個問題是,在許多實現中,ifft(fft(...))將通過信號中的點數來縮放結果。有幾種不同的方法可以避免這種情況,但有不同的結果,但有時在不同的情況下更具吸引力,具體取決於您嘗試做什麼。您可以在執行ifft()之前縮放fft()結果,或者結束縮放ifft()結果,或者在某些情況下,我甚至已經看到兩者都縮放了係數sqrt(N) - 執行兩次操作會導致縮放的最終結果由N最終結果,但它是一個效率稍低,因爲你做兩次縮放...

+0

我明白你的觀點。但是,你能否舉一個小例子來說明我應該怎麼做。你能用我以前的代碼嗎? – JPV