-
The Windows 64 bits version of Field II does not seem to work. It report a missing ell.
How do I fix this:
For the Windows 64 bits version you have to have
the Microsoft Visual Studio 2012 run-time libraries for this version to work.
This you can either get by installing the compiler and using mex -setup
or download the Microsoft Visual Studio 2012 run-time libraries from the link:
http://www.microsoft.com/en-us/download/details.aspx?id=30679
How do I control the accuracy of the responses calculated?
As a standard the program uses rectangles. If you want a high
precision you have to have small rectangles compared to the
distance to the Field point.
The size of the rectangles must be chosen so that the field
point lies in the far-field region. This is given by
l >> w^2/(4 lambda)
where l is the distance to the field point, w the largest
dimension of the rectangle and lambda the wavelength.
This should give a good precision for all you calculations, if
you obey this rule. More information can be found in the paper:
J.A. Jensen and N. B. Svendsen:
Calculation of pressure fields from arbitrarily shaped,
apodized, and excited ultrasound transducers,
IEEE Trans. Ultrason., Ferroelec., Freq. Contr., 39,
pp. 262-267, 1992.
that can be found on the Field II web-site.
You can check if you have the sufficient accuracy by decreasing
the element size, and then see if you get the same result.
The sampling frequency also incluences the accuracy. Increasing it will
in general increase the accuracy. Again you can check the result
by increasing the sampling frequency and then compare to the
previous result.
What are the physical relations on the excitation pulse,
the impulse response and the actual pressure generated in
calc_hp and in calc_hhp?
The excitation is the voltage applied on the terminals of
the transducer. The impulse response for the transmitting
aperture is the impulse response from the voltage
on the terminals to the acceleration of
the front face of the transducer multiplied by the density
of the medium. Setting these to the correct value then gives
the pressure in Pa. Scaling the impulse response will, thus,
scale the pressure proportionally. The impulse response
for the receiving aperture is the impulse response from
front face acceleration to voltage on the transducer
terminals. Scaling this, thus, gives a direct scaling of
the output voltage from the transducer.
In calculating the field, do you use the Kramers-Kronig
relationship between the frequency-dependent attenuation and phase
velocity?
The program uses a minimum phase version
of the attenuation as described by Gurumurthy and Arthur in their
1982 paper in Ultrasonic Imaging. The Field programs implementation
and results from its use can be found in the paper:
J. A. Jensen, Darshan Gandhi, and William D. O'Brien:
Ultrasound fields in an attenuating medium,
Proceedings of the IEEE 1993 Ultrasonics Symposium,
pp. 943-946, Vol. 2, 1993.
The function xdc_impulse sets the impulse resonse for a given
aperture. If I understand it right, I can set a vector derived from
measurements or calculated from a transducer model. This may take
into account transducer tuning. Right ??
Yes, you can include any measured or
calculated waveform by using xdc_impulse.
For xdc_linear_array how the parameter focus is used? Does it
result in some fixed phase delay or what is it used for ?
In xdc_linear_array a fixed focus is
found and the delay values are calculated accordingly. These delay
values are then used for all time in the calculations. It is an easy
method for setting the focus for a single focus array, e.g.,
for a transducer used for emission.
In your 1996 paper, "FIELD: a program for simulating
ultrasound systems," which you presented at the 10th
Nordic-Baltic conf., it was stated that the 128-element linear array
simulation took 11 hrs to run on an HP9000 Model 819/K200. I have
access to the same HP model in our lab, and our machine has 4 CPUs
which could be used to get a factor of 4 speed increase by
segmenting (if possible and practical) the process and combining the
results (e.g. CT Backprojection). So my question is whether your
Field simulation used 4 CPUs or just 1, and whether your program
lends itself to segmentation.
The phantom image that I generated was
only made with one CPU and the Matlab version of the program. It is
possible to make a parallel version of the simulation since it
involves the generation of a number of scan lines. You would then
generate the position and amplitude of the individual scatterers and
store that in a file. Then you divide the set of lines into four,
and then each CPU can handle part of the problem. This will give you
close to a four times decrease in simulation time. The program does
only run on one CPU, but most problems as this can be divided into
smaller tasks, and then run in parallel.
I just installed MatLab 5 in start testing Field 2 with your
examples. One problem, which comes up in all programs, is with the
statement
N_pre = x/(width+kerf) + N_elements/2 - N_active/2;
It seems that the rounding is different for Matlab 4 and Matlab
5. If you replace the line above with:
N_pre =
ceil(x/(width+kerf) + N_elements/2 - N_active/2);
the simulation
runs without errors.
It is correct that Matlab 5 is more
strict when non-integers are meet. A ceil or floor function will fix
the problem like: N = floor(Nx + 0.5);
I'm a little bit confused in regard to the use of a 3 element
vector for the focal position for one-dimensional array. In my usual
practice of simulating transducers whose center is the origin of the
coordinate system, I can see how x and z can vary, but for a
one-dimensional array, it would seem that y has to be 0. Would
non-zero values of y be useful only for arrays which are positioned
away from the origin of coordinates, or for two-dimensional arrays?
The focusing in elevation can of
course not be done with a traditional array. The full description of
the focusing point is maintained for use with the 2D arrays, and
since it is cumbersome to sometimes have two coordinates and other
times three coordinates. In general the y-value for a
one-dimensional array should be zero always.
I'm also confused about how the value Rfocus in
xdc_focused_array interacts with the focusing mentioned in the
previous question. In the case where y is zero in the focal position
vector, I can see that RFocus is an independent variable which
corresponds to the focal length of the typical plastic lens found on
imaging transducers. But I'm unsure of how to define it if y were
not zero.
The variable Rfocus in
xdc_focused_array defines the physical layout of the transducer, so
that the elevation focus is at a distance Rfocus from the aperture.
Do you have any estimation about the far-field approximation?
In other words, how do you define the near-field and far-field? and
how much confidence do you have in the near-field?
The far-field is losely defined as
being beyond the distance d^2/(4 lambda), where d is the largest
dimension of the rectangle used in the calculation. The accuracy of
the calculation will increase with increasing distance. In the Field
II program you can also use triangles, which use the exact solution.
The far-field condition is, thus, not needed here.
Am I correct in assuming that the center of the transducer is
always located at (0,0,0) mm?
The center of the array is always
positioned at (0,0,0).
I am now working on simulating an 2D array focusing off-axis,
but I am not too sure how the transducer is oriented relative to the
far field. When I specify my 2d array, I have a matrix which
contains ones and zeros to enable the elements. My question is: in
which direction am I moving (positive or negative x, or positive or
negative y) when i move from (1,1) to (8,1) in my enabled matrix?
The first index is for the x-direction
and the second index is for the y-direction. You start from the most
negative x and y element and move toward positive values.
Is there a field command which allows me to move the
transducer?
Currently there is no command for
moving the transducer. It can be simulated by moving the target
instead, which will give the same effect.
What is the function xdc_focus function, xdc_center_focus ...
The xdc_focus function sets the delay
values for an array, so that the focus is at the indicated point.
The routine xdc_center_focus set the reference point for doing
focusing. At this point the delay is taken to be zero. This is
neccessary for having a dynamic focusing and having an absolute
reference for the whole image generation process. A further
description can be found in the documantation for version 2.60 of
the program.
My objective is to make and ANSYS simulate of the vibrations
of the transducer elements and to calculate the radiated pressure
field with FIELD II. Is this possible?
Taking the output from the ANSYS
program and directly putting it into Field II is not possible. The
ANSYS simulation will probably give some complex vibration pattern
on the front face of the transducer and Field cannot handle elements
that have any other than a piston vibration (they cannot tilt during
vibration). Also it is a problem having different vibration signals
on different parts of the transducer.
Is it possible to simulate an echo from a metallic flat
plate?
The echo from a phase plate can be
simulated by sampling the plate in space. Make the grid finer than a
wavelength (probably 1/10 lambda), and then do the simulation.
I would like to transfer back scattering coefficient (as
given for example in your book at figure 2.6) into particles
concentrations and amplitudes (for the creations of phantoms). Is
there a method of transforming the two kinds of data ?
Currently I do not have a method for
translating a backscattering coefficient to a number of point
scatterers in a given volume. Please tell me if you find some
meaningfull way of doing this conversion.
When starting Field II we're getting the following error on
startup.
??? Error using ==> load
matlab.mat: File not found.
Error in ==> /usr/local/matlab/field_logo.m
On line 12 ==>
eval(['load ', place])
Basically, the only problem is the logo isn't showing up. Field
appears to function properly. Any ideas?
This is because Field cannot find the
file logo_field.mat, which should be placed in the same directory as
the m-files, and the Matlab search path should include this
directory (see the Matlab routine path).
I am using a number of focusing zones in calculating the
pulse-echo response from a number of scatterers. The program seems
to pick an earlier focus zone than I envision. Why is that?
The focus zones are picked according
to the times after which the focus zone is valid. Remember, however,
that this time should be calculated as the one-way distance to the
point, since the focusing is valid for the specific aperture and one
aperture is used in receive and another is used in transmit.
I was wondering how the calc_scat start_time parameter is
generated. I'm trying to generate a set of beams with the same
transmit and receive configuration but with different apodization
(ele_apodization) vectors. Each apodization generates a beam with a
different starting time and I was wondering why this happens.
The starting time is found from the
actual physical distance from the active elements during the
calculation. Elements with an apodization of zero are not included
in the calculation and the starting time can therefore change as a
function of the apodization.
There is some high frequency (numerical?) noise in the
calculated spatial impulse response. My question is if there are any
tricks to decrease this noise?
In practice, I guess that the noise is removed when applying a
bandpass pulse. However, to use the impulse response itself in
illustrations, it would be nice to reduce the noise.
The standard Field II code uses a
far-field rectangular approximation, that introduces this noise. You
can set the field code to use either rectangles, triangles or bounding lines (see
set_field), which uses the exact solutions and thereby eliminates
the noise. They are, however, slower when calculating the spatial
impulse response.
I am calculating the on-axis intensity of the ultrasound and
using different excitation pulses. When I use sinusoidal pulses with
1.5 cycles, I get very different values especially in the near
field. Why?
The problem with the half-cycle pulse
is that they have a component in the spectrum around f=0, which in
general is not realistic for ultrasound systems. This will dominate
the response, especially at low frequencies. In your simulation you
have not specified the impulse response of the transducer. This
should be done to reflect that the transducer cannot transmit a DC
component.
What is the best way to use Field_II for CW case?
The best way to simulate the CW case is to perform a Fourier
transform of the corresponding signal at the given frequency. This
can be performed on the response from calc_h for the emitted
response and on calc_hhp for the pulse-echo response. The Fourier
transform is done by calculating:
sum(h.*exp(sqrt(-1)*2*pi*f0*t);
where f0 is the frequency, h is the
calculated response, and t are the corresponding time values for the
response h. This will yield the appropriate complex value at the
correct frequency.
The start_time parameter returned by the calc_scat seems to
be truncated to 1/50th of a microsecond (1/(2PRF)?) and doesn't
present an accurate start time for the returned echo. I need to have
greater fidelity with the start_time in order to compare arrival
times for different positions of an ensemble of scatterers.
This is necessary in avoiding jitter and innaccuracy in creating
Doppler shift signals at a specific sample gate depth.
The start time is aligned with the sampling clock, so the start time
always falls right on the start of one sampling interval with the
pulse emission used as a reference. This is needed to keep all
signal coherent and to make it possible to do flow simulations. The
start time would move within a sampling interval, if this was not
done, and thereby make velocity estimation impossible, since
consecutive lines would be out of phase. If you need a higher
resolution in the start time, you will have to increase the sampling
frequency by set_field ('fs', <values>).
Do you have a suggestion for the best way to implement an
annular array as the transducer in Field II?
The annular array is a bit tricky. There are two approaches: one is simulating a
number of piston transducers and then subtract and add the
responses. This is not such a good method, since all the errors at
the boundaries will be amplified. The best, but also must cumbersome
way, is to define the annular array directly using xdc_rectangles or
xdc_triangles. You can then use all the normal calculation tools.
You might want to check the layout by using the routine show_xdc in
the m_utilities directory.
I tried using you IBM AIX matlab version of field2 without success on the
following system:
IBM RS/6000 44P Model 270
AIX 4.3.3
Matlab6
The error I receive is:
>> field
Unable to load mex file: /home/ersva/field2/Mat_field.mexrs6.
Cannot run a file that does not have a valid format.
??? Invalid MEX-file
Error in ==> /home/ersva/field2/field_init.m
On line 23 ==> Mat_field (5001,suppress);
Error in ==> /home/ersva/field2/cyst_phantom/pm/field.m
On line 7 ==> field_init(0)
Any ideas as of what the error is or how to solve it?
Matlab 5 mex files are not compatible with some Matlab 6 versions. At
least not on a Linux system. That is probably why. We are
experimenting with Matlab 6, and it does not seem to be a stable product
under Linux currently.
I use calc_scat_multi and get a returned matrix full of NaN
(not a number). Why?
Your code has scatterers right on the surface of the
transducer. Field II cannot handle this, due to a singularity
on the surface of the transducer. The closets scatterer should
thus be e.g. 1 mm away from the transducer surface.