mirror of
https://github.com/nqrduck/nqr-blochsimulator.git
synced 2024-06-30 01:09:08 +00:00
Updated conversion factor.
This commit is contained in:
parent
85e01f45bd
commit
444453e69f
|
@ -102,7 +102,6 @@ class Simulation:
|
||||||
B1 = (
|
B1 = (
|
||||||
self.calc_B1() * 1e3
|
self.calc_B1() * 1e3
|
||||||
) # I think this is multiplied by 1e3 because everything is in mT
|
) # I think this is multiplied by 1e3 because everything is in mT
|
||||||
print(B1)
|
|
||||||
# B1 = 17.3 # Something might be wrong with the calculation of the B1 field. This has to be checked.
|
# B1 = 17.3 # Something might be wrong with the calculation of the B1 field. This has to be checked.
|
||||||
self.sample.gamma = self.sample.gamma * 1e-6 # We need our gamma in MHz / T
|
self.sample.gamma = self.sample.gamma * 1e-6 # We need our gamma in MHz / T
|
||||||
self.sample.T1 = self.sample.T1 * 1e3 # We need our T1 in ms
|
self.sample.T1 = self.sample.T1 * 1e3 # We need our T1 in ms
|
||||||
|
@ -135,8 +134,9 @@ class Simulation:
|
||||||
Mtrans_avg = np.mean(Mtrans, axis=0)
|
Mtrans_avg = np.mean(Mtrans, axis=0)
|
||||||
Mtrans_avg = np.delete(Mtrans_avg, -1) # Remove the last element
|
Mtrans_avg = np.delete(Mtrans_avg, -1) # Remove the last element
|
||||||
|
|
||||||
|
|
||||||
# Scale the signal according to the reference voltage, averages and gain
|
# Scale the signal according to the reference voltage, averages and gain
|
||||||
timedomain_signal = Mtrans_avg * reference_voltage * self.conversion_factor
|
timedomain_signal = Mtrans_avg * reference_voltage
|
||||||
|
|
||||||
# Add the losses of the receiver - this should probably be done before the scaling
|
# Add the losses of the receiver - this should probably be done before the scaling
|
||||||
timedomain_signal = timedomain_signal * (1 - 10 ** (-self.loss_RX / 20))
|
timedomain_signal = timedomain_signal * (1 - 10 ** (-self.loss_RX / 20))
|
||||||
|
@ -144,9 +144,11 @@ class Simulation:
|
||||||
# Add noise to the signal
|
# Add noise to the signal
|
||||||
noise_data = self.calculate_noise(timedomain_signal)
|
noise_data = self.calculate_noise(timedomain_signal)
|
||||||
|
|
||||||
timedomain_signal = timedomain_signal * self.averages * self.gain + noise_data * self.gain
|
timedomain_signal = (timedomain_signal * self.averages * self.gain) + (noise_data * self.gain)
|
||||||
|
# print(abs(timedomain_signal))
|
||||||
|
|
||||||
return timedomain_signal
|
timedomain_signal = timedomain_signal / self.averages
|
||||||
|
return timedomain_signal * self.conversion_factor
|
||||||
|
|
||||||
def bloch_symmetric_strang_splitting(
|
def bloch_symmetric_strang_splitting(
|
||||||
self, B1, xdis, real_pulsepower, imag_pulsepower, relax=1
|
self, B1, xdis, real_pulsepower, imag_pulsepower, relax=1
|
||||||
|
@ -298,37 +300,30 @@ class Simulation:
|
||||||
u = 4 * np.pi * 1e-7 # permeability of free space
|
u = 4 * np.pi * 1e-7 # permeability of free space
|
||||||
|
|
||||||
magnetization = (
|
magnetization = (
|
||||||
self.sample.gamma
|
((self.sample.gamma
|
||||||
* 2
|
* 2
|
||||||
* self.sample.atoms
|
* self.sample.atoms)
|
||||||
/ (2 * self.sample.nuclear_spin + 1)
|
/ (2 * self.sample.nuclear_spin + 1))
|
||||||
* h**2
|
* (h**2
|
||||||
* self.sample.resonant_frequency
|
* self.sample.resonant_frequency * 2 * np.pi)
|
||||||
/ Boltzmann
|
/ (Boltzmann
|
||||||
/ self.temperature
|
* self.temperature)
|
||||||
* self.sample.spin_factor
|
* self.sample.spin_factor
|
||||||
)
|
)
|
||||||
|
|
||||||
coil_crossection = np.pi * (self.diameter_coil / 2) ** 2
|
coil_crossection = np.pi * (self.diameter_coil / 2) ** 2
|
||||||
|
|
||||||
reference_voltage = (
|
reference_voltage = (
|
||||||
self.number_turns
|
self.number_turns
|
||||||
* coil_crossection
|
* coil_crossection
|
||||||
* u
|
* u
|
||||||
* self.sample.gamma
|
* (self.sample.resonant_frequency * 2 * np.pi)
|
||||||
* 2
|
* magnetization
|
||||||
* self.sample.atoms
|
|
||||||
/ (2 * self.sample.nuclear_spin + 1)
|
|
||||||
* h**2
|
|
||||||
* self.sample.resonant_frequency**2
|
|
||||||
/ Boltzmann
|
|
||||||
/ self.temperature
|
|
||||||
* self.sample.spin_factor
|
|
||||||
)
|
)
|
||||||
reference_voltage = (
|
reference_voltage = (
|
||||||
reference_voltage * self.sample.powder_factor * self.sample.filling_factor
|
reference_voltage * self.sample.powder_factor * self.sample.filling_factor
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
# This is assumes thatour noise is dominated by everything after the resonator - this is not true for low Q probe coils
|
# This is assumes thatour noise is dominated by everything after the resonator - this is not true for low Q probe coils
|
||||||
reference_voltage = reference_voltage * np.sqrt(self.q_factor_receive)
|
reference_voltage = reference_voltage * np.sqrt(self.q_factor_receive)
|
||||||
|
|
||||||
|
@ -347,9 +342,9 @@ class Simulation:
|
||||||
noise_data : np.array
|
noise_data : np.array
|
||||||
The noise array that is added to the signal."""
|
The noise array that is added to the signal."""
|
||||||
n_timedomain_points = timedomain_signal.shape[0]
|
n_timedomain_points = timedomain_signal.shape[0]
|
||||||
noise_data = self.noise * np.random.randn(
|
noise_data = self.noise * 1e-6 * np.random.randn(
|
||||||
self.averages, n_timedomain_points
|
self.averages, n_timedomain_points
|
||||||
) + 1j * self.noise * np.random.randn(self.averages, n_timedomain_points)
|
) + 1j * self.noise * 1e-6 * np.random.randn(self.averages, n_timedomain_points)
|
||||||
noise_data = np.sum(noise_data, axis=0) # Sum along the first axis
|
noise_data = np.sum(noise_data, axis=0) # Sum along the first axis
|
||||||
return noise_data
|
return noise_data
|
||||||
|
|
||||||
|
|
|
@ -44,20 +44,20 @@ class TestSimulation(unittest.TestCase):
|
||||||
number_isochromats=1000,
|
number_isochromats=1000,
|
||||||
initial_magnetization=1,
|
initial_magnetization=1,
|
||||||
gradient=1,
|
gradient=1,
|
||||||
noise=2,
|
noise=0.5,
|
||||||
length_coil=6e-3,
|
length_coil=6e-3,
|
||||||
diameter_coil=3e-3,
|
diameter_coil=3e-3,
|
||||||
number_turns=9,
|
number_turns=9,
|
||||||
q_factor_transmitt=100,
|
q_factor_transmitt=100,
|
||||||
q_factor_receive=100,
|
q_factor_receive=100,
|
||||||
power_amplifier_power=500,
|
power_amplifier_power=110,
|
||||||
pulse=self.pulse,
|
pulse=self.pulse,
|
||||||
averages=1,
|
averages=1000,
|
||||||
gain=6000,
|
gain=5600,
|
||||||
temperature=77,
|
temperature=300,
|
||||||
loss_TX=12,
|
loss_TX=12,
|
||||||
loss_RX=12,
|
loss_RX=12,
|
||||||
conversion_factor=1622137.746 # This is for the LimeSDR based spectrometer
|
conversion_factor=2884 # This is for the LimeSDR based spectrometer
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_simulation(self):
|
def test_simulation(self):
|
||||||
|
|
Loading…
Reference in a new issue