有研究 k-Wave 的大佬嘛?呜呜呜,救救孩子吧~
我这只能得到第 0 个传感器单体的信号吗?输出的数据好奇怪
from pathlib import Path
import numpy as np
from kwave.data import Vector
from kwave.kgrid import kWaveGrid
from kwave.kmedium import kWaveMedium
from kwave.ksensor import kSensor
from kwave.ksource import kSource
from kwave.kspaceFirstOrder2D import kspaceFirstOrder2DC
from kwave.options.simulation_execution_options import SimulationExecutionOptions
from kwave.options.simulation_options import SimulationOptions
from kwave.utils.mapgen import make_cart_circle
# 分割了血管的标记矩阵。每个像素用 1 表示该像素属于血管,0 表示该像素不属于血管
vessel_matrix: np.ndarray = ...
kgrid = kWaveGrid(
N=Vector(list(vessel_matrix.shape)), # 网格的点数
spacing=Vector([1e-4, 1e-4]) # 网格的实际物理尺寸
)
medium = kWaveMedium(sound_speed=1540, # 水或人体组织介质的声速
density=1000,
alpha_coeff=0.75, # 吸收系数
alpha_power=1.5, # 吸收系数的功率指数
BonA=6) # 介质中的非线性吸收的参数
kgrid.makeTime(c=medium.sound_speed,
t_end=(kgrid.spacing * kgrid.N * 2.2 / medium.sound_speed).max()) # 2.2 倍空间长度,保证足够的反射路径
sensor = kSensor(mask=make_cart_circle(radius=1e-5, num_points=20))
source = kSource()
source.p0 = 1e6 * vessel_matrix
# TODO:似乎还要遍历传感器上的每个单元才行?
def simulate(**opts):
simul_opts = SimulationOptions(save_to_disk=True, **opts)
exec_opts = SimulationExecutionOptions(is_gpu_simulation=False)
return kspaceFirstOrder2DC(kgrid=kgrid, source=source, sensor=sensor, medium=medium,
simulation_options=simul_opts,
execution_options=exec_opts)
result = simulate(pml_inside=False, data_cast='single')
print(result.keys())
# 保存
file = Path('data/sensor_data.npy')
if not file.is_file():
np.save(file, result)
print(result['p'].shape)
读取生成的数据:
import numpy as np
data: dict = np.load('data/sensor_data.npy', allow_pickle=True).item()
p: np.ndarray = data['p']
Nt = data['Nt'].item()
print(f'{Nt = }')
print(f'{p.shape = }')
输出的结果:
Nt = 4283
p.shape = (4283,)