Nfft = 2 * (( FSadc_hz / 2 ) / BWfm_min_hz );
Nsmp = Nfft;
tmp_fft_buf = zeros( 1, Nfft );
tmp_acc_buf = zeros( 1, Nfft );
tmp_smp_buf = zeros( 1, Nsmp );
max_acc = 30;
for acc = 1:max_acc
PS1 = db2pow( Pfm_min_bb_sys_dbw );
WS1 = 25.0e3;
FS1 = 1.0e6;
Fstart = FS1;
Fstop = Fstart + WS1 - BWfm_min_hz;
Pstep = PS1 / ( WS1 / BWfm_min_hz );
PS1_smp_buf = zeros( 1, Nsmp );
for f = Fstart:BWfm_min_hz:Fstop
phi_acc = 2.0 * pi * rand( 1 );
phi_stp = pi * ( f / ( FSadc_hz / 2 ));
for k = 1:Nsmp
PS1_smp_buf( k ) = PS1_smp_buf( k ) + sqrt( Pstep ) * exp( j * phi_acc );
phi_acc = phi_acc + phi_stp;
if( phi_acc > ( 2.0 * pi ))
phi_acc = phi_acc - 2.0 * pi;
else
if( phi_acc < ( -2.0 * pi ))
phi_acc = phi_acc + 2.0 * pi;
end
end
end
end
PS2 = db2pow( PFSadc_inp_dbw - 1.0 );
WS2 = 25.0e3;
FS2 = -2.0e6;
Fstart = FS2;
Fstop = Fstart + WS2 - BWfm_min_hz;
Pstep = PS2;
PS2_smp_buf = zeros( 1, Nsmp );
for f = Fstart:BWfm_min_hz:Fstop
phi_acc = 2.0 * pi * rand( 1 );
phi_stp = pi * ( f / ( FSadc_hz / 2 ));
for k = 1:Nsmp
PS2_smp_buf( k ) = PS2_smp_buf( k ) + sqrt( Pstep ) * exp( j * phi_acc );
phi_acc = phi_acc + phi_stp;
if( phi_acc > ( 2.0 * pi ))
phi_acc = phi_acc - 2.0 * pi;
else
if( phi_acc < ( -2.0 * pi ))
phi_acc = phi_acc + 2.0 * pi;
end
end
end
end
PN1 = db2pow( PNbb_out_dbw );
WN1 = BWbb_sys_hz;
Pfull_bw = PN1 * ( FSadc_hz / WN1 );
PN1_smp_buf = sqrt( 0.5 * Pfull_bw ) * complex( randn( 1, Nsmp ), randn( 1, Nsmp ));
tmp_fft_buf = fftshift( fft( PN1_smp_buf ));
tmp_msk_buf = zeros( 1, Nfft );
tmp_msk_buf((( Nfft / 2 ) - (( WN1 / FSadc_hz ) * ( Nfft / 2 )) + 1 ) : (( Nfft / 2 ) + (( WN1 / FSadc_hz ) * ( Nfft / 2 )))) = ...
ones( 1, (( WN1 / FSadc_hz ) * Nfft ));
tmp_fft_buf = tmp_fft_buf .* tmp_msk_buf;
PN1_smp_buf = ifft( fftshift( tmp_fft_buf ));
PN2 = db2pow( PNadc_snr_dbw ) - db2pow( PNadc_qan_dbw );
Pfull_bw = PN2;
PN2_smp_buf = sqrt( 0.5 * Pfull_bw ) * complex( randn( 1, Nsmp ), randn( 1, Nsmp ));
QAN_smp_buf = PS1_smp_buf + PS2_smp_buf + PN1_smp_buf + PN2_smp_buf;
QAN_delta = Vadc_fs_v / ( 2 ^ NBadc_fs_bits );
QAN_smp_buf = round( QAN_smp_buf ./ QAN_delta ) .* QAN_delta;
QAN_smp_buf_re = real( QAN_smp_buf );
QAN_smp_buf_re( find( QAN_smp_buf_re > ( Vadc_fs_v / 2.0 ))) = Vadc_fs_v / 2.0;
QAN_smp_buf_re( find( QAN_smp_buf_re < ( -Vadc_fs_v / 2.0 ))) = -Vadc_fs_v / 2.0;
QAN_smp_buf_im = imag( QAN_smp_buf );
QAN_smp_buf_im( find( QAN_smp_buf_im > ( Vadc_fs_v / 2.0 ))) = Vadc_fs_v / 2.0;
QAN_smp_buf_im( find( QAN_smp_buf_im < ( -Vadc_fs_v / 2.0 ))) = -Vadc_fs_v / 2.0;
QAN_smp_buf = complex( QAN_smp_buf_re, QAN_smp_buf_im );
tmp_smp_buf = QAN_smp_buf;
tmp_fft_buf = fft( tmp_smp_buf ) / Nfft;
tmp_acc_buf = tmp_acc_buf + ( tmp_fft_buf .* conj( tmp_fft_buf ));
end
tmp_acc_buf = tmp_acc_buf ./ max_acc;
f = linspace(( -FSadc_hz / 2 ) + BWfm_min_hz, FSadc_hz / 2, Nfft );
plot( f, pow2db( fftshift( tmp_acc_buf )));
xlim( [( -FSadc_hz / 2 ), ( FSadc_hz / 2 )] );
ylim( [-150.0, -20.0] );
title('Power Spectrum')
xlabel('Frequency (Hz)')
ylabel('P(f) dBW')
drawnow;