Временные ряды из спектра

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

У меня есть временной ряд, например: введите здесь описание изображения

Когда я вычисляю спектр, я делаю: %number of points nPoints=length(timeSeries);

%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');

И я получаю:

введите здесь описание изображения

Я думаю, что спектр хорошо рассчитан. Однако теперь мне нужно вернуться и получить временной ряд из этого спектра, и я делаю:

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);

Однако сюжет выглядит так:

введите здесь описание изображения

Где она на порядок ниже исходной серии. Любая рекомендация?


person JPV    schedule 22.01.2014    source источник


Ответы (1)


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

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

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

person twalberg    schedule 22.01.2014
comment
Я понимаю вашу точку зрения. Но не могли бы вы привести небольшой пример, чтобы показать, какой шаг я должен сделать для ifft. Вы можете использовать мой предыдущий код? - person JPV; 23.01.2014