How to generate white noise signal from a given PSD?

22 次查看(过去 30 天)
Hello,
I want to generate a white noise signal x(t) with a known value for the flat power spectral density (PSD) function. In other words, I want to specify a constant value S0 such that the PSD of x(t) is Sx(w) = S0.
The awgn function from Matlab generates a white noise vector given a signal-to-noise ratio (SNR) value as input parameter.
What value of SNR I need to specify in order to have the PSD of x(t) equal to the desired value S0?
Any help is welcome!
Americo
  1 个评论
Umar
Umar 2024-7-15
Hi Americo,
In order to calculate the required SNR using the relationship between the PSD and SNR, you need to use the formula to determine the SNR for a given PSD is which is SNR = S0 / (2 * delta_f), where delta_f represents the frequency resolution. Then, you can generate the white noise signal x(t) with the desired PSD using the awgn function in Matlab by specifying the calculated SNR value. By setting the SNR parameter to the computed value, you can ensure that the PSD of x(t) matches the desired constant value S0. For more information on awgn function, please refer to https://www.mathworks.com/help/comm/ref/awgn.html

请先登录,再进行评论。

回答(1 个)

David Goodmanson
David Goodmanson 2024-8-14
One can just create the desired waveform that has psd = S0 without resorting to S/N. The example below has a crazy large unphysical S0 just to make it easy to keep track of the result.
For w instead of f, the frequency range is 0 to 2*pi*Fs and S is reduced by a factor of (1/(2*pi)). periodogram is used to calculate psd = S.
S0 = 23 % desired spectral density dPave/df,
% positive frequencies only
n = 1e6; % number of array points
Fs = 1e9; % sampling frequency
% fft frequency range is approx. -Fs/2 to +Fs/2
y = sqrt(S0*Fs/2)*randn(1,n); % the required time domain waveform
[S f] = periodogram(y,[],[],Fs); % freq range is approx. 0 to Fs/2
% and S is doubled
mS = mean(S) % should equal S0
% check
delf = (Fs/2)/size(S,1);
I = sum(S)*delf % integral over the entire freqency band
% should equal Pave (average power)
Pave = mean(y.^2)
S0 = 23
mS = 23.0634
I = 1.1532e+10
Pave = 1.1532e+10
%%%%%%%%%%% w circular frequency version
S0 = 23 % desired spectral density dPave/dw,
% positive frequencies only
n = 1e6; % number of array points
Fs = 1e9; % sampling frequency.
% fft w range is approx. -(2*pi)*Fs/2 to +(2*pi)*Fs/2
y = sqrt(2*pi*S0*Fs/2)*randn(1,n); % the required time domain waveform
[S w] = periodogram(y,[],[],2*pi*Fs); % w range is approx. 0 to (2*pi)*Fs/2
% and S is doubled
mS = mean(S) % should equal S0
% check
delw = (2*pi*Fs/2)/size(S,1);
I = sum(S)*delw % integral over the entire w band
% should equal Pave (average power)
Pave = mean(y.^2)
S0 = 23
mS = 23.0236
I = 7.2331e+10
Pave = 7.2331e+10

类别

Help CenterFile Exchange 中查找有关 Parametric Spectral Estimation 的更多信息

产品

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by