
random timeseries displacement data from PSD and back again
Posted:
Jun 21, 2013 4:10 PM


Howdy Forum,
I have a project where I have a vibration PSD profile (G^2/Hz). I'd like to use this to create random timeseries displacement data to feed into a dynamic model to evaluate performance in the presence of vibe.
The problem occurs when I convert from G^2/Hz to displacement/time, and then back to the identical (or very near it) G^2/Hz profile. I create random timeseries data, but when I convert back to the frequency domain, it doesn't match up. The recreated PSD has content up to twice the frequency domain I'm initially putting in, and the RMS values don't match up. This sanity check needs to work before I can confidently put the timeseries data into the model, so I'm a bit hung up...
Code below: % Create noise (centered 1), pump it through PSD, and then calc gRMS noise_range = 0.02 noise = noise_range*randn(1,N)+(1noise_range/2); PSD_noise = PSD.*noise;
%Calculate gRMS for original PSD and noiseinjected PSD gRMS = sqrt(max(cumtrapz(PSD0(:,1),PSD0(:,2)))); gRMS_noise = sqrt(max(cumtrapz(f,PSD_noise))); %These match up, the gRMS of my noisy PSD is nearly identical to my input PSD
% Create time and displacement t = linspace(0, N*dt, N); x = (1/sqrt(N))*real(ifft(sqrt(PSD_noise))); x = (x*9.81)./sqrt(std(x)); disp('Parceval"s Theorem says this result should = gRMS') sum(abs(x).^2) %This answer is similar to the gRMS of my noisy/input PSD, but now off by ~10%
%Now I convert timeseries displacement back to frequency domain and should get the same PSD back out: N = length(x); xdft = fft(x); xdft = xdft(1:N/2+1); psdx = (1/(Fs*N)).*abs(xdft).^2; psdx(2:end1) = 2*psdx(2:end1); psdx = psdx*sqrt(N)*9.81; freq = 0:Fs/length(x):Fs/2;
When I end up plotting freq vs psdx, I get frequency content over double of what was put in, and my gRMS is orders of magnitude below what was expected.
Any thoughts? Jim

