I have time domain data for a signal that behaves randomly but has non-random (non-Gaussian?) skewness and kurtosis values of ~0.9 and ~7.4, respectively.
The FFT of the signal shows that it's not broadband random -- it's generally flat below 100 Hz and tapers off at about -3 dB/oct above 100 Hz up to a Nyquist of 400 Hz.
I would like to create a synthesized signal that is statistically equivalent (or approximately so) to my reference signal, with nearly identical
- Frequency content
- RMS
- Skewness, and
- Kurtosis.
Additionally, I have extrapolated PSD amplitudes up to 10 kHz that I would like to add into the mix and invert to the time domain.
I have done this in the past satisfying only (1) and (2) by using, for example, MATLAB's randn()
function to create random white noise (namely to create random phase angles), applying an FFT to the white noise, scaling its frequency components to match a desired FFT spectrum, and performing an IFFT to convert to time domain. The rand()
function approaches a skewness and kurtosis of 0.0 and 3.0, respectively, so my initial thought was to create white noise with a specified skewness and kurtosis.
I have tried this same procedure using MATLAB's pearsnd()
function, which allows one to specify skewness and kurtosis values, but the above procedure doesn't seem to preserve the skewness and kurtosis of the scaled time domain signal. I believe the IFFT assumes a Gaussian distribution. Is there a work-around for this?
Thanks!