ogl_beamforming

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

beamformer.meta (10853B)


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