diff --git a/SimPlatform/Simulator.py b/SimPlatform/Simulator.py new file mode 100644 index 0000000000000000000000000000000000000000..b55877a4cc5f9037b9f57f247db0a14f0dcc411c --- /dev/null +++ b/SimPlatform/Simulator.py @@ -0,0 +1,88 @@ +# -*- coding: utf-8 -*- +""" +Created on Wed Aug 8 15:45:43 2018 + +@author: Yi Zhang +""" + +import numpy as np +from scipy.signal import convolve2d +from SimPlatform.ZoneTissue import ZoneTissue +from SimPlatform.ZoneBubbles import ZoneBubbles +from SimPlatform.Parameters import params_default +from scipy.special import gamma + +"""Parameters for ultrasonic device""" + +""" +1.pixel: size of pixel of screen. unit=mm, pixel[0] corresponds to y dimension, + pixel[1] corresponds to x dimension. +2.psf: the standard variation of the point spread function. psf[0] corresponds to + y dimension, psf[1] corresponds to x dimension. +""" + +class Simulator: + def __init__(self,params=params_default): + #global settings + self.pixel=params['pixel'] #size of pixel, unit: mm + self.shape=params['shape'] + self.ampbubbles=params['ampbubbles'] + self.amptissue=params['amptissue'] + self.sigman=params['ampnoise'] + self.sigman=self.sigman/np.sqrt(2)/gamma(1.5) + + #bubbles settings + self.zTissue=ZoneTissue(params) + self.zBubbles=ZoneBubbles(params) + #psf + s1,s2=params['psf'] + s1=s1/self.pixel[0] + s2=s2/self.pixel[1] + fshape=[int(10*s1),int(10*s2)] + xc,yc=(fshape[1]-1)/2,(fshape[0]-1)/2 + xv,yv=np.meshgrid(np.arange(fshape[1])-xc,np.arange(fshape[0])-yc) + self.filter=np.exp(-(xv**2/2/s2**2+yv**2/2/s1**2)) + self.filter=self.filter.astype(np.float64) + + def generate(self,T=20): + Tissue=np.zeros(self.shape+tuple([T]),dtype=np.float64) + Bubbles=np.zeros(self.shape+tuple([T]),dtype=np.float64) + noi=np.zeros(self.shape+tuple([T]),dtype=np.float64) + #phi=np.random.uniform(0,2*np.pi) + #lmd=2*np.pi*15e6/34e4*self.pixel[0] + #_,yv=np.meshgrid(np.arange(self.shape[1]),np.arange(self.shape[0])) + #phase0=np.exp(1j*phi)*np.exp(1j*lmd*yv) + #phase=np.zeros(self.shape+tuple([T]),dtype=np.complex128) + + for t in range(T): + Bubbles[:,:,t]=np.real(self.zBubbles.image()) + Tissue[:,:,t]=np.real(self.zTissue.image()) + noi[:,:,t]=np.random.normal(0,self.sigman,self.shape) #+1j*np.random.normal(0,self.sigman,self.shape) + #phase[:,:,t]=phase0 + + self.zBubbles.refresh() + self.zTissue.refresh() + + #control the amplitude of bubbles, tissue and noise + tmpb=Bubbles[Bubbles!=0] + if not (np.sum(np.abs(Bubbles))==0): + Bubbles=Bubbles*self.ampbubbles/np.mean(np.abs(tmpb)) + AMtissue=np.random.uniform(0.6,1,[1]) + Tissue=Tissue*self.amptissue/np.max(np.abs(Tissue))*2*AMtissue + + #point spread function + for i in range(T): + Bubbles[:,:,i]=self.psf(Bubbles[:,:,i]) + Tissue[:,:,i]=self.psf(Tissue[:,:,i]) + noi[:,:,i]=self.psf(noi[:,:,i]) + Sum=Bubbles+Tissue+noi + + return Sum,Bubbles,Tissue + + def psf(self,A): + return convolve2d(A,self.filter,mode='same') + + + + + \ No newline at end of file