├── AlexNet_Trained_SNR_-3dB.bmp ├── AlexNet_Trained_SNR_-6dB.bmp ├── AlexNet_Trained_SNR_-9dB.bmp ├── AlexNet_Trained_SNR_0dB.bmp ├── AlexNet_Trained_SNR_0dB_random_interferer.bmp ├── README.md ├── AlexNetSignalDetector_Analysis.m ├── RunAlexNetSignalDetector.m ├── MakeNoiseImages.m ├── MakeNoiseImages_Noise6dB.m ├── TrainAlexNetSignalDetector.m ├── MakeNoiseImages_Interference.m ├── EnergyDetector_w_Interference.m ├── MakeSignalImages.m ├── MakeSignalImages_Noise6dB.m └── MakeSignalImages_Interference.m /AlexNet_Trained_SNR_-3dB.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danc0112358/CISS2020-Spectrum-Sensing-Deep-Learning/HEAD/AlexNet_Trained_SNR_-3dB.bmp -------------------------------------------------------------------------------- /AlexNet_Trained_SNR_-6dB.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danc0112358/CISS2020-Spectrum-Sensing-Deep-Learning/HEAD/AlexNet_Trained_SNR_-6dB.bmp -------------------------------------------------------------------------------- /AlexNet_Trained_SNR_-9dB.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danc0112358/CISS2020-Spectrum-Sensing-Deep-Learning/HEAD/AlexNet_Trained_SNR_-9dB.bmp -------------------------------------------------------------------------------- /AlexNet_Trained_SNR_0dB.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danc0112358/CISS2020-Spectrum-Sensing-Deep-Learning/HEAD/AlexNet_Trained_SNR_0dB.bmp -------------------------------------------------------------------------------- /AlexNet_Trained_SNR_0dB_random_interferer.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danc0112358/CISS2020-Spectrum-Sensing-Deep-Learning/HEAD/AlexNet_Trained_SNR_0dB_random_interferer.bmp -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CISS2020-Spectrum-Sensing-Deep-Learning 2 | Spectrum Sensing in Interference and Noise Using Deep Learning, 2020 54th Annual Conference on Information Sciences and Systems (CISS) 3 | 4 | These scripts will: 5 | 1) create images to be used with the signal detector 6 | 2) train the signal detector 7 | 3) test the signal detector 8 | 9 | This was written in Matlab. This will require the Deep Learning toolbox. 10 | -------------------------------------------------------------------------------- /AlexNetSignalDetector_Analysis.m: -------------------------------------------------------------------------------- 1 | %Analysis 2 | 3 | %Noise images will have lower indices than signal images. 4 | %Set Threshold equal to number of noise images 5 | Thresh=200; %for 200 noise images 6 | 7 | AlexFalseAlarmRate=0; 8 | AlexMissedDetectRate=0; 9 | for idx=1:length(actualclass) 10 | if predictedclass(idx) ~= actualclass(idx) 11 | if idx<=Thresh 12 | %If index is lower than or equal to Thresh, 13 | %then the image was noise image but classified 14 | %as a signal image 15 | AlexFalseAlarmRate=AlexFalseAlarmRate+1; 16 | else 17 | %If index is greater than Thresh, 18 | %then the image was signal image but classified 19 | %as a noise image 20 | AlexMissedDetectRate=AlexMissedDetectRate+1; 21 | end 22 | end 23 | end -------------------------------------------------------------------------------- /RunAlexNetSignalDetector.m: -------------------------------------------------------------------------------- 1 | workingfolder='.\'; 2 | cd(workingfolder) 3 | 4 | %Pull images from the test directory 5 | %The test directory should have two subdirectories 6 | %One subdirectory labeled "Noise", and the other "Signal" 7 | testimgs = imageDatastore('Test','FileExtensions',{'.bmp'},'IncludeSubfolders',true,'LabelSource','foldernames'); 8 | 9 | %netTransfer is the retrained Alexnet model 10 | [predictedclass,scores] = classify(netTransfer,testimgs); 11 | 12 | %Take a sample of the results and plot them 13 | idx = randperm(numel(testimgs.Files),4); 14 | figure 15 | for i = 1:4 16 | subplot(2,2,i) 17 | I = readimage(testimgs,idx(i)); 18 | imshow(I) 19 | predictedlabel = predictedclass(idx(i)); 20 | actuallabel = testimgs.Labels(idx(i)); 21 | 22 | strlabel = string(predictedlabel); 23 | if actuallabel~=predictedlabel 24 | strlabel = replace(strlabel,'i','X'); %X Marks error 25 | end 26 | title(strlabel); 27 | end 28 | 29 | %Now calculate the overall accuracy 30 | actualclass = testimgs.Labels; 31 | predictionaccuracy = mean(predictedclass == actualclass); 32 | 33 | disp(predictionaccuracy) 34 | 35 | %Run the analysis scripot for missed detect and false alarm -------------------------------------------------------------------------------- /MakeNoiseImages.m: -------------------------------------------------------------------------------- 1 | %Set your working folder 2 | workingfolder='.\'; 3 | 4 | %Set the name of the folder in which these images will be saved 5 | outputfolder = 'Noise_Images'; 6 | 7 | %Set the variance of the noise. 8 | NoisePowDb=0; 9 | 10 | fftlen=227; 11 | 12 | noiselength=fftlen*2; 13 | 14 | NumberPerVar=400; 15 | scaleval=2; 16 | 17 | %Make the output folder if it does not exist 18 | go_mkdir=1; 19 | cd(workingfolder) 20 | dc=dir('*.*'); 21 | for idx=3:length(dc) 22 | if strcmp(dc(idx).name,outputfolder) 23 | go_mkdir=0; 24 | end 25 | end 26 | if (1==go_mkdir) 27 | mkdir(outputfolder) 28 | end 29 | 30 | %Go to the output folder 31 | cd([workingfolder '\' outputfolder]) 32 | 33 | for iteridx=1:NumberPerVar 34 | 35 | %Create the noise 36 | VarLin=10^(-NoisePowDb/10); 37 | capturewaveform_noise = randn(1,noiselength); 38 | capturewaveform_noise=capturewaveform_noise+1.0i*randn(1,noiselength); 39 | capturewaveform_noise=capturewaveform_noise/sqrt(2); 40 | capturewaveform_noise=capturewaveform_noise*sqrt(VarLin); 41 | capturewaveform=capturewaveform_noise; 42 | 43 | spectrogramcapture=zeros(fftlen,fftlen); 44 | image=zeros(fftlen,fftlen,3); 45 | for imageidx=1:fftlen 46 | %PSD will be spread across 256 bins. 47 | %PSD measured per bin, not per Hz. 48 | %10*log10(1/256) = -24.0824 49 | spectrogramcapture(imageidx,:)=fftshift(fft(capturewaveform(imageidx:imageidx+fftlen-1)/fftlen,fftlen)); 50 | image(imageidx,:,1)=20*log10(abs(spectrogramcapture(imageidx,:))); %20*log10 51 | image(imageidx,:,2)=20*log10(abs(spectrogramcapture(imageidx,:))); %.^2 52 | image(imageidx,:,3)=20*log10(abs(spectrogramcapture(imageidx,:))); 53 | end 54 | 55 | image=image-min(image(:)); 56 | image=image*scaleval; 57 | image=image/max(image(:)); 58 | image=image*255; 59 | 60 | image=round(image); 61 | if max(image(:))>255 62 | disp('clipping!') 63 | end 64 | image(image>255)=255; 65 | 66 | image=uint8(image); 67 | 68 | filenamestr=['noise_' num2str(VardB) '_' num2str(iteridx) '.bmp']; 69 | imwrite(image,filenamestr,'bmp') 70 | 71 | end 72 | 73 | 74 | %Return to the Working diretcory 75 | cd(workingfolder) -------------------------------------------------------------------------------- /MakeNoiseImages_Noise6dB.m: -------------------------------------------------------------------------------- 1 | %Set your working folder 2 | workingfolder='.\'; 3 | 4 | %Set the name of the folder in which these images will be saved 5 | outputfolder = 'Noise_Images_Noise_6_dB'; 6 | 7 | %Set the variance of the noise. 8 | NoisePowDb=6; 9 | 10 | fftlen=227; 11 | 12 | noiselength=fftlen*2; 13 | 14 | NumberPerVar=400; 15 | scaleval=2; 16 | 17 | %Make the output folder if it does not exist 18 | go_mkdir=1; 19 | cd(workingfolder) 20 | dc=dir('*.*'); 21 | for idx=3:length(dc) 22 | if strcmp(dc(idx).name,outputfolder) 23 | go_mkdir=0; 24 | end 25 | end 26 | if (1==go_mkdir) 27 | mkdir(outputfolder) 28 | end 29 | 30 | %Go to the output folder 31 | cd([workingfolder '\' outputfolder]) 32 | 33 | %Create the images 34 | for iteridx=1:NumberPerVar 35 | 36 | %Create the noise 37 | VarLin=10^(NoisePowDb/10); 38 | capturewaveform_noise = randn(1,noiselength); 39 | capturewaveform_noise=capturewaveform_noise+1.0i*randn(1,noiselength); 40 | capturewaveform_noise=capturewaveform_noise/sqrt(2); 41 | capturewaveform_noise=capturewaveform_noise*sqrt(VarLin); 42 | capturewaveform=capturewaveform_noise; 43 | 44 | spectrogramcapture=zeros(fftlen,fftlen); 45 | image=zeros(fftlen,fftlen,3); 46 | for imageidx=1:fftlen 47 | %PSD will be spread across 256 bins. 48 | %PSD measured per bin, not per Hz. 49 | %10*log10(1/256) = -24.0824 50 | spectrogramcapture(imageidx,:)=fftshift(fft(capturewaveform(imageidx:imageidx+fftlen-1)/fftlen,fftlen)); 51 | image(imageidx,:,1)=20*log10(abs(spectrogramcapture(imageidx,:))); %20*log10 52 | image(imageidx,:,2)=20*log10(abs(spectrogramcapture(imageidx,:))); %.^2 53 | image(imageidx,:,3)=20*log10(abs(spectrogramcapture(imageidx,:))); 54 | end 55 | 56 | image=image-min(image(:)); 57 | image=image*scaleval; 58 | image=image/max(image(:)); 59 | image=image*255; 60 | 61 | image=round(image); 62 | if max(image(:))>255 63 | disp('clipping!') 64 | end 65 | image(image>255)=255; 66 | 67 | image=uint8(image); 68 | 69 | filenamestr=['noise_' num2str(VardB) '_' num2str(iteridx) '.bmp']; 70 | imwrite(image,filenamestr,'bmp') 71 | 72 | end 73 | 74 | 75 | %Return to the Working diretcory 76 | cd(workingfolder) -------------------------------------------------------------------------------- /TrainAlexNetSignalDetector.m: -------------------------------------------------------------------------------- 1 | workingfolder='.\'; 2 | cd(workingfolder) 3 | 4 | %Pull images from the train directory 5 | %The train directory should have two subdirectories 6 | %One subdirectory labeled "Noise", and the other "Signal" 7 | imds = imageDatastore('.\train','FileExtensions',{'.bmp'},'IncludeSubfolders',true,'LabelSource','foldernames'); 8 | 9 | %Create a 90/10 split between training and validation 10 | [imgsTrain,imgsValidation] = splitEachLabel(imds,0.9,'randomized'); 11 | 12 | %Show some of the images 13 | numTrainImages = numel(imgsTrain.Labels); 14 | idx = randperm(numTrainImages,16); 15 | figure 16 | for i = 1:16 17 | subplot(4,4,i) 18 | I = readimage(imgsTrain,idx(i)); 19 | imshow(I) 20 | end 21 | 22 | 23 | 24 | %Load pore-trained Alexnet 25 | net = alexnet; 26 | 27 | %Set up transfer learning 28 | layersTransfer = net.Layers(1:end-3); 29 | 30 | numClasses = numel(categories(imgsTrain.Labels)); 31 | layers = [ 32 | layersTransfer 33 | fullyConnectedLayer(numClasses,'WeightLearnRateFactor',20,'BiasLearnRateFactor',20) 34 | softmaxLayer 35 | classificationLayer]; 36 | 37 | 38 | options = trainingOptions('sgdm', ... 39 | 'MiniBatchSize',10, ... 40 | 'MaxEpochs',3, ... 41 | 'InitialLearnRate',1e-4, ... 42 | 'ValidationData',imgsValidation, ... 43 | 'ValidationFrequency',3, ... 44 | 'ValidationPatience',Inf, ... 45 | 'Verbose',false, ... 46 | 'Plots','training-progress'); 47 | 48 | %Re-train the network 49 | netTransfer = trainNetwork(imgsTrain,layers,options); 50 | 51 | 52 | %Run a few of the validation images 53 | %and create a plot of results 54 | [predictedclass,scores] = classify(netTransfer,imgsValidation); 55 | 56 | idx = randperm(numel(imgsValidation.Files),4); 57 | figure 58 | for i = 1:4 59 | subplot(2,2,i) 60 | I = readimage(imgsValidation,idx(i)); 61 | imshow(I) 62 | label = predictedclass(idx(i)); 63 | strlabel = string(label); 64 | k = strfind(strlabel,'_'); 65 | strlabel(k)=' '; 66 | title(strlabel); 67 | end 68 | 69 | %Calculate and display accuracy 70 | actualclass = imgsValidation.Labels; 71 | accuracy = mean(predictedclass == actualclass); 72 | 73 | disp(accuracy) 74 | -------------------------------------------------------------------------------- /MakeNoiseImages_Interference.m: -------------------------------------------------------------------------------- 1 | %Set your working folder 2 | workingfolder='.\'; 3 | 4 | %Set the name of the folder in which these images will be saved 5 | outputfolder = 'Noise_Images_Interference'; 6 | 7 | %Set the variance of the noise. 8 | NoisePowDb=0; 9 | 10 | fftlen=227; 11 | 12 | noiselength=fftlen*2; 13 | 14 | NumberPerVar=400; 15 | scaleval=2; 16 | 17 | %Make the output folder if it does not exist 18 | go_mkdir=1; 19 | cd(workingfolder) 20 | dc=dir('*.*'); 21 | for idx=3:length(dc) 22 | if strcmp(dc(idx).name,outputfolder) 23 | go_mkdir=0; 24 | end 25 | end 26 | if (1==go_mkdir) 27 | mkdir(outputfolder) 28 | end 29 | 30 | %Go to the output folder 31 | cd([workingfolder '\' outputfolder]) 32 | 33 | %Create the images 34 | for VarIdx=1:length(SNRVectordB) 35 | VardB=SNRVectordB(VarIdx)+NoisePowDb; 36 | 37 | for iteridx=1:NumberPerVar 38 | 39 | %Create the random interference 40 | cwfreq=rand; 41 | cwamp=rand; 42 | 43 | %Create the noise 44 | VarLin=10^(-NoisePowDb/10); 45 | capturewaveform_noise = randn(1,noiselength); 46 | capturewaveform_noise=capturewaveform_noise+1.0i*randn(1,noiselength); 47 | capturewaveform_noise=capturewaveform_noise/sqrt(2); 48 | capturewaveform_noise=capturewaveform_noise*sqrt(VarLin); 49 | %Add the interferer 50 | capturewaveform=capturewaveform_noise+cwamp*exp(2.0i*pi*[1:noiselength]*cwfreq); 51 | 52 | spectrogramcapture=zeros(fftlen,fftlen); 53 | image=zeros(fftlen,fftlen,3); 54 | for imageidx=1:fftlen 55 | %PSD will be spread across 256 bins. 56 | %PSD measured per bin, not per Hz. 57 | %10*log10(1/256) = -24.0824 58 | spectrogramcapture(imageidx,:)=fftshift(fft(capturewaveform(imageidx:imageidx+fftlen-1)/fftlen,fftlen)); 59 | image(imageidx,:,1)=20*log10(abs(spectrogramcapture(imageidx,:))); %20*log10 60 | image(imageidx,:,2)=20*log10(abs(spectrogramcapture(imageidx,:))); %.^2 61 | image(imageidx,:,3)=20*log10(abs(spectrogramcapture(imageidx,:))); 62 | end 63 | 64 | image=image-min(image(:)); 65 | image=image*scaleval;% 66 | image=image/max(image(:)); 67 | image=image*255; 68 | 69 | image=round(image); 70 | if max(image(:))>255 71 | disp('clipping!') 72 | end 73 | image(image>255)=255; 74 | 75 | image=uint8(image); 76 | 77 | 78 | filenamestr=['noise_' num2str(VardB) '_' num2str(iteridx) '.bmp']; 79 | imwrite(image,filenamestr,'bmp') 80 | 81 | end 82 | end 83 | 84 | %Return to the Working diretcory 85 | cd(workingfolder) -------------------------------------------------------------------------------- /EnergyDetector_w_Interference.m: -------------------------------------------------------------------------------- 1 | %Simulation Parametrers 2 | LenMvAvg=227+226; %Same length as the Alexnet Signal Detector 3 | ApproxNumberOfSamplesPerRun=1e6; %approximate # samples to run 4 | SignalToNoisePowerVector=-9:0.1:0; %a vector of SNR values 5 | ThresholdVector=1.2:0.01:1.7; %a vector of threshold values 6 | 7 | OverSamp=4; 8 | 9 | 10 | 11 | 12 | %Plot across Threshold at this SNR value 13 | SNRValueToPlot=SignalToNoisePowerVector(ceil(length(SignalToNoisePowerVector)/2)); 14 | SNRValueIndexToPlot=ceil(length(SignalToNoisePowerVector)/2); 15 | 16 | %Random data 17 | ActualNumberOfSamplesPerRun=ApproxNumberOfSamplesPerRun+OverSamp*LenMvAvg; 18 | ActualNumberOfSamplesPerRun=ceil(ActualNumberOfSamplesPerRun/OverSamp)*OverSamp; 19 | rxdVector=randi([0 1],1,ActualNumberOfSamplesPerRun/OverSamp); 20 | rxdVector=(rxdVector*2)-1; 21 | rxdVector=repelem(rxdVector,OverSamp); 22 | ActualNumberOfSamplesPerRun=length(rxdVector); % determine actual # of samples 23 | 24 | 25 | %Create the noise vector once, reuse later 26 | NoiseVector=randn(1,ActualNumberOfSamplesPerRun); 27 | NoiseVector=NoiseVector+1.0i*randn(1,ActualNumberOfSamplesPerRun); 28 | NoiseVector=NoiseVector/sqrt(2); 29 | 30 | 31 | cwfreq=0.00; 32 | jammersig=1.0*exp(2.0i*pi*[1:ActualNumberOfSamplesPerRun]*cwfreq); 33 | 34 | %Create a 2D array of result values. 35 | %Oragnize by 36 | %Rows=SNR 37 | %Columns=Threshold 38 | FalseAlarmRate=zeros(length(SignalToNoisePowerVector),length(ThresholdVector)); 39 | MissedDetectRate=zeros(length(SignalToNoisePowerVector),length(ThresholdVector)); 40 | 41 | %Simulate and collect FA and MD results 42 | snridxcount=0; 43 | for snridx=SignalToNoisePowerVector 44 | snridxcount=snridxcount+1; 45 | NoisePower=10^-(0/10); 46 | %Add interference to noise 47 | NoiseVectorlocal=sqrt(NoisePower)*NoiseVector+jammersig; 48 | ConjProduct=NoiseVectorlocal.*conj(NoiseVectorlocal); 49 | ConjProduct=sqrt(real(ConjProduct)); 50 | CorrelatedNoise=conv(ConjProduct,ones(1,LenMvAvg)); 51 | CorrelatedNoise=CorrelatedNoise/LenMvAvg; 52 | CorrelatedNoise=CorrelatedNoise((1+LenMvAvg):(end-LenMvAvg)); 53 | CorrelatedNoise=downsample(CorrelatedNoise,LenMvAvg); 54 | LenVal=length(CorrelatedNoise); 55 | threshidxcount=0; 56 | for threshidx=ThresholdVector 57 | threshidxcount=threshidxcount+1; 58 | FalseAlarmRate(snridxcount,threshidxcount)=sum(CorrelatedNoise>=threshidx)/LenVal; 59 | end 60 | 61 | NoiseVectorlocal=sqrt(NoisePower)*NoiseVector; 62 | SignalPower=10^(snridx/10); 63 | rxdVectorlocal=rxdVector*sqrt(SignalPower); 64 | %Add interference and signal to noise 65 | NoiseVectorlocal=NoiseVectorlocal+rxdVectorlocal+jammersig; 66 | ConjProduct=NoiseVectorlocal.*conj(NoiseVectorlocal); 67 | ConjProduct=sqrt(real(ConjProduct)); 68 | CorrelatedNoise=conv(ConjProduct,ones(1,LenMvAvg)); 69 | CorrelatedNoise=CorrelatedNoise((1+LenMvAvg):(end-LenMvAvg)); 70 | CorrelatedNoise=CorrelatedNoise/LenMvAvg; 71 | CorrelatedNoise=downsample(CorrelatedNoise,LenMvAvg); 72 | LenVal=length(CorrelatedNoise); 73 | threshidxcount=0; 74 | for threshidx=ThresholdVector 75 | threshidxcount=threshidxcount+1; 76 | MissedDetectRate(snridxcount,threshidxcount)=sum(CorrelatedNoise255 97 | disp('clipping!') 98 | end 99 | image(image>255)=255; 100 | 101 | image=uint8(image); 102 | 103 | filenamestr=['signal_' num2str(VardB) '_' num2str(iteridx) '.bmp']; 104 | imwrite(image,filenamestr,'bmp') 105 | 106 | end 107 | end 108 | 109 | %Return to the Working diretcory 110 | cd(workingfolder) -------------------------------------------------------------------------------- /MakeSignalImages_Noise6dB.m: -------------------------------------------------------------------------------- 1 | %Set your working folder 2 | workingfolder='.\'; 3 | 4 | %Set the name of the folder in which these images will be saved 5 | outputfolder = 'Signal_Images_Noise_6_dB'; 6 | 7 | %Set the SNR for the images 8 | %The signal power will be set relative to the noise 9 | %SNR can be set as a single value, or as a vector. 10 | %If set as a vector, this script will create 11 | %images corresponding to each desired SNR. 12 | %If set as a single value, then only one 13 | %SNR will be used for all images generated. 14 | %SNR will be used to scale the signal 15 | %with respect to noise 16 | SNRVectordB=[0]; 17 | 18 | %Set the variance of the noise. 19 | NoisePowDb=6; 20 | 21 | fftlen=227; 22 | 23 | symbolsamplen=fftlen*2; 24 | 25 | OSRrate=4; 26 | startpos=1; 27 | 28 | datalen=ceil(symbolsamplen/OSRrate); 29 | 30 | 31 | noiselength=fftlen*2; 32 | 33 | NumberPerVar=400; 34 | scaleval=2; 35 | 36 | %Make the output folder if it does not exist 37 | go_mkdir=1; 38 | cd(workingfolder) 39 | dc=dir('*.*'); 40 | for idx=3:length(dc) 41 | if strcmp(dc(idx).name,outputfolder) 42 | go_mkdir=0; 43 | end 44 | end 45 | if (1==go_mkdir) 46 | mkdir(outputfolder) 47 | end 48 | 49 | %Go to the output folder 50 | cd([workingfolder '\' outputfolder]) 51 | 52 | %Create the images 53 | for VarIdx=1:length(SNRVectordB) 54 | VardB=SNRVectordB(VarIdx)+NoisePowDb; 55 | 56 | for iteridx=1:NumberPerVar 57 | 58 | %Create the signal 59 | datavec = randi([0 1],1,datalen); 60 | symbolvec=(datavec*2)-1; 61 | symbolvecosr=repelem(symbolvec,OSRrate); 62 | symbolvecosr=symbolvecosr(1:noiselength); 63 | 64 | signalvec = zeros(1,noiselength); 65 | signalvec(startpos:startpos+length(symbolvecosr)-1) = symbolvecosr; 66 | signalvec=signalvec/sqrt(var(signalvec)); 67 | SigPowLin=10^(VardB/10); 68 | signalvec=signalvec*sqrt(SigPowLin); 69 | 70 | %Create the noise 71 | VarLin=10^(NoisePowDb/10); 72 | capturewaveform_noise = randn(1,noiselength); 73 | capturewaveform_noise=capturewaveform_noise+1.0i*randn(1,noiselength); 74 | capturewaveform_noise=capturewaveform_noise/sqrt(2); 75 | capturewaveform_noise=capturewaveform_noise*sqrt(VarLin); 76 | capturewaveform=capturewaveform_noise+signalvec; %Add the signal to the noise 77 | 78 | spectrogramcapture=zeros(fftlen,fftlen); 79 | image=zeros(fftlen,fftlen,3); 80 | for imageidx=1:fftlen 81 | %PSD will be spread across 256 bins. 82 | %PSD measured per bin, not per Hz. 83 | %10*log10(1/256) = -24.0824 84 | spectrogramcapture(imageidx,:)=fftshift(fft(capturewaveform(imageidx:imageidx+fftlen-1)/fftlen,fftlen)); 85 | image(imageidx,:,1)=20*log10(abs(spectrogramcapture(imageidx,:))); %20*log10 86 | image(imageidx,:,2)=20*log10(abs(spectrogramcapture(imageidx,:))); %.^2 87 | image(imageidx,:,3)=20*log10(abs(spectrogramcapture(imageidx,:))); 88 | end 89 | 90 | image=image-min(image(:)); 91 | image=image*scaleval; 92 | image=image/max(image(:)); 93 | image=image*255; 94 | 95 | image=round(image); 96 | if max(image(:))>255 97 | disp('clipping!') 98 | end 99 | image(image>255)=255; 100 | 101 | image=uint8(image); 102 | 103 | filenamestr=['signal_' num2str(VardB) '_' num2str(iteridx) '.bmp']; 104 | imwrite(image,filenamestr,'bmp') 105 | 106 | end 107 | end 108 | 109 | %Return to the Working diretcory 110 | cd(workingfolder) -------------------------------------------------------------------------------- /MakeSignalImages_Interference.m: -------------------------------------------------------------------------------- 1 | %Set your working folder 2 | workingfolder='.\'; 3 | 4 | %Set the name of the folder in which these images will be saved 5 | outputfolder = 'Signal_Images_Interference'; 6 | 7 | %Set the SNR for the images 8 | %The signal power will be set relative to the noise 9 | %SNR can be set as a single value, or as a vector. 10 | %If set as a vector, this script will create 11 | %images corresponding to each desired SNR. 12 | %If set as a single value, then only one 13 | %SNR will be used for all images generated. 14 | %SNR will be used to scale the signal 15 | %with respect to noise 16 | SNRVectordB=[0]; 17 | 18 | %Set the variance of the noise. 19 | NoisePowDb=0; 20 | 21 | fftlen=227; 22 | 23 | symbolsamplen=fftlen*2; 24 | 25 | OSRrate=4; 26 | startpos=1; 27 | 28 | datalen=ceil(symbolsamplen/OSRrate); 29 | 30 | 31 | noiselength=fftlen*2; 32 | 33 | NumberPerVar=400; 34 | scaleval=2; 35 | 36 | %Make the output folder if it does not exist 37 | go_mkdir=1; 38 | cd(workingfolder) 39 | dc=dir('*.*'); 40 | for idx=3:length(dc) 41 | if strcmp(dc(idx).name,outputfolder) 42 | go_mkdir=0; 43 | end 44 | end 45 | if (1==go_mkdir) 46 | mkdir(outputfolder) 47 | end 48 | 49 | %Go to the output folder 50 | cd([workingfolder '\' outputfolder]) 51 | 52 | %Create the images 53 | for VarIdx=1:length(SNRVectordB) 54 | VardB=SNRVectordB(VarIdx)+NoisePowDb; 55 | 56 | for iteridx=1:NumberPerVar 57 | 58 | %Create the signal 59 | datavec = randi([0 1],1,datalen); 60 | symbolvec=(datavec*2)-1; 61 | symbolvecosr=repelem(symbolvec,OSRrate); 62 | symbolvecosr=symbolvecosr(1:noiselength); 63 | 64 | signalvec = zeros(1,noiselength); 65 | signalvec(startpos:startpos+length(symbolvecosr)-1) = symbolvecosr; 66 | signalvec=signalvec/sqrt(var(signalvec)); 67 | SigPowLin=10^(VardB/10); 68 | signalvec=signalvec*sqrt(SigPowLin); 69 | 70 | %Create the random interference 71 | cwfreq=rand; 72 | cwamp=rand; 73 | 74 | %Create the noise 75 | VarLin=10^(-NoisePowDb/10); 76 | capturewaveform_noise = randn(1,noiselength); 77 | capturewaveform_noise=capturewaveform_noise+1.0i*randn(1,noiselength); 78 | capturewaveform_noise=capturewaveform_noise/sqrt(2); 79 | capturewaveform_noise=capturewaveform_noise*sqrt(VarLin); 80 | %Add the signal and the interferer 81 | capturewaveform=capturewaveform_noise+signalvec+cwamp*exp(2.0i*pi*[1:noiselength]*cwfreq); 82 | 83 | spectrogramcapture=zeros(fftlen,fftlen); 84 | image=zeros(fftlen,fftlen,3); 85 | for imageidx=1:fftlen 86 | %PSD will be spread across 256 bins. 87 | %PSD measured per bin, not per Hz. 88 | %10*log10(1/256) = -24.0824 89 | spectrogramcapture(imageidx,:)=fftshift(fft(capturewaveform(imageidx:imageidx+fftlen-1)/fftlen,fftlen)); 90 | image(imageidx,:,1)=20*log10(abs(spectrogramcapture(imageidx,:))); %20*log10 91 | image(imageidx,:,2)=20*log10(abs(spectrogramcapture(imageidx,:))); %.^2 92 | image(imageidx,:,3)=20*log10(abs(spectrogramcapture(imageidx,:))); 93 | end 94 | 95 | image=image-min(image(:)); 96 | image=image*scaleval;% 97 | image=image/max(image(:)); 98 | image=image*255; 99 | 100 | image=round(image); 101 | if max(image(:))>255 102 | disp('clipping!') 103 | end 104 | image(image>255)=255; 105 | 106 | image=uint8(image); 107 | 108 | 109 | filenamestr=['signal_' num2str(VardB) '_' num2str(iteridx) '.bmp']; 110 | imwrite(image,filenamestr,'bmp') 111 | 112 | end 113 | end 114 | 115 | %Return to the Working diretcory 116 | cd(workingfolder) --------------------------------------------------------------------------------