DIVERGING-WAVE ECHOCARDIOGRAPHY - simulations, beamforming, compounding

In this tutorial, it is shown how to simulate a realistic ultrasound image of the left ventricle (a three-chamber view) from the transmit of diverging waves.

The left ventricle will be insonified with seventeen diverging waves 60 degrees wide.

  1. RF signals will be simulated with the function SIMUS.
  2. The RF signals will be I/Q demodulated with RF2IQ,
  3. then beamformed with DAS.
  4. A compound echocardiographic image of the left ventricle will eventually be generated.

Contents

Select a transducer with GETPARAM

We want a 2.7-MHz 64-element cardiac phased array.

param = getparam('P4-2v');

The structure param contains the tranducer properties.

Adjust the transmit delays with TXDELAY

The left ventricle will be insonified with seventeen diverging waves 60 degrees wide and directed at -20 to +20 degrees.

tilt = linspace(-20,20,17)/180*pi; % tilt angles in rad
txdel = cell(17,1); % this cell will contain the transmit delays

Use TXDELAY to calculte the transmit delays for the 17 diverging waves.

for k = 1:17
    txdel{k} = txdelay(param,tilt(k),pi/3);
end

These are the transmit delays to obtain a 60 degrees wide circular waves steered at -20 degrees

bar(txdel{1}*1e6)
xlabel('Element number')
ylabel('Delays (\mus)')
title('TX delays for a 60{\circ}-wide -20{\circ}-tilted wave')
axis tight square

Simulate an acoustic pressure field with PFIELD

Check what the sound pressure fields look like.

Define a 200 $\times$ 200 grid:

xi = linspace(-4e-2,4e-2,200); % in m
zi = linspace(0,10e-2,200); % in m
[xi,zi] = meshgrid(xi,zi);

Simulate an RMS pressure field...

option.WaitBar = false;
P = pfield(xi,zi,txdel{1},param,option);

...and display the result:

imagesc(xi(1,:)*1e2,zi(:,1)*1e2,20*log10(P/max(P(:))))
xlabel('x (cm)')
ylabel('z (cm)')
title('RMS pressure field for a 60{\circ}-wide -20{\circ}-tilted wave')
axis equal tight
caxis([-20 0]) % dynamic range = [-20,0] dB
c = colorbar;
c.YTickLabel{end} = '0 dB';
colormap(hot)

Simulate RF signals with SIMUS

We will now simulate seventeen series of RF signals. Each series will contain 64 RF signals, as the simulated phased array contains 64 elements. We first load the scatterers of the left ventricle stored in LVscat.mat.

x and z contain the scatterers' positions. RC contains the reflection coefficients.

load('LVscat.mat')

Take a look at the scatterers. The backscatter coefficients are gamma-compressed for easy visualization.

scatter(x*1e2,z*1e2,2,abs(RC).^.15,'filled')
colormap hsv
axis equal ij
set(gca,'XColor','none','box','off')
title('Scatterers for a left ventricular 3-chamber view')
ylabel('[cm]')

Simulate the seventeen series of RF signals with SIMUS. The RF signals will be sampled at 4 $\times$ center frequency.

RF = cell(17,1); % this cell will contain the RF series
param.fs = 4*param.fc; % sampling frequency in Hz

option.WaitBar = false; % remove the wait bar of SIMUS
h = waitbar(0,'');
for k = 1:17
    waitbar(k/17,h,['SIMUS: RF series #' int2str(k) ' of 17'])
    RF{k} = simus(x,z,RC,txdel{k},param,option);
end
close(h)

This is the 32th RF signal of the 1st series:

rf = RF{1}(:,32);
t = (0:numel(rf)-1)/param.fs*1e6; % time (ms)
plot(t,rf)
set(gca,'YColor','none','box','off')
xlabel('time (\mus)')
title('RF signal of the 32^{th} element (1^{st} series, tilt = -20{\circ})')
axis tight

Demodulate the RF signals with RF2IQ

Before beamforming, the RF signals must be I/Q demodulated.

IQ = cell(17,1);  % this cell will contain the I/Q series

for k = 1:17
    IQ{k} = rf2iq(RF{k},param.fs,param.fc);
end

This is the 32th I/Q signal of the 1st series:

iq = IQ{1}(:,32);
plot(t,real(iq),t,imag(iq))
set(gca,'YColor','none','box','off')
xlabel('time (\mus)')
title('I/Q signal of the 32^{th} element (1^{st} series, tilt = -20{\circ})')
legend({'in-phase','quadrature'})
axis tight

Beamform the I/Q signals with DAS

To generate images of the left ventricle, beamform the I/Q signals onto a 256 $\times$ 128 polar grid.

Generate the image (polar) grid using IMPOLGRID.

[xi,zi] = impolgrid([256 128],11e-2,pi/3,param);

Beamform the I/Q signals using a delay-and-sum with the function DAS.

bIQ = zeros(256,128,17);  % this array will contain the 17 I/Q images

h = waitbar(0,'');
for k = 1:17
    waitbar(k/17,h,['DAS: I/Q series #' int2str(k) ' of 17'])
    bIQ(:,:,k) = das(IQ{k},xi,zi,txdel{k},param);
end
close(h)

Time-gain compensate the beamformed I/Q with TGC

Time-gain compensation tends to equalize the amplitudes along fast-time.

bIQ = tgc(bIQ);

Check the ultrasound images

An ultrasound image is obtained by log-compressing the amplitude of the beamformed I/Q signals. Have a look at the images obtained when steering at -20 degrees.

I = bmode(bIQ(:,:,1),50); % log-compressed image
pcolor(xi*1e2,zi*1e2,I)
shading interp, colormap gray
title('DW-based echo image with a tilt angle of -20{\circ}')

axis equal ij
set(gca,'XColor','none','box','off')
c = colorbar;
c.YTick = [0 255];
c.YTickLabel = {'-50 dB','0 dB'};
ylabel('[cm]')

The individual images are of poor quality. The compound image obtained with a series of 17 diverging waves steered at different angles is of high quality:

cIQ = sum(bIQ,3); % this is the compound beamformed I/Q
I = bmode(cIQ,50); % log-compressed image
pcolor(xi*1e2,zi*1e2,I)
shading interp, colormap gray
title('Compound DW-based cardiac echo image')

axis equal ij
set(gca,'XColor','none','box','off')
c = colorbar;
c.YTick = [0 255];
c.YTickLabel = {'-50 dB','0 dB'};
ylabel('[cm]')



See also

simus, rf2iq, das



About the author

Damien Garcia, Eng., Ph.D.
INSERM researcher
Creatis, University of Lyon, France

websites: BioméCardio, MUST



Date modified