Home

Awesome

GitHub repo size GitHub language count GitHub top language GitHub last commit

Patreon Kofi

Slack made-with-Markdown

What is this project? [](@description Pitch/Intro of the project)

This project has a specific target of providing a low-cost, open source technological kit to allow scientists, academics, hackers, makers or OSHW fans to hack their way to ultrasound imaging - below 500$ - at home, with no specific equipment required. For complementary sources of information, you can visit:

DOI

Principles of ultrasound imaging

General principles of ultrasound imaging

Using echoes to map interfaces

Medical ultrasound is based on the use of high frequency sound to aid in the diagnosis and treatment of patients. Ultrasound frequencies range from 2 MHz to approximately 15 MHz, although even higher frequencies may be used in some situations.

The ultrasound beam originates from mechanical oscillations of numerous crystals in a transducer, which are excited by electrical pulses (piezoelectric effect). The transducer converts one type of energy into another (electrical <--> mechanical/sound).

The ultrasound waves (pulses of sound) are sent from the transducer, propagate through different tissues, and then return to the transducer as reflected echoes when crossing an interface. The returned echoes are converted back into electrical impulses by the transducer crystals and are further processed - mostly to extract the enveloppe of the signal, a process that transforms the electrical signal in an image - in order to form the ultrasound image presented on the screen.

Ultrasound waves are reflected at the surfaces between the tissues of different density, the reflection being proportional to the difference in impedance. If the difference in density is increased, the proportion of reflected sound is increased and the proportion of transmitted sound is proportionately decreased.

If the difference in tissue density is very different, then sound is completely reflected, resulting in total acoustic shadowing. Acoustic shadowing is present behind bones, calculi (stones in kidneys, gallbladder, etc.) and air (intestinal gas). Echoes are not produced on the other hand if there is no difference in a tissue or between tissues. Homogenous fluids like blood, bile, urine, contents of simple cysts, ascites and pleural effusion are seen as echo-free structures.

Creating a 2D image

If the process is repeated with the probe sweeping the area to image, one can build a 2D image. In practice, in the setups we'll be discussing, this sweep is done with a transducer coupled to a servo, or using a probe that has an built-in motor to create the sweep.

Necessary architecture

Transducer

A critical component of this system is the ultrasound transducer. A typical ultrasound imaging system uses a wide variety of transducers optimized for specific diagnostic applications, but in our case, we'll limit the costs.

High-Voltage Transmitters (see the module)

A digital transmit beamformer typically generates the necessary digital transmit signals with the proper timing and phase to produce a focused transmit signal. High-voltage pulsers quickly switch the transducer element to the appropriate programmable high-voltage supplies to generate the transmit waveform. To generate a simple bipolar transmit waveform, a transmit pulser alternately connects the element to a positive and negative transmit supply voltage controlled by the digital beamformer. More complex realizations allow connections to multiple supplies and ground in order to generate more complex multilevel waveforms with better characteristics.

TGC + LNA = Variable-Gain Amplifier (VGA) (see the module)

The LNA in the receiver must have excellent noise performance and sufficient gain. In a properly designed receiver the LNA will generally determine the noise performance of the full receiver.

The VGA, sometimes called a time gain control (TGC) amplifier, provides the receiver with sufficient dynamic range over the full receive cycle. Ultrasound signals propagate in the body at approximately 1540 meters per second and attenuate at a rate of about 1.4dB/cm-MHz roundtrip. Immediately after an acoustic transmit pulse, the received "echo" signal at the LNA's input can be as large as 0.5VP-P. This signal quickly decays to the thermal noise floor of the transducer element. The dynamic range required to receive this signal is approximately 100dB to 110dB, and is well beyond the range of a realistic ADC. As a result, a VGA is used to map this signal into the ADC. A VGA with approximately 30dB to 40dB of gain is necessary to map the received signal into a typical 12-bit ADC used in this application. The gain is ramped as a function of time (i.e., "time gain control") to accomplish this dynamic range mapping.

Anti-Alias Filter (AAF) and ADC (see the module)

The AAF in the receive chain keeps high-frequency noise and extraneous signals that are beyond the normal maximum imaging frequencies from being aliased back to baseband by the ADC. Many times an adjustable AAF is provided in the design. To avoid aliasing and to preserve the time-domain response of the signal, the filter itself needs to attenuate signals beyond the first Nyquist zone. For this reason Butterworth or higher-order Bessel filters are used.

The ADC used in this application is typically a 12-bit device running from 40Msps to 60Msps. This converter provides the necessary instantaneous dynamic range at acceptable cost and power levels. In a properly designed receiver, this ADC should limit the instantaneous SNR of the receiver. As previously mentioned, however, limitations in the poor-performing VGAs many times limit receiver SNR performance

Ultrasound hardware structure

[](@description Short description of the organization of modules)

