2014-01-22 4 views
2

У меня проблема с samll при преобразовании спектра в временной ряд. Я прочитал много статей песка Я htink Я применяю правильную процедуру, но я не получаю правильных результатов. Не могли бы вы найти ошибку?Временные ряды из спектра

У меня есть временная ряд, как: 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

Существует (по крайней мере) две вещи, происходящие здесь. Во-первых, вы выбрасываете информацию, а затем заменяете случайные числа на эту информацию.

БПФ реальной последовательности представляет собой последовательность комплексных чисел, состоящую из вещественной и мнимой частей. Преобразование этих чисел в полярную форму дает амплитуду и фазовый угол. Вы фиксируете величину с p=aps(fft(...)), но вы не фиксируете фазовый угол (который будет включать atan2(...)). Затем вы составляете случайные числа (epsilon=...) и используете те, которые заменяют исходные номера при восстановлении временных рядов. Кроме того, поскольку FFT реальной последовательности имеет определенную симметрию, замена случайных чисел для фазового угла разрушает эту симметрию, а это означает, что IFFT, вообще говоря, больше не будет реальной последовательностью, а последовательностью комплексных чисел - и снова, вы смотрите только на реальную часть IFFT, поэтому вы снова отправляете информацию. Если это аудиосигнал, результаты могут звучать как оригинал (или они могут быть совершенно разными), но форма волны определенно не будет соответствовать ...

Вторая проблема заключается в том, что во многих реализациях ifft(fft(...)) будет масштабируйте результат по количеству точек в сигнале. Существует несколько способов избежать этого с разными результатами, но иногда более привлекательными в разных сценариях, в зависимости от того, что вы пытаетесь сделать. Вы можете либо масштабировать результат fft() до того, как вы сделаете ifft(), либо нарисуете результат ifft() в конце, или в некоторых случаях я даже видел, что оба масштабируются в sqrt(N) - выполнение этого дважды имеет конечный результат масштабирования конечный результат: N, но он немного менее эффективен, так как вы делаете масштабирование дважды ...

+0

Я понимаю вашу точку зрения. Но не могли бы вы поместить небольшой пример, чтобы показать, какой шаг я должен сделать для ifft. Можете ли вы использовать мой предыдущий код? – JPV

 Смежные вопросы

  • Нет связанных вопросов^_^