generate signals with different SNR
25 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
nauman
am 13 Jan. 2018
Kommentiert: Shae Morgan
am 30 Okt. 2020
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
3 Kommentare
Akzeptierte Antwort
Shae Morgan
am 7 Aug. 2020
Bearbeitet: Shae Morgan
am 30 Okt. 2020
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
5 Kommentare
Weitere Antworten (1)
Siehe auch
Kategorien
Mehr zu Waveform Generation finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!