ogl_beamforming

Ultrasound Beamforming Implemented with OpenGL
git clone anongit@rnpnr.xyz:ogl_beamforming.git
Log | Files | Refs | Feed | Submodules | README | LICENSE

beamformer.meta (10643B)


      1 @Enumeration(DecodeMode [None Hadamard])
      2 @Enumeration(RCAOrientation [None Rows Columns])
      3 @Enumeration(SamplingMode [2X 4X])
      4 
      5 @Table([name size elements]) DataKind
      6 {
      7 	[Int16          2 1]
      8 	[Int16Complex   2 2]
      9 	[Float32        4 1]
     10 	[Float32Complex 4 2]
     11 }
     12 
     13 @Enumeration(EmissionKind [Sine SineAM Chirp])
     14 
     15 @Table([type name]) SineParameters
     16 {
     17 	[F32 cycles   ]
     18 	[F32 frequency]
     19 }
     20 
     21 @Table([type name]) SineAMParameters
     22 {
     23 	[F32 cycles   ]
     24 	[F32 frequency]
     25 	[U32 emissions]
     26 }
     27 
     28 @Table([type name]) ChirpParameters
     29 {
     30 	[F32 duration     ]
     31 	[F32 min_frequency]
     32 	[F32 max_frequency]
     33 }
     34 
     35 @MUnion(EmissionKind [
     36 	SineParameters
     37 	SineAMParameters
     38 	ChirpParameters
     39 ]) Emission
     40 
     41 @Table([name name_lower]) FilterKind
     42 {
     43 	[Kaiser       kaiser]
     44 	[MatchedChirp matched_chirp]
     45 }
     46 
     47 @Table([type name]) KaiserFilterParameters
     48 {
     49 	[F32 cutoff_frequency]
     50 	[F32 beta]
     51 	[U32 length]
     52 }
     53 
     54 @Table([type name]) ChirpFilterParameters
     55 {
     56 	[F32 duration]
     57 	[F32 min_frequency]
     58 	[F32 max_frequency]
     59 }
     60 
     61 @MUnion(FilterKind [
     62 	KaiserFilterParameters
     63 	ChirpFilterParameters
     64 ]) Filter
     65 
     66 @Table([name pretty_name fixed_transmits]) AcquisitionKind
     67 {
     68 	[FORCES         FORCES         1]
     69 	[UFORCES        UFORCES        0]
     70 	[HERCULES       HERCULES       1]
     71 	[RCA_VLS        VLS            0]
     72 	[RCA_TPW        TPW            0]
     73 	[UHERCULES      UHERCULES      0]
     74 	[RACES          RACES          1]
     75 	[EPIC_FORCES    EPIC-FORCES    1]
     76 	[EPIC_UFORCES   EPIC-UFORCES   0]
     77 	[EPIC_UHERCULES EPIC-UHERCULES 0]
     78 	[Flash          Flash          0]
     79 	[HERO_PA        HERO-PA        0]
     80 }
     81 
     82 @Table([name]) InterpolationMode
     83 {
     84 	[Nearest]
     85 	[Linear]
     86 	[Cubic]
     87 }
     88 
     89 @Table([name type]) ParametersHead
     90 {
     91 	[xdc_transform                 M4]
     92 	[xdc_element_pitch             V2]
     93 	[raw_data_dimensions          UV2]
     94 	[focal_vector                  V2]
     95 	[transmit_receive_orientation U32]
     96 	[sample_count                 U32]
     97 	[channel_count                U32]
     98 	[acquisition_count            U32]
     99 	[das_shader_id                U32]
    100 	[time_offset                  F32]
    101 	[single_focus                  U8]
    102 	[single_orientation            U8]
    103 	[decode_mode                   U8]
    104 	[sampling_mode                 U8]
    105 }
    106 
    107 @Table([name type]) ParametersUI
    108 {
    109 	[output_min_coordinate   V3]
    110 	[output_max_coordinate   V3]
    111 	[output_points          SV4]
    112 	[sampling_frequency     F32]
    113 	[demodulation_frequency F32]
    114 	[speed_of_sound         F32]
    115 	[f_number               F32]
    116 	[off_axis_pos           F32]
    117 	[interpolation_mode     U32]
    118 	[coherency_weighting    U32]
    119 	[beamform_plane         U32]
    120 	[decimation_rate        U32]
    121 }
    122 
    123 @Table([name c_type m_type m_size]) ParametersExtra
    124 {
    125 	[emission_kind       BeamformerEmissionKind       uint32  1]
    126 	[emission_parameters BeamformerEmissionParameters uint8  12]
    127 }
    128 
    129 // TODO(rnp): definable constants in meta code (or at least references to enum values)
    130 @Table([name type elements]) ParametersSimple
    131 {
    132 	[channel_mapping               S16  256]
    133 	[sparse_elements               S16  256]
    134 	[transmit_receive_orientations  U8  256]
    135 	[steering_angles               F32  256]
    136 	[focal_depths                  F32  256]
    137 	[compute_stages                S32   16]
    138 	[compute_stage_parameters      S32   16]
    139 	[compute_stages_count          U32    1]
    140 	[data_kind                     S32    1]
    141 }
    142 
    143 @Expand(AcquisitionKind)   @Enumeration(AcquisitionKind   `$(name)`)
    144 @Expand(DataKind)          @Enumeration(DataKind          `$(name)`)
    145 @Expand(FilterKind)        @Enumeration(FilterKind        `$(name)`)
    146 @Expand(InterpolationMode) @Enumeration(InterpolationMode `$(name)`)
    147 
    148 @Emit
    149 {
    150 	`typedef union {`
    151 	`	struct {`
    152 		@Expand(SineParameters)   `		$(%type)$(|)$(name);`
    153 	`	} sine;`
    154 	`	struct {`
    155 		@Expand(SineAMParameters) `		$(%type)$(|)$(name);`
    156 	`	} sine_am;`
    157 	`	struct {`
    158 		@Expand(ChirpParameters)  `		$(%type)$(|)$(name);`
    159 	`	} chirp;`
    160 	`} BeamformerEmissionParameters;`
    161 	``
    162 	`typedef struct {`
    163 	@Expand(ParametersHead)  `	$(%type)$(|)$(name);`
    164 	@Expand(ParametersUI)    `	$(%type)$(|)$(name);`
    165 	@Expand(ParametersExtra) `	$(c_type)$(|)$(name);`
    166 	`} BeamformerParameters;`
    167 	``
    168 	`typedef struct {`
    169 	@Expand(ParametersHead) `	$(%type)$(|)$(name);`
    170 	`} BeamformerParametersHead;`
    171 	``
    172 	`typedef struct {`
    173 	@Expand(ParametersUI) `	$(%type)$(|)$(name);`
    174 	`} BeamformerUIParameters;`
    175 	``
    176 	`typedef struct {`
    177 	@Expand(ParametersHead)   `	$(%type)$(|)$(name);`
    178 	@Expand(ParametersUI)     `	$(%type)$(|)$(name);`
    179 	@Expand(ParametersExtra)  `	$(c_type)$(|)$(name);`
    180 	@Expand(ParametersSimple) `	$(%type)$(|)$(name)$(elements > 1 -> "[" elements "]");`
    181 	`} BeamformerSimpleParameters;`
    182 	``
    183 	`typedef struct {`
    184 	`	BeamformerFilterKind kind;`
    185 	`	union {`
    186 	`		struct {`
    187 			@Expand(KaiserFilterParameters) `			$(%type)$(|)$(name);`
    188 	`		} kaiser;`
    189 	`		struct {`
    190 			@Expand(ChirpFilterParameters)  `			$(%type)$(|)$(name);`
    191 	`		} matched_chirp;`
    192 	`	};`
    193 	`	f32 sampling_frequency;`
    194 	`	b16 complex;`
    195 	`} BeamformerFilterParameters;`
    196 	``
    197 	`read_only global u8 beamformer_data_kind_element_size[] = {`
    198 	@Expand(DataKind) `	$(size),`
    199 	`};`
    200 	``
    201 	`read_only global u8 beamformer_data_kind_element_count[] = {`
    202 	@Expand(DataKind) `	$(elements),`
    203 	`};`
    204 	``
    205 	`read_only global u8 beamformer_data_kind_byte_size[] = {`
    206 	@Expand(DataKind) `	$(size) * $(elements),`
    207 	`};`
    208 	``
    209 	`read_only global u8 beamformer_acquisition_kind_has_fixed_transmits[] = {`
    210 	@Expand(AcquisitionKind) `	$(fixed_transmits),`
    211 	`};`
    212 	``
    213 	`read_only global s8 beamformer_acquisition_kind_strings[] = {`
    214 	@Expand(AcquisitionKind) `	s8_comp("$(pretty_name)"),`
    215 	`};`
    216 	``
    217 	`read_only global s8 beamformer_filter_kind_strings[] = {`
    218 	@Expand(FilterKind) `	s8_comp("$(name)"),`
    219 	`};`
    220 	``
    221 	`read_only global s8 beamformer_interpolation_mode_strings[] = {`
    222 	@Expand(InterpolationMode) `	s8_comp("$(name)"),`
    223 	`};`
    224 }
    225 
    226 @ShaderGroup Compute
    227 {
    228 	@Shader CudaDecode
    229 	@Shader CudaHilbert
    230 
    231 	@Shader(decode.glsl) Decode
    232 	{
    233 		@Enumeration(DataKind)
    234 		@Enumeration(DecodeMode)
    235 		@Flags([DilateOutput UseSharedMemory])
    236 
    237 		@Bake
    238 		{
    239 			@BakeInt(DecodeMode           decode_mode           )
    240 			@BakeInt(InputChannelStride   input_channel_stride  )
    241 			@BakeInt(InputSampleStride    input_sample_stride   )
    242 			@BakeInt(InputTransmitStride  input_transmit_stride )
    243 			@BakeInt(OutputChannelStride  output_channel_stride )
    244 			@BakeInt(OutputSampleStride   output_sample_stride  )
    245 			@BakeInt(OutputTransmitStride output_transmit_stride)
    246 			@BakeInt(ToProcess            to_process            )
    247 			@BakeInt(TransmitCount        transmit_count        )
    248 		}
    249 	}
    250 
    251 	@Shader(filter.glsl) Filter
    252 	{
    253 		@Enumeration(DataKind)
    254 		@Flags([ComplexFilter OutputFloats])
    255 
    256 		@Bake
    257 		{
    258 			@BakeInt(DecimationRate       decimation_rate       )
    259 			@BakeInt(FilterLength         filter_length         )
    260 			@BakeInt(InputChannelStride   input_channel_stride  )
    261 			@BakeInt(InputSampleStride    input_sample_stride   )
    262 			@BakeInt(InputTransmitStride  input_transmit_stride )
    263 			@BakeInt(OutputChannelStride  output_channel_stride )
    264 			@BakeInt(OutputSampleStride   output_sample_stride  )
    265 			@BakeInt(OutputTransmitStride output_transmit_stride)
    266 			@BakeInt(SampleCount          sample_count          )
    267 			@BakeFloat(DemodulationFrequency demodulation_frequency)
    268 			@BakeFloat(SamplingFrequency     sampling_frequency    )
    269 		}
    270 
    271 		@SubShader Demodulate
    272 	}
    273 
    274 	@Shader(das.glsl) DAS
    275 	{
    276 		@Enumeration(AcquisitionKind)
    277 		@Enumeration(DataKind)
    278 		@Enumeration(InterpolationMode)
    279 		@Enumeration(RCAOrientation)
    280 		@Flags([Fast Sparse CoherencyWeighting SingleFocus SingleOrientation])
    281 
    282 		@Bake
    283 		{
    284 			@BakeInt(AcquisitionCount           acquisition_count           )
    285 			@BakeInt(AcquisitionKind            acquisition_kind            )
    286 			@BakeInt(ChannelCount               channel_count               )
    287 			@BakeInt(InterpolationMode          interpolation_mode          )
    288 			@BakeInt(SampleCount                sample_count                )
    289 			@BakeInt(TransmitReceiveOrientation transmit_receive_orientation)
    290 
    291 			@BakeFloat(DemodulationFrequency demodulation_frequency)
    292 			@BakeFloat(FNumber               f_number              )
    293 			@BakeFloat(FocusDepth            focus_depth           )
    294 			@BakeFloat(SamplingFrequency     sampling_frequency    )
    295 			@BakeFloat(SpeedOfSound          speed_of_sound        )
    296 			@BakeFloat(TimeOffset            time_offset           )
    297 			@BakeFloat(TransmitAngle         transmit_angle        )
    298 		}
    299 	}
    300 
    301 	@Shader(min_max.glsl) MinMax
    302 	@Shader(sum.glsl) Sum
    303 }
    304 
    305 @ShaderGroup Render
    306 {
    307 	@Shader(render_3d.frag.glsl) Render3D
    308 }
    309 
    310 /////////////////
    311 // NOTE: Library
    312 
    313 @Emit(CLibrary)
    314 {
    315 	`typedef union {`
    316 	`	struct {`
    317 		@Expand(SineParameters)   `		$(%type)$(|)$(name);`
    318 	`	} sine;`
    319 	`	struct {`
    320 		@Expand(SineAMParameters) `		$(%type)$(|)$(name);`
    321 	`	} sine_am;`
    322 	`	struct {`
    323 		@Expand(ChirpParameters)  `		$(%type)$(|)$(name);`
    324 	`	} chirp;`
    325 	`} BeamformerEmissionParameters;`
    326 	``
    327 	`typedef struct {`
    328 	@Expand(ParametersHead)   `	$(%type)$(|)$(name)$(#type > 1 -> "[" #type "]");`
    329 	@Expand(ParametersUI)     `	$(%type)$(|)$(name)$(#type > 1 -> "[" #type "]");`
    330 	@Expand(ParametersExtra)  `	$(c_type)$(|)$(name);`
    331 	@Expand(ParametersSimple) `	$(%type)$(|)$(name)$(elements > 1 -> "[" elements "]");`
    332 	`} BeamformerSimpleParameters;`
    333 	``
    334 	`typedef struct {`
    335 	@Expand(ParametersUI)     `	$(%type)$(|)$(name)$(#type > 1 -> "[" #type "]");`
    336 	`} BeamformerUIParameters;`
    337 	``
    338 	`typedef struct {`
    339 	@Expand(ParametersHead)   `	$(%type)$(|)$(name)$(#type > 1 -> "[" #type "]");`
    340 	`} BeamformerParametersHead;`
    341 	``
    342 	`typedef struct {`
    343 	@Expand(ParametersHead)   `	$(%type)$(|)$(name)$(#type > 1 -> "[" #type "]");`
    344 	@Expand(ParametersUI)     `	$(%type)$(|)$(name)$(#type > 1 -> "[" #type "]");`
    345 	@Expand(ParametersExtra)  `	$(c_type)$(|)$(name);`
    346 	`} BeamformerParameters;`
    347 	``
    348 }
    349 
    350 ////////////////
    351 // NOTE: MATLAB
    352 
    353 @Emit(MATLAB) Parameters
    354 {
    355 	`classdef OGLBeamformerParameters`
    356 	`	properties`
    357 	@Expand(ParametersHead)  `		$(name)(1,$(#type))$(|)$(%type)`
    358 	`		% UI Parameters`
    359 	@Expand(ParametersUI)    `		$(name)(1,$(#type))$(|)$(%type)`
    360 	@Expand(ParametersExtra) `		$(name)(1,$(m_size))$(|)$(m_type)`
    361 	`	end`
    362 	`end`
    363 }
    364 
    365 @Emit(MATLAB) ParametersHead
    366 {
    367 	`classdef OGLBeamformerParametersHead`
    368 	`	properties`
    369 	@Expand(ParametersHead) `		$(name)(1,$(#type))$(|)$(%type)`
    370 	`	end`
    371 	`end`
    372 }
    373 
    374 @Emit(MATLAB) ParametersUI
    375 {
    376 	`classdef OGLBeamformerParametersUI`
    377 	`	properties`
    378 	@Expand(ParametersUI) `		$(name)(1,$(#type))$(|)$(%type)`
    379 	`	end`
    380 	`end`
    381 }
    382 
    383 @Emit(MATLAB) SimpleParameters
    384 {
    385 	`classdef OGLBeamformerSimpleParameters`
    386 	`	properties`
    387 	@Expand(ParametersHead)   `		$(name)(1,$(#type)) $(%type)`
    388 	@Expand(ParametersUI)     `		$(name)(1,$(#type)) $(%type)`
    389 	@Expand(ParametersExtra)  `		$(name)(1,$(m_size))$(|)$(m_type)`
    390 	@Expand(ParametersSimple) `		$(name)(1,$(elements)) $(%type)`
    391 	`	end`
    392 	`end`
    393 }