To produce an image, the modules have to create a high voltage pulse, which excites a transducer. Echoes coming from the body are amplified using a TGC + LNA, which cleans the analog signal, which itself gets digitalized.

The diagram is represented below:

Un0rick, the ice40 board

Why a FPGA board ?

Non destructive testing and imaging ultrasound modalities have been around since the '50s in . More and more ultrasound-based initiative are emerging, mostly focusing on image processing - while hardware has been left behind. Several teams have produced succesful designs for the different possible uses, mostly efforts from research laboratories. Most have been used on commercial US scanners, traditionaly used as experiment platforms, but they are not cheap, and yield very little in terms of data access and control. Others have been developped in labs, but, sadly, very few have been open-sourced. Let's tackle this!

It has also been shown that simple (be it low-power, low-cost and small) can be achieved - and this, even for relatively complex systems, based on 16 to 64 parallel channels front-end processing and software back-end processing (embedded PC or DSP). This makes it a bit more complex for the layman, hobbyist, or non-specialist researcher to use, not to mention the very little information that is accessible.

Hardware specifications and features

  1. FPGA: Lattice iCE40HX4K - TQFP 144 Package
  2. Memory:
  1. Ultrasound processing:
  1. Parameters: Settings programable via USB or Raspberry Pi
  1. Extensibility:
  1. User Interfaces:
  1. Input Voltage:
  1. Fully Open Source:
  1. Operating Voltage:
  1. Dimensions: @todo!
  2. Weight: @todo!

Comparative

ToolMurgenechOmodsunoric
Open SourceYesYesYes
ADC20Msps1Msps to 24Msps65Msps up to 100Msps
Onboard memory300 Mb10 Mb20Mb
Price of a set400$450$400$
ModularNpYesNo

Modules

What are the arduino-like ultrasound module ?

Creating modules to facilitate ultrasound hacking : the principles of the echOmods is to enable a full chain of ultrasound image processing and hardware control.

We have chosen to use a module approach to make sure that each key component inside ultrasound image processing can easily be replaced and compared with another module, while providing logical logic blocks and corresponding interfaces for these modules to communicate. There's a module for high-voltage pulsing, one for the transducer, one for the analog processing, one for data acquisiton, ... and many more!

What images does it give ?

What does it look like?

The modules sit on a breadboard, and communicate through the tracks laying below. The configuration represented below show the Basic dev kit.

and used in a wider context:

A recap of the modules

ThumbnailImageNameInOut
<img src='https://raw.githubusercontent.com/kelu124/echomods/master/goblin/viewme.png' align='center' width='150'>goblin: The aim of this echOmod is to get the signal coming back from a transducer, and to deliver the signal, analogically processed, with all steps accessible to hackers.<ul><li>ITF-1_GND</li></ul><li>ITF-2_VDD_5V</li></ul><li>ITF-7_GAIN</li></ul><li>ITF-4_RawSig</li></ul><li>ITF-3_ENV</li></ul><li>ITF-18_Raw</li></ul><li>ITF-mET_SMA</li></ul><ul><li>ITF-4_RawSig</li></ul><li>ITF-3_ENV_signal_envelope</li></ul><li>ITF-mEG_SPI</li></ul>
<img src='https://raw.githubusercontent.com/kelu124/echomods/master/wirephantom/viewme.png' align='center' width='150'>wirephantom: Just a phantom for calibrated signals<ul><li>na</li></ul><ul><li>na</li></ul>
<img src='https://raw.githubusercontent.com/kelu124/echomods/master/lite.tbo/viewme.png' align='center' width='150'>lite.tbo: The aim of this echOmod is to get the HV Pulse done.<ul><li>ITF-1_GND</li></ul><li>ITF-2_VDD_5V</li></ul><li>ITF-9_Pon</li></ul><li>ITF-10_Poff</li></ul><li>ITF-19_3.3V</li></ul><li>ITF-mET_Transducer</li></ul><ul><li>ITF-18_Raw</li></ul><li>ITF-mET_SMA</li></ul><li>ITF-mET_Transducer</li></ul>
<img src='https://raw.githubusercontent.com/kelu124/echomods/master/silent/viewme.png' align='center' width='150'>silent: The aim of this echOmod is to simulate a raw signal that would come from the piezo and analog chain.<ul><li>ITF-1_GND</li></ul><li>ITF-2_VDD_5V</li></ul><li>ITF-17_POff3</li></ul><ul><li>ITF-18_Raw</li></ul>
<img src='https://raw.githubusercontent.com/kelu124/echomods/master/doj/viewme.png' align='center' width='150'>doj: Getting a motherboard: that's fitting all the modules in an easy way, with an easy access to all tracks. See this for the Kicad files.
<img src='https://raw.githubusercontent.com/kelu124/echomods/master/retroATL3/viewme.png' align='center' width='150'>retroATL3: The aim of this echOmod is to get the mechanical movement of the piezos. Salvaged from a former ATL3.<ul><li>ITF-A_gnd</li></ul><li>ITF-F_12V</li></ul><li>ITF-N_cc_motor_pwm</li></ul><li>ITF-mET_Transducer</li></ul><li>Motor</li></ul><li>Tri-Piezo Head</li></ul><ul><li>Motor</li></ul><li>ITF-mET_Transducer</li></ul><li>Tri-Piezo Head</li></ul>
<img src='https://raw.githubusercontent.com/kelu124/echomods/master/pic0/viewme.png' align='center' width='150'>pic0: Using a rp2040 to do a full blown pulse echo device.
<img src='https://raw.githubusercontent.com/kelu124/echomods/master/matty/viewme.png' align='center' width='150'>matty: The aim is to summarize all modules in a all-inclusive board. Fast ADC, good load of memory, good SNR.. the not-so-DIY module, as it comes already assembled with nothing to do =)
<img src='https://raw.githubusercontent.com/kelu124/echomods/master/lit3rick/viewme.png' align='center' width='150'>lit3rick: The aim is to summarize all modules in a all-inclusive board. Fast ADC, good load of memory, good SNR.. the not-so-DIY module, as it comes already assembled with nothing to do. Based on up5k.
<img src='https://raw.githubusercontent.com/kelu124/echomods/master/elmo/viewme.png' align='center' width='150'>elmo: The aim of this module is to achieve 20Msps, at 9bits or more.<ul><li>ITF-1_GND</li></ul><li>ITF-2_VDD_5V</li></ul><li>ITF-19_3.3V</li></ul><li>ITF-12_RPIn</li></ul><ul><li>Signal Digitalized</li></ul>

