Я хочу, чтобы восстановить сигналы времени от заданной спектральной плотности мощности, предполагая нормальное распределение исходного сигнала:Synthesize СДП в MatLab
PSD; % [(m/s)^2/Hz] given spectrum
T = 60; % [s] length of original signal
dt = 0.005; % [s] time step of original signal
N = T/dt; % [-] number of samples
NFFT = 2^nextpow2(N); % [-] number of bins for FFT
fs = 1/dt; % [Hz] sampling frequency
ASD = sqrt(PSD); % [(m/s)/sqrt(Hz)] get amplitude spectrum
omega = 2*pi*rand(NFFT/2,1); % [rad] generate phase vector
Z = ASD.*exp(1i*omega); % create complex amplitude vector
Z = [0;Z;flipud(conj(Z))]; % extend to satisfy symmetry
Y = real(ifft(Z)); % inverse FFT
[PSDY,f] = pwelch(Y,[],[],NFFT,fs); % generate PSD from Y to compare
Результаты показывают спектр мощности на несколько порядков ниже, чем оригинал, но форма подходит очень хорошо. Я думаю, что что-то не так с единицами, или может отсутствовать коэффициент масштабирования. Я не уверен в единицах сигнала времени после ifft, так как амплитуда имеет [(m/s)/sqrt (Hz)].
Спасибо за ваш ответ. Не могли бы вы объяснить факторы нормализации? О nits psd я предполагаю из определения power/Hz -> (m/s)^2/Hz, поскольку исходный сигнал находится в (м/с). Окна в pwelch предназначены для сглаживания и не влияют на величины. – djf
@Felipe: У вас есть 2 фактора: 1) Поскольку PSD находится в (м/с)^2/Гц и амплитуда находится в (м/с), вы должны умножать PSD на полосу пропускания при преобразовании в амплитуду.2) Так как символ MATLAB не является унитарным, чтобы сохранить энергию (или мощность), вы должны умножить результат на квадратный корень длины FFT. Что касается окна, то я имел в виду, что вы должны заметить, что сигнал разделен и с нулевым запасом (если вы знаете об этом, и это то, что вы имели в виду, тогда его ОК) – ThP