MATLAB: Generate signals with different SNR

snr

Hello all
I need to generate random white Gaussian noise of 3 second length. I also need to add 03 sinusoidal (say 10 KHz) pulses of 100 ms duration and SNRs of 1 dB, -10 dB and -20 dB respectively at random locations in 3 sec length Gaussian noise.
Can any one kindly help me with MATLAB code?
Also how can i verify the results i.e. the required SNR has been generated?
Thanks

Best Answer

Here's a solution! Hope it's helpful
%setup
fs=100000;
noise_dur=3;
sine_freq=10000;
sine_dur=.1;
t=0:1/fs:sine_dur-1/fs;
snr=[1,-10,-20];
sine_samps=sine_dur*fs;
%generate noise
noise=randn(fs*noise_dur,1); %generate gaussian noise
norm_noise=noise./max(noise); %scale noise
rms_noise=rms(norm_noise); %get the rms amplitude to which the sines will be compared
%generate the 3 signals at the 3 SNRs and check
for i=1:length(snr)
amp=10^(snr(i)/20)*rms_noise;
x=sin(2*pi*sine_freq*t);
xt(i,:) = (x./rms(x)).*amp;
check_snr=20*log10(rms(xt(i,:))/rms_noise)
end
%set random location 1
a=1;
b=length(noise)-sine_samps;
idx1=round(rand()*(b-a)+a);
%get random location 2 that doesn't overlap with 1
overlap=1;
while overlap==1
idx2=rand()*(b-a)+a;
if idx2<=idx1-sine_samps || idx2>idx1+sine_samps
overlap=0;
end
end
idx2=round(idx2);
%get random location 3 that doesn't overlay 1 or 2
overlap=1;
while overlap==1
idx3=rand()*(b-a)+a;
if idx3<=idx1-sine_samps || idx3>idx1+sine_samps
if idx3<=idx2-sine_samps || idx3>idx2+sine_samps
idx3=round(idx3);
overlap=0;
end
end
end
%set the locations of the stimuli and pad zeros in between
[loc,idx]=sort([idx1 idx2,idx3]);
pad1=zeros(loc(1),1);
pad2=zeros(loc(2)-loc(1)-10000,1);
pad3=zeros(loc(3)-loc(2)-10000,1);
pad4=zeros(length(noise)-loc(3)-10000,1);
stim=[pad1; xt(idx(1),:)'; pad2; xt(idx(2),:)'; pad3; xt(idx(3),:)'; pad4];
%combine,play,and plot final sound
final=stim+norm_noise;
sound(final,fs)
plot(final) %stimulus is masked by the noise
plot(stim) %plot to see the stimuli