List of experiments

Experiments

List of probes

That's the list of probes I've been playing with:

Todos

Shopping list

Here's a couple of things we're working on, for which you could help as well.

Un0rick

Rest

Todos from Modules

Todos from worklog

License

echOmods

The echOmods project and its prototypes are open hardware, and working with open-hardware components.

Licensed under TAPR Open Hardware License (www.tapr.org/OHL)

Copyright Kelu124 (kelu124@gmail.com) 2015-2018

Based on

The following work is base on a previous TAPR project, Murgen - and respects its TAPR license.

Copyright Kelu124 (kelu124@gmail.com) 2015-2018

Disclaimer

This project is distributed WITHOUT ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING OF MERCHANTABILITY, SATISFACTORY QUALITY AND FITNESS FOR A PARTICULAR PURPOSE.

Annexes

Retired modules

A recap of our retired modules

ThumbnailImageNameInOut
<img src='https://raw.githubusercontent.com/kelu124/echomods/master/retired/cletus/viewme.png' align='center' width='150'>cletus:<ul><li></li></ul><ul><li></li></ul>
<img src='https://raw.githubusercontent.com/kelu124/echomods/master/retired/toadkiller/viewme.png' align='center' width='150'>toadkiller:<ul><li></li></ul><ul><li></li></ul>
<img src='https://raw.githubusercontent.com/kelu124/echomods/master/retired/oneeye/viewme.png' align='center' width='150'>oneeye:<ul><li></li></ul><ul><li></li></ul>
<img src='https://raw.githubusercontent.com/kelu124/echomods/master/retired/tobo/viewme.png' align='center' width='150'>tobo:<ul><li></li></ul><ul><li></li></ul>
<img src='https://raw.githubusercontent.com/kelu124/echomods/master/retired/mogaba/viewme.png' align='center' width='150'>mogaba:<ul><li></li></ul><ul><li></li></ul>
<img src='https://raw.githubusercontent.com/kelu124/echomods/master/retired/croaker/viewme.png' align='center' width='150'>croaker:<ul><li></li></ul><ul><li></li></ul>
<img src='https://raw.githubusercontent.com/kelu124/echomods/master/retired/sleepy/viewme.png' align='center' width='150'>sleepy:<ul><li></li></ul><ul><li></li></ul>
<img src='https://raw.githubusercontent.com/kelu124/echomods/master/retired/tomtom/viewme.png' align='center' width='150'>tomtom:<ul><li></li></ul><ul><li></li></ul>
<img src='https://raw.githubusercontent.com/kelu124/echomods/master/retired/loftus/viewme.png' align='center' width='150'>loftus:<ul><li></li></ul><ul><li></li></ul>
<img src='https://raw.githubusercontent.com/kelu124/echomods/master/retired/alt.tbo/viewme.png' align='center' width='150'>alt.tbo:<ul><li></li></ul><ul><li></li></ul>
<img src='https://raw.githubusercontent.com/kelu124/echomods/master/retired/retro10PV/viewme.png' align='center' width='150'>retro10PV:<ul><li></li></ul><ul><li></li></ul>

Progress on modules

Progress on building the modules

Module-wise

Note that the 'BONUS!' represents something that could be done, and does not count as a strict TODO.

Name of moduleToDoDoneProgress

[](@autogenerated - invisible comment)