在MatLab中合成PSD

时间:2014-09-11 12:05:51

标签: matlab signal-processing fft synthesis ifft

我希望从给定的功率谱密度中恢复时间信号,假设原始信号的正态分布:

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之后的时间信号单位。

1 个答案:

答案 0 :(得分:0)

我相信这里有两个问题 首先,我认为PSD定义它(或者更确切地说,当你使用它时)是错误的单位。
将信号定义为

Z = ASD.*exp(1i*omega); 

然后ASD应位于m/s而不是(m/s)/Hz 所以你应该这样做:

ASD = sqrt(PSD*fs/2)

现在,由于PSD位于(m/s)^2/HzASDm/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

导致

enter image description here

其中蓝线是估算PSD。