<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=Rozwi%C4%85zania</id>
	<title>Rozwiązania - Historia wersji</title>
	<link rel="self" type="application/atom+xml" href="http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=Rozwi%C4%85zania"/>
	<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Rozwi%C4%85zania&amp;action=history"/>
	<updated>2026-04-23T12:04:49Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Rozwi%C4%85zania&amp;diff=5576&amp;oldid=prev</id>
		<title>Tsteifer: UWAGA! Usunięcie treści (strona pozostała pusta)!</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Rozwi%C4%85zania&amp;diff=5576&amp;oldid=prev"/>
		<updated>2016-07-29T08:57:55Z</updated>

		<summary type="html">&lt;p&gt;UWAGA! Usunięcie treści (strona pozostała pusta)!&lt;/p&gt;
&lt;a href=&quot;http://brain.fuw.edu.pl/edu/index.php?title=Rozwi%C4%85zania&amp;amp;diff=5576&amp;amp;oldid=5573&quot;&gt;Podgląd zmian&lt;/a&gt;</summary>
		<author><name>Tsteifer</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Rozwi%C4%85zania&amp;diff=5573&amp;oldid=prev</id>
		<title>Tsteifer: Utworzono nową stronę &quot;&lt;source lang=python&gt; # -*- coding: UTF-8 -*- ## (c) Tomasz Steifer 2016 ## solutions to http://brain.fuw.edu.pl/edu/index.php/USG/Klasyczna_rekonstrukcja  import numpy a...&quot;</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Rozwi%C4%85zania&amp;diff=5573&amp;oldid=prev"/>
		<updated>2016-07-29T08:55:34Z</updated>

		<summary type="html">&lt;p&gt;Utworzono nową stronę &amp;quot;&amp;lt;source lang=python&amp;gt; # -*- coding: UTF-8 -*- ## (c) Tomasz Steifer 2016 ## solutions to http://brain.fuw.edu.pl/edu/index.php/USG/Klasyczna_rekonstrukcja  import numpy a...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
## (c) Tomasz Steifer 2016&lt;br /&gt;
## solutions to http://brain.fuw.edu.pl/edu/index.php/USG/Klasyczna_rekonstrukcja&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
import scipy.signal as ss&lt;br /&gt;
&lt;br /&gt;
f0=5.5e6 # Transducer center frequency [Hz]&lt;br /&gt;
fs=50e6 # Sampling frequency [Hz]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
c=1490. # Speed of sound [m/s]&lt;br /&gt;
pitch=0.00021 #Transducer's pitch&lt;br /&gt;
NT=192 # Number of full aperture elements&lt;br /&gt;
Nrec=64 #Number of receive events/lines&lt;br /&gt;
Ntr=64 # Transmit subaperture&lt;br /&gt;
Rf1 = 40*(1e-3) #depth of focal point&lt;br /&gt;
&lt;br /&gt;
fname=&amp;quot;usg1_bf_nitki.npy&amp;quot; #numpy file with RF data from Ultrasound Research Platform&lt;br /&gt;
&lt;br /&gt;
RF=np.load(fname)&lt;br /&gt;
Mz=np.shape(RF)[1]&lt;br /&gt;
##reminder about data:&lt;br /&gt;
##first dimension -&amp;gt; receive transducers //Nrec&lt;br /&gt;
##second dimension -&amp;gt; time of acquisition ~ depth&lt;br /&gt;
##third dimension -&amp;gt; transmit event  // (NT - Ntr)&lt;br /&gt;
&lt;br /&gt;
#First, we need to generate transmit delays - to be used in reconstruction&lt;br /&gt;
&lt;br /&gt;
transmit_delays = -(np.arange(Ntr)-(float(Ntr)/2-0.5))*pitch&lt;br /&gt;
transmit_delays = (np.sqrt(transmit_delays**2+Rf1**2)-Rf1)/c*fs&lt;br /&gt;
&lt;br /&gt;
#For sake of clarity, beamforming is performed in loops&lt;br /&gt;
image=np.zeros((NT-Ntr,Mz)) #&lt;br /&gt;
tmp=np.zeros((Mz,Ntr))&lt;br /&gt;
for line in range(NT-Ntr):&lt;br /&gt;
    for k in range(Nrec):&lt;br /&gt;
        tmp0=RF[line+k,transmit_delays[k]:Mz+transmit_delays[k],line]&lt;br /&gt;
        tmp[:len(tmp0),k]=tmp0&lt;br /&gt;
    tmp2=np.mean(tmp,axis=1)&lt;br /&gt;
    image[line,:len(tmp2)]=tmp2&lt;br /&gt;
