我希望从给定的功率谱密度中恢复时间信号,假设原始信号的正态分布:
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
结果显示功率谱比原始功率低几个数量级,但形状匹配非常好。我猜单位有问题,或者可能缺少比例因子。因为幅度有[(m / s)/ sqrt(Hz)],我不确定ifft之后的时间信号单位。
答案 0 :(得分:0)
我相信这里有两个问题
首先,我认为PSD
定义它(或者更确切地说,当你使用它时)是错误的单位。
将信号定义为
Z = ASD.*exp(1i*omega);
然后ASD
应位于m/s
而不是(m/s)/Hz
所以你应该这样做:
ASD = sqrt(PSD*fs/2)
现在,由于PSD
位于(m/s)^2/Hz
,ASD
以m/s
为单位。
接下来,ifft
应该正常化。也就是说,您应该将Y
定义为
Y = ifft(Z)*sqrt(NFFT);
还有一件事,我不确定这是否有意,但是以下一行
[PSDY,f] = pwelch(Y,[],[],NFFT,fs);
导致Y
被分为8个部分(长度为<NFFT
),重叠率为50%。每个部分都填零,长度为NFFT
更好的做法是使用像
[PSDY,f] = pwelch(Y,L,L/2,L,fs);
某些L
或的
[PSDY,f] = pwelch(Y,NFFT,[],NFFT,fs);
如果你坚持的话,要了解更多信息,请转到http://www.mathworks.com/help/signal/ref/pwelch.html
总之,这是您的(修改过的)代码:
PSD = 5; % [(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*fs/2); % [(m/s)] 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 = ifft(Z)*sqrt(NFFT); % inverse FFT
[PSDY,f] = pwelch(Y,256,128,256,fs); % generate PSD from Y to compare
导致
其中蓝线是估算PSD。