基于 k-Wave 的 Python 实现进行超声波声波场模拟

有研究 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,)
2 个赞

这是啥?:racehorse:一下明天摸鱼看看

1 个赞

感谢感谢~!

From #dev:ml to 开发调优

1 个赞

我跑了下example是没问题的。你这里是不是sensor的radius设置的太小了 :thinking:,不清楚你这些参数是不是有具体含义

感谢感谢!我也测试了,是因为参数设置有问题导致只有一个收集信号的点,于是只能输出一维的数据。
请问,您研究过 k-Wave 吗?是否了解参数的设置范围?

:tieba_004:以前没了解过,就昨天简单看了下。。仿真看起来不是很复杂 :thinking:你这是打算做什么研究呢

打算将血管图片经过语义分割后得到的二值化矩阵作为初始声压,模拟一段时间后的声压变化。

将原始的血管图片和声压数据作为深度学习模型的输入,训练模型,使之可以根据新的声压变化数据,超分辨率图像

1 个赞