&lt;br /&gt;
#Some simple filters&lt;br /&gt;
b, a = ss.butter(10, 0.05, 'highpass')    &lt;br /&gt;
image = ss.filtfilt(b, a, image,axis=1)&lt;br /&gt;
b, a = ss.butter(10, 0.7, 'lowpass')    &lt;br /&gt;
image = ss.filtfilt(b, a, image,axis=1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#We need to interpolate the image&lt;br /&gt;
xx=np.linspace(-(NT - Ntr)/2.*pitch,((NT - Ntr))/2.*pitch,(NT - Ntr)) #old x scale&lt;br /&gt;
zz=np.linspace(0,np.shape(image)[1]/2*(1./fs)*c,np.shape(image)[1]) #old depth scale&lt;br /&gt;
from scipy import interpolate&lt;br /&gt;
#f=interpolate.interp2d(xx,zz,image,kind='cubic')&lt;br /&gt;
f=interpolate.interp2d(xx,zz,image.transpose(),'cubic')&lt;br /&gt;
&lt;br /&gt;
#new (natural) grid&lt;br /&gt;
step=c/(2*f0)&lt;br /&gt;
step=step/4&lt;br /&gt;
maxdepth=np.max(zz)&lt;br /&gt;
mindepth=0.005 #try to set minimal depth to 0 and see what happens&lt;br /&gt;
maxWidth=0.01&lt;br /&gt;
minWidth=0.01&lt;br /&gt;
&lt;br /&gt;
X0 = np.arange(-minWidth,maxWidth,step)#.reshape((-1,1))&lt;br /&gt;
R0 = np.arange(mindepth,maxdepth,step)&lt;br /&gt;
&lt;br /&gt;
#and interpolation&lt;br /&gt;
image=f(X0,R0)&lt;br /&gt;
&lt;br /&gt;
#Lastly, envelope detection using Hilbert transform&lt;br /&gt;
image=np.abs(ss.hilbert(image,axis=0))&lt;br /&gt;
&lt;br /&gt;
low=50 #lower bound for dB scale&lt;br /&gt;
&lt;br /&gt;
#and log-conversion etc &amp;lt;- this may also be done by appropriate matplotlib methods&lt;br /&gt;
indices = image&amp;gt;0&lt;br /&gt;
indices2 =image&amp;lt;0&lt;br /&gt;
indices = indices+indices2&lt;br /&gt;
image=np.abs(image)/np.max(np.abs(image[indices]))&lt;br /&gt;
image[indices]=10*np.log(image[indices])&lt;br /&gt;
&lt;br /&gt;
indices = indices &amp;lt;-low&lt;br /&gt;
image[indices]=-low&lt;br /&gt;
indices = image&amp;gt;=0&lt;br /&gt;
image[indices]=0&lt;br /&gt;
&lt;br /&gt;
#Let's have a look:&lt;br /&gt;
py.imshow(image,cmap=&amp;quot;gray&amp;quot;)&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
## (c) Tomasz Steifer 2016&lt;br /&gt;
## solutions to http://brain.fuw.edu.pl/edu/index.php/USG/PWI&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
import scipy.signal as ss&lt;br /&gt;
&lt;br /&gt;
f0=5.5e6 # Transducer center frequency [Hz]&lt;br /&gt;
fs=50e6 # Sampling frequency [Hz]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
c=1490. # Speed of sound [m/s]&lt;br /&gt;
pitch=0.00021 #Transducer's pitch&lt;br /&gt;
NT=192 # Number of full aperture elements&lt;br /&gt;
Nrec=192 #Number of receive events/lines&lt;br /&gt;
Ntr=192 # Transmit subaperture&lt;br /&gt;
Rf1 = 1000 #depth of focal point *-1&lt;br /&gt;
Theta = [ -1.74532925e-01 , -1.39626340e-01,  -1.04719755e-01,  -6.98131701e-02,&lt;br /&gt;
  -3.49065850e-02,  -2.77555756e-17,   3.49065850e-02 ,  6.98131701e-02,&lt;br /&gt;
   1.04719755e-01  , 1.39626340e-01  , 1.74532925e-01] #Transmit angles&lt;br /&gt;
&lt;br /&gt;
fname=&amp;quot;usg2_pwi_nitki.npy&amp;quot; #numpy file with RF data from Ultrasound Research Platform&lt;br /&gt;
&lt;br /&gt;
RF=np.load(fname)&lt;br /&gt;
RF=np.transpose(RF,[1,0,2])&lt;br /&gt;
Mz=np.shape(RF)[1]&lt;br /&gt;
##reminder about data:&lt;br /&gt;
##first dimension -&amp;gt; receive transducers //Nrec&lt;br /&gt;
##second dimension -&amp;gt; time of acquisition ~ depth&lt;br /&gt;
##third dimension -&amp;gt; transmit event  // (NT - Ntr)&lt;br /&gt;
&lt;br /&gt;
#First, we need to generate transmit delays - to be used in reconstruction&lt;br /&gt;
transmit_delays = np.zeros((len(Theta), Ntr))&lt;br /&gt;
&lt;br /&gt;
for m in xrange(len(Theta)):&lt;br /&gt;
    for n in xrange(Ntr):         &lt;br /&gt;
        Xf = -1*Rf1*np.sin(Theta[m]) - ( n - (Ntr/2-0.5) )*pitch&lt;br /&gt;
        transmit_delays[m,n] = (np.sqrt(Xf**2 + (Rf1*np.cos(Theta[m]))**2) - Rf1)&lt;br /&gt;
    transmit_delays[m,:] = transmit_delays[m,:]&lt;br /&gt;
&lt;br /&gt;
#Function for reconstruction&lt;br /&gt;
def pwi_shift(matrix,gridx,gridz,theta,fs,c,pitch,startdepth):&lt;br /&gt;
    #Reconstruction for one angle&lt;br /&gt;
    Nrec=np.shape(matrix)[1]&lt;br /&gt;
    out=np.zeros((len(gridz),len(gridx),Nrec))&lt;br /&gt;
    gridx,gridz = np.meshgrid(gridx,gridz,indexing='xy')&lt;br /&gt;
    shift_tr=(gridx*np.sin(theta)+gridz*np.cos(theta) )/c*fs&lt;br /&gt;
    for nrec in xrange(Nrec):&lt;br /&gt;
        Rec_delay=np.sqrt(gridz**2+(gridx-(-(float(Nrec)/2-1./2)*pitch + nrec*pitch))**2)/c&lt;br /&gt;
        shift_rec=Rec_delay*fs&lt;br /&gt;
        indx=(shift_tr+shift_rec+startdepth).astype(np.int)&lt;br /&gt;
        out[:,:,nrec]=matrix[:,nrec][indx]&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
def pwi(matrix,gridx,gridz,angles,fs,c,pitch):&lt;br /&gt;
    out=np.zeros((len(gridz),len(gridx),len(angles)))&lt;br /&gt;
    for angle in xrange(len(angles)):&lt;br /&gt;
        startdepth=1/2.*(np.max(np.abs(transmit_delays[angle,:]))*fs/c)+15 #start sample shift&lt;br /&gt;
        shifted=pwi_shift(matrix[:,:,angle],gridx,gridz,angles[angle],fs,c,pitch,startdepth)&lt;br /&gt;
        indices=np.abs(shifted)&amp;gt;0&lt;br /&gt;
        divs=np.ones(np.shape(shifted))&lt;br /&gt;
        divs[indices]=shifted[indices]/shifted[indices]&lt;br /&gt;
        divs=np.sum(divs,axis=2)&lt;br /&gt;
        out[:,:,angle]=np.sum(shifted,axis=2)/divs&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
#grid&lt;br /&gt;
step=c/(2*f0) &lt;br /&gt;
step=step/4&lt;br /&gt;
maxdepth=(np.shape(RF)[0]*c/fs) *0.3 &lt;br /&gt;
mindepth=0.005 #try to set minimal depth to 0 and see what happens&lt;br /&gt;
maxWidth=0.01&lt;br /&gt;
minWidth=0.01&lt;br /&gt;
&lt;br /&gt;
X0 = np.arange(-minWidth,maxWidth,step)#.reshape((-1,1))&lt;br /&gt;
R0 = np.arange(mindepth,maxdepth,step)&lt;br /&gt;
&lt;br /&gt;
#Some simple filters&lt;br /&gt;
b, a = ss.butter(3, (f0-(0.5*f0))/(0.5*fs), 'highpass')    &lt;br /&gt;
RF = ss.filtfilt(b, a, RF,axis=0)&lt;br /&gt;
b, a = ss.butter(3, (f0+(0.5*f0))/(0.5*fs), 'lowpass')    &lt;br /&gt;
RF = ss.filtfilt(b, a, RF,axis=0)&lt;br /&gt;
&lt;br /&gt;
image = np.mean(pwi(RF,X0,R0,Theta,fs,c,pitch),axis=2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Lastly, envelope detection using Hilbert transform&lt;br /&gt;
image=np.abs(ss.hilbert(image,axis=0))&lt;br /&gt;
&lt;br /&gt;
low=50 #lower bound for dB scale&lt;br /&gt;
&lt;br /&gt;
#and log-conversion etc &amp;lt;- this may also be done by appropriate matplotlib methods&lt;br /&gt;
indices = image&amp;gt;0&lt;br /&gt;
indices2 =image&amp;lt;0&lt;br /&gt;
indices = indices+indices2&lt;br /&gt;
image=np.abs(image)/np.max(np.abs(image[indices]))&lt;br /&gt;
image[indices]=10*np.log(image[indices])&lt;br /&gt;
&lt;br /&gt;
indices = indices &amp;lt;-low&lt;br /&gt;
image[indices]=-low&lt;br /&gt;
indices = image&amp;gt;=0&lt;br /&gt;
image[indices]=0&lt;br /&gt;
&lt;br /&gt;
#Let's have a look:&lt;br /&gt;
py.imshow(image,cmap=&amp;quot;gray&amp;quot;)&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
## (c) Tomasz Steifer 2016&lt;br /&gt;
## solutions to http://brain.fuw.edu.pl/edu/index.php/USG/Doppler&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
import scipy.signal as sig&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def demodulate(array,f=5.5e6, ar = 3.079291762894534e-05 ):&lt;br /&gt;
    t=np.arange(np.shape(array)[0])*(2.*ar/1540)&lt;br /&gt;
    e=np.exp(-1j*2*np.pi*f*t)&lt;br /&gt;
    niuarray=np.zeros(np.shape(array))+0j&lt;br /&gt;
    for y in range(np.shape(array)[1]):&lt;br /&gt;
        for z in range(np.shape(array)[2]):&lt;br /&gt;
            niuarray[:,y,z]=array[:,y,z]*e&lt;br /&gt;
    return niuarray&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def autocorr_freq(array):&lt;br /&gt;
    r=np.sum(array[1:]*np.conj(array[:-1]))&lt;br /&gt;
    return np.arctanh(r.imag/r.real)&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
def doppler(array):&lt;br /&gt;
    newarray=np.zeros(np.shape(array)[:2])&lt;br /&gt;
    for x in range(np.shape(array)[0]):&lt;br /&gt;
        for y in range(np.shape(array)[1]):&lt;br /&gt;
            newarray[x,y]=autocorr_freq(array[x,y,:])&lt;br /&gt;
    return newarray&lt;br /&gt;
&lt;br /&gt;
def moda(array):&lt;br /&gt;
    return np.average(np.arange(len(array)),weights=array)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
big=np.load(&amp;quot;usg3_doppler_circle_10lh.npy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
big=big[:,:,:]&lt;br /&gt;
&lt;br /&gt;
IQbig=demodulate(big)&lt;br /&gt;
import scipy.signal as sig&lt;br /&gt;
b, a = sig.butter(3, 5.5/9, 'lowpass')    &lt;br /&gt;
IQbig = sig.filtfilt(b, a, IQbig,axis=0)&lt;br /&gt;
&lt;br /&gt;
low=60&lt;br /&gt;
Vmax=np.abs(big)&lt;br /&gt;
indices = Vmax&amp;gt;0&lt;br /&gt;
indices2= Vmax&amp;lt;0&lt;br /&gt;
indices= indices+indices2&lt;br /&gt;
Vmax=np.abs(Vmax)/np.max(np.abs(Vmax[indices]))&lt;br /&gt;
Vmax[indices] = 10*np.log(Vmax[indices])&lt;br /&gt;
&lt;br /&gt;
indices = Vmax &amp;lt;-low&lt;br /&gt;
Vmax[indices]=-low&lt;br /&gt;
indices = Vmax &amp;gt;= 0&lt;br /&gt;
Vmax[indices]=np.min(Vmax)&lt;br /&gt;
RFbig=Vmax&lt;br /&gt;
&lt;br /&gt;
print np.shape(RFbig)&lt;br /&gt;
&lt;br /&gt;
py.subplot(2,1,1)&lt;br /&gt;
py.imshow(RFbig[:,:,0])&lt;br /&gt;
py.subplot(2,1,2)&lt;br /&gt;
flow=doppler(IQbig)&lt;br /&gt;
py.imshow(sig.medfilt2d(flow))&lt;br /&gt;
py.show()&lt;br /&gt;
         &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
## (c) Tomasz Steifer 2016&lt;br /&gt;
## solutions to http://brain.fuw.edu.pl/edu/index.php/USG/Parametryczne&lt;br /&gt;
#Input: RF images taken from two different angles&lt;br /&gt;
def korelacje(ar1,ar2,d):&lt;br /&gt;
    a,b=np.shape(ar1)&lt;br /&gt;
    out=np.zeros(np.shape(ar1))&lt;br /&gt;
    for x in xrange(a):&lt;br /&gt;
        for y in xrange(d/2,b-d-1):&lt;br /&gt;
            out[x,y]=np.argmax(np.correlate(ar1[x,y:y+d],ar2[x,y:y+d],mode=&amp;quot;same&amp;quot;))&lt;br /&gt;
    return out&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
## solutions to http://brain.fuw.edu.pl/edu/index.php/USG/GPU&lt;br /&gt;
kernels=&amp;quot;&lt;br /&gt;
        __kernel void funkcja(__global float *a, __global float *b, __global float *out,)&lt;br /&gt;
        {&lt;br /&gt;
        //zaczynamy od zadeklarowania zmiennych&lt;br /&gt;
        const int n = get_global_id(0); //indeks w pierwszym wymiarze danej jednostki roboczej&lt;br /&gt;
        const int m = get_global_id(1); //indeks w drugim wymiarze danej jednostki roboczej&lt;br /&gt;
        const int M = get_global_size(1); &lt;br /&gt;
        const int nm = n*M + m; // indeks w tablicy wyjsciowej odpowiadajacy wartości o współrzędnych (n,m)&lt;br /&gt;
        a[nm] = ceil(sqrt(a[nm]*a[nm]));&lt;br /&gt;
        b[nm] = ceil(sqrt(b[nm]*b[nm]));&lt;br /&gt;
        int c;&lt;br /&gt;
        while ( a != 0 ) {&lt;br /&gt;
          c = a[nm]; a[nm] = b[nm]%a[nm];  b[nm] = c;&lt;br /&gt;
        }&lt;br /&gt;
        out[nm]=b[nm];&lt;br /&gt;
        }&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tsteifer</name></author>
		
	</entry>
</feed>