Tire defect detection system and method

0Associated
Cases 
0Associated
Defendants 
0Accused
Products 
20Forward
Citations 
0
Petitions 
1
Assignment
First Claim
1. A tire defect detection system comprising:
 a support structure for receiving a tire;
an actuator disposed proximate the tire for impacting the tire;
a microphone disposed proximate the actuator for receiving a sound wave generated when the actuator impacts the tire; and
a computer responsive to the microphone;
the computer including;
means for calculating a plurality of discriminator quantities from the sound wave, and means for comparing the calculated discriminator quantities with stored discriminator quantities indicative of a defect to determine whether a defect is present in the tire.
1 Assignment
0 Petitions
Accused Products
Abstract
A tire defect detection system including a support structure for receiving a tire; an actuator disposed proximate the tire for impacting the tire; a microphone disposed proximate the actuator for receiving a sound wave generated when the actuator impacts the tire; and a computer responsive to the microphone, the computer programmed to calculate a number of discriminator quantities from the resulting sound wave and to compare the calculated discriminator quantities with stored discriminator quantities indicative of a defect to determine whether a defect is present in the tire.
20 Citations
Tcell vaccination with viral vectors via mechanical epidermal disruption  
Patent #
US 9,416,371 B2
Filed 01/27/2014

Current Assignee
ONCYTE INC. CO ROBERT L. BIRNBAUM ESQ.

Sponsoring Entity
TREMRX INC.

Method and Apparatus for NonDestructive Detection of Tire Anomalies  
Patent #
US 20160282227A1
Filed 11/05/2013

Current Assignee
Compagnie gnrale des tablissements Michelin

Sponsoring Entity
Compagnie gnrale des tablissements Michelin

Method and apparatus for nondestructive detection of tire anomalies  
Patent #
US 9,909,953 B2
Filed 11/05/2013

Current Assignee
Compagnie gnrale des tablissements Michelin

Sponsoring Entity
Compagnie gnrale des tablissements Michelin

Vehicle software upgrade techniques  
Patent #
US 10,094,673 B2
Filed 08/12/2013

Current Assignee
American Vehicular Sciences LLC

Sponsoring Entity
American Vehicular Sciences LLC

Vehicle software upgrade techniques  
Patent #
US 10,240,935 B2
Filed 08/12/2013

Current Assignee
American Vehicular Sciences LLC

Sponsoring Entity
American Vehicular Sciences LLC

VEHICLE SOFTWARE UPGRADE TECHNIQUES  
Patent #
US 20130325323A1
Filed 08/12/2013

Current Assignee
American Vehicular Sciences LLC

Sponsoring Entity
American Vehicular Sciences LLC

System and Method For Wheel Assembly Acoustical Evaluation  
Patent #
US 20140025251A1
Filed 07/19/2013

Current Assignee
Hunter Engineering Company

Sponsoring Entity
Hunter Engineering Company

System and method for wheel assembly acoustical evaluation  
Patent #
US 9,026,305 B2
Filed 07/19/2013

Current Assignee
Hunter Engineering Company

Sponsoring Entity
Hunter Engineering Company

TIRE SHAPE INSPECTION METHOD AND TIRE SHAPE INSPECTION APPARATUS  
Patent #
US 20140283591A1
Filed 10/02/2012

Current Assignee
Klaus Schmidt

Sponsoring Entity
Klaus Schmidt

Tire shape inspection method and tire shape inspection apparatus  
Patent #
US 9,109,974 B2
Filed 10/02/2012

Current Assignee
Klaus Schmidt

Sponsoring Entity
Klaus Schmidt

Tcell vaccination with viral vectors via mechanical epidermal disruption  
Patent #
US 8,691,502 B2
Filed 05/02/2011

Current Assignee
TREMRX INC.

Sponsoring Entity
TREMRX INC.

TIRE SHAPE INSPECTION METHOD AND TIRE SHAPE INSPECTION DEVICE  
Patent #
US 20110069323A1
Filed 06/03/2009

Current Assignee
Klaus Schmidt

Sponsoring Entity
Klaus Schmidt

Tire shape inspection method and tire shape inspection device  
Patent #
US 8,284,393 B2
Filed 06/03/2009

Current Assignee
Klaus Schmidt

Sponsoring Entity
Klaus Schmidt

Vehicle software upgrade techniques  
Patent #
US 9,443,358 B2
Filed 10/31/2007

Current Assignee
American Vehicular Sciences LLC

Sponsoring Entity
American Vehicular Sciences LLC

METHOD FOR ANALYSING TIRE VIBRATION CHARACTERISTICS AND AN APPARATUS FOR CARRYING OUT SAID METHOD  
Patent #
US 20090314075A1
Filed 07/27/2007

Current Assignee
Schnellbacher Joachim, Albohr Oliver, Garro Luciano, Kumpf Jrg, Sattler Bernd, Reul MarcusAndr

Sponsoring Entity
Schnellbacher Joachim, Albohr Oliver, Garro Luciano, Kumpf Jrg, Sattler Bernd, Reul MarcusAndr

METHOD FOR ANALYSING TIRE VIBRATION CHARACTERISTICS AND AN APPARATUS FOR CARRYING OUT SAID METHOD  
Patent #
US 20110056283A9
Filed 07/26/2007

Current Assignee
Pirelli Tyre SPA

Sponsoring Entity
Pirelli Tyre SPA

Method for analysing tire vibration characteristics and an apparatus for carrying out said method  
Patent #
US 8,024,965 B2
Filed 07/26/2007

Current Assignee
Pirelli Tyre SPA

Sponsoring Entity
Pirelli Tyre SPA

System and method for vehicle diagnostics  
Patent #
US 7,103,460 B1
Filed 09/06/2005

Current Assignee
American Vehicular Sciences LLC

Sponsoring Entity
Automotive Technologies International Incorporated

Acoustic inspection of onepiece bladed wheels  
Patent #
US 6,629,463 B2
Filed 10/09/2001

Current Assignee
Safran Aircraft Engines

Sponsoring Entity
Snecma Moteurs

Acoustic inspection of structures  
Patent #
US 6,581,466 B1
Filed 03/31/2000

Current Assignee
Mississippi State University

Sponsoring Entity
Mississippi State University

No References
33 Claims
 1. A tire defect detection system comprising:
 a support structure for receiving a tire;
an actuator disposed proximate the tire for impacting the tire;
a microphone disposed proximate the actuator for receiving a sound wave generated when the actuator impacts the tire; and
a computer responsive to the microphone;
the computer including;
means for calculating a plurality of discriminator quantities from the sound wave, and means for comparing the calculated discriminator quantities with stored discriminator quantities indicative of a defect to determine whether a defect is present in the tire.  View Dependent Claims (2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)
 a support structure for receiving a tire;
 17. A tire defect detection system comprising:
 an actuator for impacting the tire;
a microphone disposed proximate the actuator for receiving a sound wave generated when the actuator impacts the tire; and
a computer responsive to the microphone, the computer programmed to;
perform an FFT transform for the sound wave, calculate a plurality of discriminator quantities from the FFT transform, and construct a defect transfer function based on the calculated discriminator quantities to provide an indication of whether a defect is present in the tire.
 an actuator for impacting the tire;
 18. A method of inspecting tires for defects, the method comprising:
 obtaining a tire with known defects;
impacting the tire with an actuator;
recording the resulting sound waves;
calculating a plurality of discriminator quantities for each sound wave;
constructing a defect transfer function based on the calculated discriminator quantities and storing the coefficients thereof;
obtaining a tire with unknown defects;
impacting the unknown tire with an actuator;
recording the resulting sound waves;
calculating a plurality of discriminator quantities for each sound wave; and
using the stored coefficients of the constructed defect transfer function to determine whether a defect is present in the tire with unknown defects.
 obtaining a tire with known defects;
 19. A tire defect detection method comprising:
 disposing an actuator proximate the tire and impacting the tire;
disposing a microphone proximate the actuator for receiving a sound wave generated when the actuator impacts the tire;
calculating a plurality of discriminator quantities from the sound wave; and
comparing the calculated discriminator quantities with stored discriminator quantities indicative of a defect to determine whether a defect is present in the tire.  View Dependent Claims (20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32)
 disposing an actuator proximate the tire and impacting the tire;
 33. A tire defect detection method comprising:
 recording a sound wave generated when the tire is impacted;
performing a FFT transform for the sound wave;
calculating a plurality of discriminator quantities from the sound wave and FFT transform; and
constructing a defect transfer function based on the calculated discriminator quantities to provide an indication of whether a defect is present in the tire.
 recording a sound wave generated when the tire is impacted;
1 Specification
This invention was developed with finds under Contract No: N6833597C0201. The United States Government may have certain rights in this invention.
FIELD OF INVENTIONThis invention relates to a system and method for detecting and locating defects such as delaminations and cuts in various types of tires.
BACKGROUND OF INVENTIONOver twenty five million retreaded tires were sold in the United States in 1995 alone. Retreaded tires are used in critical applications such as for military and commercial aircraft and even school buses. As such, when a retreaded tire fails due to a delamination, the result can be disastrous.
There have been numerous attempts made to devise inspection devices which can detect defects present in a tire after the tire has been retreaded. Such prior art devices, however, suffer from numerous drawbacks. Holography methods, which map tire defects using optical means are extremely expensive, generally about $500,000 per machine, are extremely sensitive to vibration, and also relatively slow. Shearography is a similar technique less sensitive to vibration, but also very expensive and slow. High voltage tests are less expensive, but are limited to detecting only metal inclusions in the tire carcass. Ultrasound techniques are capable only of detecting airfilled defects, are very sensitive to the thickness of the tire wall being measured, and therefore are not generally used to inspect aircraft tires. The air injection test specified by military specificationMILR7726H, supplement 1, is extremely time consuming and not very accurate.
Since aircraft tires are retreaded on average five to seven times and in some cases up to twelve times, any inspection device which is overly expensive and complicated and/or which involves long inspection times, and/or which does not accurately detect different types of defects, will not be commercially viable. There are over 1,400 retreading plants in the United States alone. Therefore, the sheer cost of most prior art inspection equipment makes it impractical to inspect all retreaded tires.
SUMMARY OF THE INVENTIONIt is therefore an object of this invention to provide a tire defect detection system and method which accurately detects defects in a tire at a low cost and with short inspection times.
It is a further object of this invention to provide such a tire defect detection system and method which is capable of inspecting 100% of the tire thereby increasing the reliability of the test.
It is a further object of this invention to provide such a tire defect detection system and method which eliminates operator subjectivity.
It is a further object of this invention to provide such a tire defect detection system and method which incorporates many commercial offtheshelf components.
It is a further object of this invention to provide such a tire defect detection system which is not susceptible to the effects of tire side wall lettering or other molded features.
It is a further object of this invention to provide such a tire defect detection system and method which increases the margin of safety which can be expected from a retreated tire.
This invention results from the realization that tires can be inexpensively and comprehensibly inspected and tested both before and after retreading and even in situ by impacting the tire with an actuator and analyzing the resulting sound wave for evidence of delamination and other faults. A neural network or other nonlinear correlator is trained to recognized delaminations and other tire defects based on a number of discriminator quantities computed for each resulting sound wave and to average out nondefect information such as surface lettering, wall thickness, and the like.
This invention features a tire defect detection system comprising a support structure for receiving a tire; an actuator disposed proximate the tire for impacting the tire; a microphone disposed proximate the actuator for receiving a sound wave generated when the actuator impacts the tire; and a computer responsive to the microphone. The computer includes means for calculating a plurality of discriminator quantities from the sound wave, and means for comparing the calculated discriminator quantities with stored discriminator quantities indicative of a defect to determine whether a defect is present in the tire.
The actuator typically includes a solenoid. Further included is a controller for driving the solenoid at an impact time of less than 0.1 seconds. The microphone has a response of approximately 7015,000 Hz.
The computer preferably includes a routine for performing a FFT transform for each waveform. From this sound wave and the FFT transform, a plurality of discriminator quantities are calculated: the mean value of the amplitude of the FFT transform in each frequency band; the standard deviation of the amplitude of the FFT transform in each frequency band; as the root mean square of the sound wave; the inverse of the autocorrelation time of the sound wave; the average area under each excursion above the standard deviation of the sound wave; the average time between crossings of one standard deviation above the mean; the average time between crossings one standard deviation above the mean and one standard deviation below the mean; the average length of the sound waveform; the average length of the sound waveform above one standard deviation above the mean; and the width of any pulse of the sound waveform which are above one standard deviation above the mean as a discriminator quantity.
The defect detection system further includes means for constructing a defect transfer function based on the calculated discriminator quantities.
The tire defect detection system includes an actuator for impacting the tire; a microphone disposed proximate the actuator for receiving a sound wave generated when the actuator impacts the tire; and a computer responsive to the microphone. The computer is programmed to perform a FFT transform for the sound wave, calculate a plurality of discriminator quantities from the sound wave and the FFT transform, and construct a defect transfer function based on the calculated discriminator quantities to provide an indication of whether a defect is present in the tire.
The method of inspecting tires for defects, in accordance with this invention, includes obtaining a tire with known defects; impacting the tire with an actuator; recording the resulting sound waves; calculating a plurality of discriminator quantities for each sound wave, constructing a defect transfer function based on the calculated discriminator quantities and storing the coefficients thereof. A tire with unknown defects is then impacted with an actuator; the resulting sound waves are recorded; a plurality of discriminator quantities for each sound wave are calculated; and the stored coefficients of the constructed defect transfer function are used to determine whether a defect is present in the tire with unknown defects.
DISCLOSURE OF PREFERRED EMBODIMENTOther objects, features and advantages will occur to those skilled in the art from the following description of a preferred embodiment and the accompanying drawings, in which:
<FGREF>FIG. 1</FGREF> is a schematic view of the tire defect system of this invention;
<FGREF>FIG. 2</FGREF> is a schematic view of the support structure for receiving a tire of the tire defect detection system shown in <FGREF>FIG. 1</FGREF>;
<FGREF>FIG. 3</FGREF> is a top view of the actuator/microphone fixture of the tire defect detection system shown in <FGREF>FIG. 1</FGREF>;
<FGREF>FIG. 4</FGREF> is a bottom view of the actuator/microphone fixture shown in <FGREF>FIG. 3</FGREF>;
<FGREF>FIG. 5</FGREF> is a block diagram of the controller of the tire defect detection system shown in <FGREF>FIG. 1</FGREF>;
<FGREF>FIG. 6</FGREF> is a schematic view depicting the method of detecting defects in accordance with the subject invention;
<FGREF>FIG. 7</FGREF> is a front view of the monitor of the tire defect detection system shown in FIG. displaying an image of the tire wall and defects;
<FGREF>FIG. 8</FGREF> is a graph of the FFT of the sound wave analyzed in accordance with the subject invention;
<FGREF>FIGS. 9 and 10</FGREF> are graphs showing details of the FFT transform of the sound wave shown in <FGREF>FIG. 8</FGREF>;
<FGREF>FIG. 11</FGREF> is a graph showing the calculation of the standard deviation discriminator quantity calculated from the FFT transform of <FGREF>FIGS. 910</FGREF> in accordance with the subject invention;
<FGREF>FIG. 12</FGREF> is a graph showing a typical autocorrelation function calculated in accordance with the subject invention;
<FGREF>FIG. 13</FGREF> is a graph showing the calculation of the area discriminator quantity in accordance with the subject invention;
<FGREF>FIG. 14</FGREF> is a graph showing the period measurement discriminator quantities calculated in accordance with the subject invention;
<FGREF>FIG. 15</FGREF> is a graph showing the average pulse width discriminator quantities of the subject invention;
<FGREF>FIGS. 1636</FGREF> are graphs showing the actual discriminator quantities for each impact of the tire defect detection system of this invention at a radius of 7.25 inches on one side of a tire being inspected;
<FGREF>FIGS. 3757</FGREF> are graphs showing the discriminator quantities for each impact at a radius of 9.25 inches on the other side of the tire in accordance with the subject invention;
<FGREF>FIGS. 5860</FGREF> are graphs depicting the impact frequency response of one side of a tire under inspection at a radius of 7.25 inches, 8.25 inches, and 9.25 inches respectively;
<FGREF>FIGS. 6166</FGREF> are graphs showing the effect of tire to microphone distance on one discriminator quantity in accordance with the subject invention;
<FGREF>FIGS. 67</FGREF> is a graph showing the defect transfer function constructed in accordance with the subject invention for a known delamination;
<FGREF>FIG. 68</FGREF> is a graph showing the defect transfer function constructed in accordance with the subject invention for a tire with a known cut;
<FGREF>FIGS. 6970</FGREF> are graphs of two different discriminator quantities calculated in accordance with the subject invention showing the results of the spatial resolution study conducted in accordance with the subject invention;
<FGREF>FIG. 71</FGREF> is a graph showing the location of defects found by the tire defect system of the subject invention based on one track;
<FGREF>FIG. 72</FGREF> is a graph showing location of defects detected in accordance with the subject invention based on another track;
<FGREF>FIG. 73</FGREF> is a graph of the defect transfer function constructed in accordance with the subject invention with respect to a tire without any defects;
<FGREF>FIG. 74</FGREF> is a graph of the defect transfer function constructed in accordance with the subject invention after the neural network was trained using a tire with known defects to then detect defects in a tire with unknown defects;
<FGREF>FIG. 75</FGREF> is a flow chart depicting the primary steps associated with training the neural network in accordance with the tire defect detection method of the subject invention;
<FGREF>FIG. 76</FGREF> is a flow chart depicting the primary steps associated with the tire defect detection method of the subject invention after the neural network is trained; and
<FGREF>FIG. 77</FGREF> is a schematic view of a fully automated tire defect detection system in accordance with the subject invention.
Tire defect detection system 10, <FGREF>FIG. 1</FGREF> includes support structure 12 for tire 15, actuator/microphone fixture 14 disposed over tire 15 via arm 18 which is mounted on base stand 20, computer 22 connected to monitor 24, and controller 26.
Support structure 12, <FGREF>FIG. 2</FGREF>, includes tire support 30 rotatably mounted on spindle 32 received in support base 34 filled with a vibration damping material such as concrete. Spindle 32 could be motor driven in an alternative embodiment. Spindle 32 is capable of supporting a 300 pound tire which is the weight of the largest aircraft tire in common use today.
Base stand 20, <FGREF>FIG. 1</FGREF> includes heavy cast iron base 36 mounted on three selfleveling rubber padded feet as shown. Bracket 38 interconnects aim 18 and base stand 20 to provide height and angle adjustment of actuator/microphone fixture 14 with respect to tire 15.
Actuator/microphone fixture 14, <FGREF>FIGS. 3 and 4</FGREF> includes solenoid 40 with hammer return spring 42 such as an ElectroMechanisms model SP100, 6 volt, high temperature 180° C. coils. Microphone 44, <FGREF>FIG. 4</FGREF>, for example, a Radio Shack Optimist catalog no. 333013 with a flat response from 7015,000 Hz, is mounted proximate hammer 46 of solenoid 40 but physically isolated therefrom by two independent sets of rubber grommets to insulate microphone 44 from any solenoid vibrations.
Solenoid 40 is connected to controller 26, <FGREF>FIG. 5</FGREF>, which provides an applied voltage of 24 volts to solenoid 40. Controller 26 includes an Acopian model ZA12NT110 12 volt DC power supply 50, Elpac power systemsBFS20024 (27.3 VDC7.5 amp) power supply 52, and Syrelec 814 timer 54 connected as shown to provide an actuation time of between 0.01 to 0.03 seconds. Experimentation proved that an actuation time of 0.03 seconds was optimal.
Microphone 44 is connected to computer 22, <FGREF>FIG. 1</FGREF> programmed to 1) perform a FFT transform for each sound wave recorded by microphone 44, 2) compute a number of “discriminator quantities” based on each sound wave and the FFT transform, and 3) construct a defect transfer function based on the discriminator quantities discussed infra.
In general, tire 15, <FGREF>FIG. 6</FGREF> is rotated and the solenoid is actuated for 0.03 seconds every 10° of tire rotation at a radius of 7.25 inches, 8.25 inches, and 9.25 inches of each side wall of the tire and also on the tire tread area. After computer 22, <FGREF>FIG. 1</FGREF>, completes its processing, defects 60, 62, and 64, <FGREF>FIG. 7</FGREF> are displayed on monitor 24. In this example, the defects were delaminations and their approximate size and location are displayed to the user. Other defects such as cuts and the like, however, can also be detected in accordance with this invention.
The processing of computer 22, <FGREF>FIG. 1</FGREF>, is explained in relation to <FGREF>FIGS. 876</FGREF>. Microphone 44, <FGREF>FIG. 4</FGREF>, delivers to the computer a waveform as shown in <FGREF>FIG. 11</FGREF> for each strike of the solenoid hammer on the tire. The computer is programmed to compute a moving window Fourier Transform, sometimes referred to as an Overlapping Gabor Transform representative of the time evolution of the response spectrum as shown in <FGREF>FIGS. 9</FGREF> and 10. As shown, most of the resulting energy is partitioned into six definite frequency bands: 120 Hz250 Hz, 250 Hz400 Hz, 400 Hz800 Hz, 8001000 Hz, 1 kHz2 kHz, and 2 kHz3 kHz. When a delamination is present in the tire, energy shifts from one band to another. By monitoring the relative energy levels between defective and nondefective areas in each band, the defects in the tire can be detected and located.
From the FFT transform of each wave and from the waves themselves, a number of discriminator quantities are computed as discussed below.
The first six discriminator quantities (M1M6) are the mean value of the amplitude of the FFT transform in each of the six identified bands. These values are indicative of the elasticity of the tire under test. The next six discriminator quantities (SD1SD6) are the standard deviation of the amplitude of the FFT transform in each of the six bands. These values are indicative of the peaks within each band or the Q of the material.
The root means square discriminator quantity (RMS) is calculated as: <CWU><MATHUS><MATHEMATICA></MATHEMATICA><MATHML><math><mtable><mtr><mtd><mrow><mfrac><mn>1</mn><mi>N</mi></mfrac><mo>*</mo><msqrt><mrow><munderover><mo>∑</mo><mrow><mi>l</mi><mo>=</mo><mn>1</mn></mrow><mi>N</mi></munderover><mo></mo><mstyle><mtext> </mtext></mstyle><mo></mo><msup><mrow><mo>(</mo><msub><mi>X</mi><mi>l</mi></msub><mo>)</mo></mrow><mn>2</mn></msup></mrow></msqrt></mrow></mtd><mtd><mrow><mo>(</mo><mn>1</mn><mo>)</mo></mrow></mtd></mtr></mtable></math></MATHML><EMI></EMI></MATHUS></CWU>
in the time domain where N is the number of points in the sample, and X is the sample point on the wave in the time domain. This discriminator quantity is most sensitive to the tire's initial response impact.
Another discriminator quantity is the standard deviation (STDEV) of the points on the waveform in the time domain. Once this quantity is calculated, lines are defined as one standard deviation above and below the mean as shown in FIG. 11. Many other discriminator quantities are related to this defined interval.
The slope as a discriminator quantity refers to the inverse of the characteristic autocorrelation time. This is the time scale during which the signal loses linear correlation, and is suggestive as a measure of the rate of mixing in a given process. The auto correlation C<HIL><SB>xx</SB></HIL>(τ) is the integral over all time of the signal x(t) multiplied by the timedelayed version of the signal x (t−τ). For no time delay, (τ=0), the autocorrelation thus equals:
<F>n{overscore (x<HIL><SP>2</SP></HIL>+L )} (2)</F>
For large τ values, the auto correlation approaches
<F>n{overscore (x<HIL><SP>2</SP></HIL>+L )} (3)</F>
where n is the number of readings in the record.
As shown in <FGREF>FIG. 12</FGREF>, the characteristic autocorrelation time is the time intercept of a line at the initial downward slope of the autocorrelation curve with the run out value Δt<HIL><SB>characteristic</SB></HIL>) given by: <CWU><MATHUS><MATHEMATICA></MATHEMATICA><MATHML><math><mtable><mtr><mtd><mrow><mrow><mi>Δ</mi><mo></mo><mstyle><mtext> </mtext></mstyle><mo></mo><msub><mi>t</mi><mi>characteristic</mi></msub></mrow><mo>=</mo><mfrac><mrow><mrow><mo>∑</mo><mstyle><mtext> </mtext></mstyle><mo></mo><msup><mi>x</mi><mn>2</mn></msup></mrow><mo></mo><msubsup><mi>N</mi><mi>x</mi><mrow><mo></mo><mn>2</mn></mrow></msubsup></mrow><mrow><mrow><mo>∑</mo><mstyle><mtext> </mtext></mstyle><mo></mo><msup><mi>x</mi><mn>2</mn></msup></mrow><mo></mo><mrow><mi>Σ</mi><mo></mo><mrow><mo>[</mo><mrow><msub><mi>x</mi><mi>i</mi></msub><mo></mo><mrow><mo>(</mo><msub><mi>x</mi><mrow><mi>i</mi><mo>+</mo><mi>j</mi></mrow></msub><mo>)</mo></mrow></mrow><mo>]</mo></mrow></mrow></mrow></mfrac></mrow></mtd><mtd><mrow><mo>(</mo><mn>4</mn><mo>)</mo></mrow></mtd></mtr></mtable></math></MATHML><EMI></EMI></MATHUS></CWU>
Normalization usually sets the initial value to “1” so that the initial slope is <CWU><MATHUS><MATHEMATICA></MATHEMATICA><MATHML><math><mtable><mtr><mtd><mrow><mi>SLOPE</mi><mo>=</mo><mfrac><mn>1</mn><mrow><mi>Δ</mi><mo></mo><mstyle><mtext> </mtext></mstyle><mo></mo><msub><mi>t</mi><mi>CHARACTERISTIC</mi></msub></mrow></mfrac></mrow></mtd><mtd><mrow><mo>(</mo><mn>5</mn><mo>)</mo></mrow></mtd></mtr></mtable></math></MATHML><EMI></EMI></MATHUS></CWU>
The area discriminator quantity (AREA) is the average area under each excursion above the first standard deviation line as shown in FIG. 13 and is indicative of the damping weight of the waves in the tire and hence the material properties of the tire.
The HCROSS discriminator quantity is a tally of the total number of times the signal rises above the upper standard deviation line. The HLCROSS discriminator quantity is the tally of the number of times the signal rises above the standard deviation line and then continues by falling below the lower standard deviation line. It is believed that these quantities describe the decay rate of the signal by counting the large amplitude excursions, but in the final analysis these two discriminator quantities were not used as values indicative of delaminations. In addition, the RMS and the STDEV values seem to carry the same information and hence only one value, namely the RMS value, is used in the preferred embodiment.
The PER 1 and PER 2 discriminator quantities are period measurements parallel to the crossing measurements described above. PER 1 corresponds to HCROSS in that measures the average time between rising crossings of the upper standard deviation line. PER 2 corresponds to HLCROSS in that it measures the average time between the upper standard deviation line and lower standard deviation line crossings as shown in FIG. 14.
The LEN 1 and LEN 2 discriminator quantities are lengths derived from the length of the signal. If the signal is imagined to be stretched out flat, a signal with many high frequency, large amplitude information will stretch out farther than one with a smooth texture. Thus, these two discriminator quantities contain information about the high frequency content of the signal. LEN 1 is the length of the overall contour of the signal from the start to end. LEN 2 is the average length of the contour of the signal that just lies above the upper standard deviation line. This value contains specific information about the high frequency content of the large amplitude excursions.
PW is the discriminator quantity which represents the average pulse width of peaks that rise above the upper standard deviation line. PW is measured in time steps and is measured at the upper standard deviation line as shown in FIG. 15. This quantity contains information about the bulk response of the tire to the initial impact of the solenoid.
In order to train a neural network to recognize defects, data is recorded for three separate radii on each side of a tire with known delaminations and for three height positions on the threadwall of the tire. Each track included thirtysix impact points separated by a 10° rotation of the tire. For every impact on the tire, the discriminator quantities explained above are calculated by the computer. <FGREF>FIGS. 1636</FGREF> show the discriminator quantities for each impact at a radius of 7.25 inches on one side of the tire. <FGREF>FIGS. 3757</FGREF> show the discriminator quantities for each impact at a radius of 9.25 inches on the other side of the tire. <FGREF>FIGS. 5860</FGREF> show the general overview of the impact frequency response of one side of the tire at the radius of 7.25 inches, 8.25 inches, and 9.25 inches respectively.
An analysis was also conducted to determine the effect of the lettering present on the sidewall of a tire on the discriminator quantities described above. A typical tire sidewall contains lettering and other molded features which may interfere with the hammer impact and hence were expected to produce artifacts in the resulting discriminator quantities. This was particularly true for the middle track on each side of the tire, which ran directly through large sections of lettering. For example, at a radius of 8.25 inches, several of the quantities show an indication at 30°, particularly M3, M4, RMS, AREA, LEN 1, and PER 1. These results directly correspond to a raised impression in the molding of the surface rubber of the tire. In this type of raised feature, the tip of the impact hammer does not make fall contact with the surface of the tire and thus produces a different type of waveform than normal. This is also true in cases where the tip of the hammer hits the edge of a raised letter as is in the case at 140° and to a lesser extent at 160° and 320°. Direct full flat hits on surface lettering did not seem to affect the discriminator quantities. Thus, in the preferred embodiment, the diameter of the solenoid impact head should be decreased as much as possible to lower the chance of these glancing impacts and thus result in fewer false indicators of defects. Another surface feature that shows up in the results is the unevenness of the tire width. The distance between the solenoid and microphone fixture from the surface of the tires varies from near contact with the head of the solenoid to approximately six millimeters along the middle track. These variations are of a lesser degree along the inner track and slightly greater along the outer track. These variations in tire width effect the initial force and thus the shape of the overall impact. This is evident in lowest band in the frequency domain and <FGREF>FIGS. 6166</FGREF> show the high and low points marked on the various M1 discriminator quantity graphs. This variation only appears in the M1 and SD1 quantities, and therefore these discriminator quantities are indicative of surface height but not defects on the tire. In the tread area, uneven wear on the surface produce visible results in the data. As such, M1 is not used as a contribution to indicate real defects in the tire.
Therefore, some discriminator quantities are particularly useful, while others are not. From the useful discriminator quantities, a defect transfer function is constructed to combine the discriminator quantities and thus average out the nondefect information such as surface lettering as discussed above, wall thickness, and surface to microphone separation.
The defect transfer function is a classification of an equation of the form <CWU><MATHUS><MATHEMATICA></MATHEMATICA><MATHML><math><mtable><mtr><mtd><mrow><mi>T</mi><mo>=</mo><mrow><mi>F</mi><mo></mo><mrow><mo>[</mo><mrow><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>K</mi></munderover><mo></mo><mstyle><mtext> </mtext></mstyle><mo></mo><mrow><msub><mi>a</mi><mi>i</mi></msub><mo></mo><mrow><mo>[</mo><mrow><mi>F</mi><mo></mo><mrow><mo>[</mo><mrow><munderover><mo>∑</mo><mrow><mi>j</mi><mo>=</mo><mn>1</mn></mrow><mi>N</mi></munderover><mo></mo><mstyle><mtext> </mtext></mstyle><mo></mo><mrow><msub><mi>b</mi><mi>j</mi></msub><mo></mo><msub><mi>DQ</mi><mi>i</mi></msub></mrow></mrow><mo>]</mo></mrow></mrow><mo>]</mo></mrow></mrow></mrow><mo>]</mo></mrow></mrow></mrow></mtd><mtd><mrow><mo>(</mo><mn>6</mn><mo>)</mo></mrow></mtd></mtr></mtable></math></MATHML><EMI></EMI></MATHUS></CWU>
Where DQ<HIL><SB>j </SB></HIL>are the discriminator quantities, N is the total number of discriminator quantities used, K is the number of intermediate transformation combination equations, a<HIL><SB>i </SB></HIL>and b<HIL><SB>j </SB></HIL>are weighting coefficients, and F is a scaling function of the type <CWU><MATHUS><MATHEMATICA></MATHEMATICA><MATHML><math><mtable><mtr><mtd><mrow><mrow><mi>F</mi><mo></mo><mrow><mo>(</mo><mi>X</mi><mo>)</mo></mrow></mrow><mo>=</mo><mrow><mfrac><mn>2</mn><mrow><mo>(</mo><mrow><mn>1</mn><mo>+</mo><mrow><mi>exp</mi><mo></mo><mrow><mo>(</mo><mrow><mo></mo><mi>x</mi></mrow><mo>)</mo></mrow></mrow></mrow><mo>)</mo></mrow></mfrac><mo></mo><mn>1</mn></mrow></mrow></mtd><mtd><mrow><mo>(</mo><mn>7</mn><mo>)</mo></mrow></mtd></mtr></mtable></math></MATHML><EMI></EMI></MATHUS></CWU>
T is the transfer function that take as inputs the discriminator quantities and outputs a value between 0 and 1. T is essentially the probability that a defect is located at a given point during the inspection process. The coefficients of the defect transfer functions are preferably found through an adaptive learning technique such as a neural network or with genetic algorithms. In general, the data of the different discriminator quantities for a known defect is taught to a neural network which assigns a weight to each of them in a manner that the known defect is assigned a probability of 1.
In practice, the coefficients for the data transfer function were found by training a threelevel back propagation neural network using “Neuro Shell 2”, an artificial neural network computer program from Ward Systems Group on roughly half of the data samples chosen at random. The data transfer functions were created for a track with a known delamination as shown in <FGREF>FIG. 67 and a</FGREF> track with a known cut in the tire as shown in FIG. 68.
A study was also performed to determine the spatial resolution to detect a delamination. A tire with a known delamination cut into the side wall was tested by recording impact data while moving the solenoid/microphone fixture to the left and right of the defect in 0.3 inch steps and tapping three times in each position. The delamination was known to be approximately one inch wide. Results are shown in <FGREF>FIGS. 69 and 70</FGREF>. The distance in inches shown along the bottom of each graph is the relative position of the impact hammer with respect to the center of the delamination. The results indicate a defect up to 0.6 of an inch away from the center but not at 1 inch. These results suggest that the microphone location is not critical because the defect indicators are not due to the modulation of a transverse wave traveling through the defect, but instead the indicators are due to the modulation of the impact itself because of an alteration in the local material bulk properties due to the nearby existence of the defect. Thus, the positioning of the microphone is not critical and in fact one microphone might be used to record impacts from several solenoids in an array along the radius of a tire. The results also suggest that the hammer does not necessarily have to strike the tire directly over the defect. That there is no indication at 1 inch shows that there was no measurable disturbance of the impact at that distance. However, a stronger impact may cause a measurable modulation of the impact which would then produce an indicator in the discriminator quantities.
Finally, the trained neural network was used to test a tire with planted defects unknown to the test engineers. The results are shown in <FGREF>FIGS. 71 and 72</FGREF> for two tracks. The results were then compared to a map of the planted defects and the correlation was almost perfect. Note that since three samples were taken at each test point, there are three bars for each location. The test points were approximately 1 inch apart and the index points are approximately 2 inches apart. Thirty five index points marked on the tire correspond to 70 test points. Thus, the test points fall on each index mark and also halfway between. Note that the large spikes (index locations 15, 22, and 31 in <FGREF>FIG. 72</FGREF>) correlate very well to the map locations of the two larger sides delaminations. There is also a very good correspondence between the locations indicated in the middle track <FGREF>FIG. 71</FGREF> relative to the larger side delamination show larger delaminations. The smaller delaminations under ½ inch do not show up very well in this measurement but such delaminations are below the size specified in military specification MILR7726H.
In any case, to detect even delaminations of this size, a stronger solenoid/hammer can be used (namely the SP100 model described above) and the tire reaction signals were processed as described above with a new defect transfer function found using data from a tire with no defects, and a tire with planted defects. Results are shown in <FGREF>FIG. 73</FGREF> (good tire) and 74 (tire with planted delaminations).
In summary then, in accordance with this invention, a neural network is trained to recognize delaminations, cuts, and similar defects in a tire by first striking a tire with known defects, step 100, <FGREF>FIG. 75</FGREF> using system 10, <FGREF>FIGS. 16</FGREF>. The resulting sound wave is recorded, step 102, and an FFT transform is computed for each wave form, step 104. The discriminator quantities described above, are then computed, step 106 based on the FFT transform and the sound waves until the inspection is complete, step 108. The discriminator quantities calculated in step 106, are then used to construct the defect transfer function referred to above, step 110. The actual tire under inspection, is then placed on support structure 12, FIG. 1 and this tire is inspected by striking the tire with the solenoid, step 120, <FGREF>FIG. 76</FGREF>, recording the resulting sound wave, step 122, computing the FFT transform for each recorded wave form, step 124, and computing the discriminator quantities, step 126. Once the inspection is complete, step 128, the defect transfer function is constructed, step 130 and the defects displayed, step 132.
As indicated above, this process can be automated in a fashion similar to machines currently used to balance tires by providing three separate arrays of solenoid/microphone subassemblies 200, 202, 204, <FGREF>FIG. 77</FGREF> each disposed about the tire on opposite sides thereof and along the threadwall for impacting the tire along three separate tracks as motor 206 rotates the tire under the control of controller 208 which also automatically activates the solenoid at the appropriate times and which includes a computer responsive to the microphone to perform the analysis described above in real time. Display 24 then provides a record of the defects as shown in FIG. 7. Such a system is expected to cost less than $20,000.00. A hand held unit which can be used to inspect tires in situ is expected to cost less than $10,000,00 and in both embodiments the inspection times are expected to be less than ten minutes.
Therefore the tire defect detection system and method of this invention accurately detects defects in a tire at a low cost and involves minimum inspection times. The tire defect detection system and method of this invention is also capable of inspecting 100% of the tire thereby increasing the reliability of the test. Operator subjectivity is eliminated and the test can be easily automated. The tire defect detection system described herein incorporates many commercial offtheshelf components to further reduce the system price.
The code which is used to compute the FFT transform, <FGREF>FIGS. 7576</FGREF>, to compute the discriminator quantities, and to construct the defect transfer function in accordance with the subject invention is as follows.
<TABLEUS><TABLECALS><table><tgroup><colspec></colspec><colspec></colspec><thead><row><entry></entry><entry></entry></row></thead><tbody><row><entry></entry><entry>tire_inspector.ccp  calculates discriminator values over a number of</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>fixed record lengths.</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>writen by Frank Heirtzler</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>SEPT 1997</entry></row></tbody></tgroup><tgroup><colspec></colspec><tbody><row><entry>******************************************************************************/</entry></row><row><entry>#include <stdlib.h></entry></row><row><entry>#include <stdio.h></entry></row><row><entry>#include <math.h></entry></row><row><entry>#include <conio.h></entry></row><row><entry>#include <string.h></entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry>#define NPOINTS</entry><entry>1024</entry></row><row><entry>#define MINF0</entry><entry>0</entry></row><row><entry>#define MAXF0</entry><entry>120</entry></row><row><entry>#define MINF1</entry><entry>120</entry></row><row><entry>#define MAXF1</entry><entry>250</entry></row><row><entry>#define MINF2</entry><entry>250</entry></row><row><entry>#define MAXF2</entry><entry>400</entry></row><row><entry>#define MINF3</entry><entry>400</entry></row><row><entry>#define MAXF3</entry><entry>800</entry></row><row><entry>#define MINF4</entry><entry>800</entry></row><row><entry>#define MAXF4</entry><entry>1000</entry></row><row><entry>#define MINF5</entry><entry>1000</entry></row><row><entry>#define MAXF5</entry><entry>2000</entry></row><row><entry>#define MINF6</entry><entry>2000</entry></row><row><entry>#define MAXF6</entry><entry>3000</entry></row><row><entry>#define MINF7</entry><entry>3000</entry></row><row><entry>#define MAXF7</entry><entry>4000</entry></row><row><entry>#define NBAND</entry><entry>8</entry></row><row><entry>#define RATE</entry><entry>48000</entry></row><row><entry>#define THRESH</entry><entry>5000</entry></row><row><entry>#define HOPOVER</entry><entry>3 * 1024</entry></row><row><entry>#define SCALE</entry><entry>65536.0</entry></row><row><entry>struct cmplx</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>{</entry></row><row><entry></entry><entry>float re;</entry></row><row><entry></entry><entry>float im;</entry></row><row><entry></entry><entry>} dat [NPOINTS]; // working array for the FFT</entry></row></tbody></tgroup><tgroup><colspec></colspec><tbody><row><entry>enum logic {NO, YES};</entry></row><row><entry>enum level (LOW, MID, HIGH};</entry></row><row><entry>enum stat {OFF, ON};</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry>float d[NPOINTS];</entry><entry>// input data array</entry></row><row><entry>float hCross;</entry><entry>// 1 stdev above mean</entry></row><row><entry>float lCross;</entry><entry>// 1 stdev below mean</entry></row></tbody></tgroup><tgroup><colspec></colspec><tbody><row><entry>main( )</entry></row><row><entry>{</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>float disp;</entry><entry>// waveform input</entry></row><row><entry></entry><entry>float scalefactor</entry><entry>// frequency conversion factor</entry></row><row><entry></entry><entry>float dsum</entry><entry>// sum for computing mean</entry></row><row><entry></entry><entry>float dmeaBAND];</entry><entry>// mean value of fft intensity</entry></row><row><entry></entry><entry>float dsd[BAND];</entry><entry>// atandard deviation</entry></row><row><entry></entry><entry>float dmax,</entry><entry>// max intensity between MINF and MAXF</entry></row><row><entry></entry><entry>float dmin;</entry><entry>// min intensity between MINF and MAXF</entry></row><row><entry></entry><entry>float dcurrent,</entry><entry>// current fft value</entry></row><row><entry></entry><entry>float drange[NBAND];</entry><entry>// dist between min and max values</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>int</entry><entry>i;</entry><entry>// loop counter</entry></row><row><entry></entry><entry>int</entry><entry>band;</entry><entry>// frequency band counter</entry></row><row><entry></entry><entry>int</entry><entry>j;</entry><entry>// loop counter</entry></row><row><entry></entry><entry>int</entry><entry>k;</entry><entry>// loop counter</entry></row><row><entry></entry><entry>int</entry><entry>count;</entry><entry>// theshold cross counter</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>int</entry><entry>imin[NBAND];</entry><entry>// array index for MINF</entry></row><row><entry></entry><entry>int</entry><entry>imax[NBAND];</entry><entry>// array index for MAXF</entry></row><row><entry></entry><entry>int</entry><entry>ndetect;</entry><entry>// # data points above THRESH</entry></row><row><entry></entry><entry>int</entry><entry>npoints;</entry><entry>// # of points read from the sample</entry></row><row><entry></entry><entry>int</entry><entry>powerOf2;</entry><entry>// binary power of input array</entry></row><row><entry></entry><entry>int</entry><entry>wv;</entry><entry>// wave counter</entry></row><row><entry></entry><entry>void</entry><entry>fft(int m);</entry><entry>// fft routine</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>enum level curFlag;</entry><entry>//staus of current point</entry></row><row><entry></entry><entry>float dimag;</entry><entry>// square of imaginary comp</entry></row><row><entry></entry><entry>float dreal;</entry><entry>// square of real comp</entry></row><row><entry></entry><entry>float dxlength1;</entry><entry>//current length</entry></row><row><entry></entry><entry>float dxlength2;</entry><entry>//current length above hCross</entry></row><row><entry></entry><entry>enum level flagStat( );</entry><entry>//function returns current status</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>float metrics[11 + 2 * NBAND];</entry><entry>//output metrics in an array</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>int</entry><entry>nhCross;</entry><entry>//# pos. peaks</entry></row><row><entry></entry><entry>int</entry><entry>nhlCross;</entry><entry>//# pos. to neg. periods</entry></row><row><entry></entry><entry>int</entry><entry>nperiod1;</entry><entry>//# wavelengths</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>enum level oldFlag;</entry><entry>//status of previous x</entry></row><row><entry></entry><entry>enum stat periodFlag;</entry><entry>//flags start of pos peak</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>int</entry><entry>perstart;</entry><entry>//start of wavelength</entry></row><row><entry></entry><entry>int</entry><entry>pulsewidth;</entry><entry>//width of pos. peaks</entry></row><row><entry></entry><entry>float</entry><entry>slope;</entry><entry>//inverse slope of autocorrelation function</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>enum stat startFlag;</entry><entry>//flags beginning of pos to neg crossing</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>int</entry><entry>startime;</entry><entry>//beginning of pos. peak</entry></row><row><entry></entry><entry>int</entry><entry>startpeak;</entry><entry>//beginning of a pos. to neg crossing</entry></row><row><entry></entry><entry>float</entry><entry>xareal;</entry><entry>//area above hCross</entry></row><row><entry></entry><entry>float</entry><entry>xcorr;</entry><entry>//autocorrelation function</entry></row><row><entry></entry><entry>float</entry><entry>xlength1;</entry><entry>//length of waveform</entry></row><row><entry></entry><entry>float</entry><entry>xlength2;</entry><entry>//length of pos peaks</entry></row><row><entry></entry><entry>float</entry><entry>xperiod1;</entry><entry>//period between pos peaks</entry></row><row><entry></entry><entry>float</entry><entry>xperiod2;</entry><entry>//period between pos and neg peaks</entry></row><row><entry></entry><entry>float</entry><entry>xmean;</entry><entry>//average x</entry></row><row><entry></entry><entry>float</entry><entry>xrms;</entry><entry>//RMS value of x</entry></row><row><entry></entry><entry>float</entry><entry>xsmean;</entry><entry>//average x*x</entry></row><row><entry></entry><entry>float</entry><entry>xssum;</entry><entry>//summation holder for x*x</entry></row><row><entry></entry><entry>float</entry><entry>xstdev;</entry><entry>//standard deviation of x</entry></row><row><entry></entry><entry>float</entry><entry>xsum;</entry><entry>//summation holder for x</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>for(wv=0; wv<3; wv++)</entry><entry>// process three waves</entry></row><row><entry></entry><entry>{</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>// look for the impact  read in the waveform po until three</entry></row><row><entry></entry><entry>// succesive points fall above the impact threshold</entry></row><row><entry></entry><entry>ndetect = 0;</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>do</entry><entry>// read in data points</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>{</entry></row><row><entry></entry><entry>disp = GetDataPoint( );</entry></row><row><entry></entry><entry>if (disp < 0.09) disp *= −1;</entry></row><row><entry></entry><entry>if (disp > THRESH) ndetect++;</entry></row><row><entry></entry><entry>} while ((ndetect < 3) && !timeOut( ));</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>if (ndetect == 0) ImpactOK = NO;</entry></row><row><entry></entry><entry>// impact has been detected, start saving the data</entry></row><row><entry></entry><entry>if (ImpactOK)</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>{</entry></row><row><entry></entry><entry>npoints = 0;</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>do</entry><entry>// collect and scale NPOINTS of data points</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>{</entry></row><row><entry></entry><entry>disp = GetDataPoint( );</entry></row><row><entry></entry><entry>disp = 10.0 * (disp/SCALE);</entry></row><row><entry></entry><entry>d[npoints] = disp;</entry></row><row><entry></entry><entry>npoints++;</entry></row><row><entry></entry><entry>} while ({npoints < NPOINTS) && !timeOut( )};</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>powerOf2 = (int) (log(npoints)/log(2)); //order of FFT</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>xsum = d[0];</entry><entry>// initialize collection sums</entry></row><row><entry></entry><entry>xssum = d[0] * d[0];</entry></row><row><entry></entry><entry>xcorr = 0;</entry></row><row><entry></entry><entry>xlength1 = 0;</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>// first group calculations</entry></row><row><entry></entry><entry>for (i=1; i<npoints; i++)</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>{</entry></row><row><entry></entry><entry>xsum += d[i]</entry></row><row><entry></entry><entry>xssum += d[i] * d[i];</entry></row><row><entry></entry><entry>xcorr += d[i] * d[i1];</entry></row><row><entry></entry><entry>xlength1 += d[i] − d[i1];</entry></row><row><entry></entry><entry>if (xlength1 < 0) xlength1 = −xlength1;</entry></row><row><entry></entry><entry>}</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>if (npoints > 1)</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>{</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>xmean = xsum/npoints;</entry><entry>//mean</entry></row><row><entry></entry><entry>xsmean = xssum/npoints;</entry><entry>//mean square</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>xrms = metrics[0] = sqrt[xsmean]; //root mean square</entry></row><row><entry></entry><entry>xcorr /= npoints;</entry></row><row><entry></entry><entry>num = (float)npoints;</entry></row><row><entry></entry><entry>xev = metrics[1] = sqrt((num * xssum </entry></row><row><entry></entry><entry>xsum * xsum)/(num * (num − 1))); //stdev</entry></row><row><entry></entry><entry>slope = metrics[2] = (xsmean − xmean * xmean)/(xsmean − xcorr); //autocorr</entry></row></tbody></tgroup><tgroup><colspec></colspec><tbody><row><entry>elation</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>}</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>/* second group calculations */</entry></row><row><entry></entry><entry>hCross = xmean + xstdev;</entry></row><row><entry></entry><entry>lCross = xmean − xstdev;</entry></row><row><entry></entry><entry>startFlag = OFF;</entry></row><row><entry></entry><entry>periodFlag = OFF;</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>xareal = 0;</entry><entry>//area above hCross</entry></row><row><entry></entry><entry>nhCross = 0</entry><entry>//# high crossings</entry></row><row><entry></entry><entry>nhlCross = 0</entry><entry>//# high to low crossings</entry></row><row><entry></entry><entry>xlength1 = 0;</entry><entry>//total length of waveform</entry></row><row><entry></entry><entry>xlength2 = 0;</entry><entry>//length above hCross</entry></row><row><entry></entry><entry>xperiod1 = 0;</entry><entry>//period between pos peaks</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>xperiod2 = 0;</entry><entry>//period between pos and neg peaks</entry></row><row><entry></entry><entry>pulsewidth = 0;</entry><entry>//width of positive peaks</entry></row><row><entry></entry><entry>nperiod1 = 0;</entry></row><row><entry></entry><entry>startime = 0;</entry></row><row><entry></entry><entry>startpeak = 0;</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>if (d[0] = hCross) oldFlag = HIGH;</entry></row><row><entry></entry><entry>else if (d[0] < 1Cross) oldFlag = LOW;</entry></row><row><entry></entry><entry>else oldFlag = MID;</entry></row><row><entry></entry><entry>for (i=1; i<npoints; i++)</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>{</entry></row><row><entry></entry><entry>dxlength1 = d[i] − d[i1]; //total length</entry></row><row><entry></entry><entry>if (dxlength1 < 0) dxlength1 = −dxlength1;</entry></row><row><entry></entry><entry>xlength1 += dxlength1;</entry></row><row><entry></entry><entry>curFlag = flagStat(d[i]);</entry></row><row><entry></entry><entry>if (curFlag == HIGH)</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>{</entry></row><row><entry></entry><entry>xareal += d[i] − hCross; //area above hCross</entry></row><row><entry></entry><entry>if (oldFlag != HIGH)</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>{</entry></row><row><entry></entry><entry>dxlength2 = d[i] − hCross;</entry></row><row><entry></entry><entry>if (dxlength2 < 0) dxlength2 = −dxlength2;</entry></row><row><entry></entry><entry>xlength2 += dxlength2;</entry></row><row><entry></entry><entry>nhCross++; //# hCross crossings</entry></row><row><entry></entry><entry>startime = i; //beginning of peak</entry></row><row><entry></entry><entry>if (startFlag == OFF)</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>{</entry></row><row><entry></entry><entry>startFlag = ON;</entry></row><row><entry></entry><entry>startpeak = i;</entry></row><row><entry></entry><entry>}</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>else</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>{</entry></row><row><entry></entry><entry>startFlag = OFF;</entry></row><row><entry></entry><entry>xperiod1 += i − startpeak,</entry></row><row><entry></entry><entry>nperiod1++;</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>if (periodFlag == OFF)</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>{</entry></row><row><entry></entry><entry>periodFlag = ON;</entry></row><row><entry></entry><entry>perstart = i;</entry></row><row><entry></entry><entry>}</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>} //end if oldFlag</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>else</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>{</entry></row><row><entry></entry><entry>dxlength2 = d[i] − d[i1];</entry></row><row><entry></entry><entry>if (dxlength2 < 0) dxlength2 = −dxlength2;</entry></row><row><entry></entry><entry>xlength2 += dxlength2;</entry></row><row><entry></entry><entry>}</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>} //end if curFlag</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>else //if curFlag != HIGH</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>{</entry></row><row><entry></entry><entry>if (oldFlag == HIGH) pulsewidth += (i  startime);</entry></row><row><entry></entry><entry>if ((curFlag == LOW) && (oldFlag != LOW) && (periodFlag == ON))</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>{</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>periodFlag = OFF;</entry><entry>//beginning of pos peak</entry></row><row><entry></entry><entry>xperiod2 += i  perstart;</entry></row><row><entry></entry><entry>nhlCross++;</entry></row><row><entry></entry><entry>}</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>oldFlag = curFlag;</entry></row><row><entry></entry><entry>}</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>//end for i</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>if (nperiod1 > 0) xperiod1 /= (float)nperiod1;</entry></row><row><entry></entry><entry>if (nhlCross > 0) xperiod2 /= (float)nhlCross;</entry></row><row><entry></entry><entry>metrics[3] = xareal;</entry></row><row><entry></entry><entry>metrics[4] = nhCross;</entry></row><row><entry></entry><entry>metrics[5] = nhlCross;</entry></row><row><entry></entry><entry>metrics[6] = xlength1;</entry></row><row><entry></entry><entry>metrics[7] = xlength2;</entry></row><row><entry></entry><entry>metrics[8] = xperiod1;</entry></row><row><entry></entry><entry>metrics[9] = xperiod2;</entry></row><row><entry></entry><entry>metrics[10] = pulsewidth;</entry></row><row><entry></entry><entry>for (i=0; i<NPOINTS; i++)</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>{</entry><entry></entry></row><row><entry></entry><entry>dat[i].re = d[i];</entry><entry>// real part</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>dat[i].im = 0;</entry><entry>// imag part</entry></row><row><entry></entry><entry>}</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>fft(powerOf2);</entry><entry>// perform an FFT</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>for i<npoints/2; i++)</entry><entry>// recombine al and imag</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>dreal = dat[i].re + dat[i].re;</entry></row><row><entry></entry><entry>dimag = dat[i].im + dat[i].im;</entry></row><row><entry></entry><entry>d[i] = sqrt(dreal + dimag);</entry></row><row><entry></entry><entry>}</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>scalefactor = pow(2,powerOf2) / (float)RATE;</entry><entry>// frequency conversion fac</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>tor</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>ScaleRange(imin.imax; // calculates index for frequency limits</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>// in each range</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>// compute the output info</entry></row><row><entry></entry><entry>for (band=0; band<NBAND; band++)</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>{</entry></row><row><entry></entry><entry>dsum = 0;</entry></row><row><entry></entry><entry>for (i=imin(band); i<imax[band]; i++)</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>{</entry><entry></entry></row><row><entry></entry><entry>dcurrent = d[j];</entry><entry>// current fft value</entry></row><row><entry></entry><entry>dsum += dcurrent;</entry></row><row><entry></entry><entry>}</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>dmean[band] = metrics[11+[2 * band)] = dsum/(imax[band] − imin[band]); //</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>MEAN intensity</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>dsum = 0;</entry><entry>// standard deviation</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>for (i=imin[band]; i<imax[band]; i++)</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>{</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>dsum += pow((d[i] − dmean(band)), 2);</entry></row><row><entry></entry><entry>}</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>dsd[band] = metrics(12+(2 * band)] = sqrt(dsum/NPOINTS);</entry></row><row><entry></entry><entry>} //end for band</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>// output the info</entry></row><row><entry></entry><entry>DataPrint(metrics); //prints output metrics</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>} // end for wv</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>} // end for j</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>return (0)</entry></row></tbody></tgroup><tgroup><colspec></colspec><tbody><row><entry>} // end main</entry></row><row><entry>/**************************************************************</entry></row><row><entry>flagStat  returns the staus on the current value of the</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>input function and whether it's below, within or</entry></row><row><entry></entry><entry>above 1 standard deviation from the mean: LOW, MID,</entry></row><row><entry></entry><entry>HIGH</entry></row></tbody></tgroup><tgroup><colspec></colspec><tbody><row><entry>******************************************************************/</entry></row><row><entry>enum level flagStat(double x)</entry></row><row><entry>{</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>if (x > hCross) return HIGH;</entry></row><row><entry></entry><entry>else if (x > lCross) return LOW;</entry></row><row><entry></entry><entry>else return MID;</entry></row></tbody></tgroup><tgroup><colspec></colspec><tbody><row><entry>}</entry></row><row><entry>/**********************************************************************</entry></row><row><entry>fft  Inplace radix 2 decimation in time FFT</entry></row><row><entry>Requires pointer to complex array, x and power of 2 size of FFT, m</entry></row><row><entry>(size of FFT = 2**m). Places FFT output on top of input COMPLEX array.</entry></row><row><entry>void fft(complx *x, int m)</entry></row><row><entry>**********************************************************************/</entry></row><row><entry>void fft(int m)</entry></row><row><entry>{</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>static struct complx *w;</entry><entry>/* used to store the w complex array */</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>static int mstore = 0;</entry><entry>/* stores m for future reference */</entry></row><row><entry></entry><entry>static int n = 1;</entry><entry>/* length of fft stored for future */</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>struct complx u,temp,tm;</entry></row><row><entry></entry><entry>struct complx *xi,*xip,*xj,*wptr;</entry></row><row><entry></entry><entry>int i,j,k,l,le,windex;</entry></row><row><entry></entry><entry>double arg, w_real, w_imag, wrecur_real, wrecur_imag, wtemp_real;</entry></row><row><entry></entry><entry>if(m != mstore) {</entry></row></tbody></tgroup><tgroup><colspec></colspec><tbody><row><entry>/* free previously allocated storage and set new m</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>if(mstore != 0) free(w);</entry><entry></entry></row><row><entry></entry><entry>mstore = m;</entry></row><row><entry></entry><entry>if(m == 0) return;</entry><entry>/* if m =0 then done */</entry></row></tbody></tgroup><tgroup><colspec></colspec><tbody><row><entry>/* n = 2**m = fft length */</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>n = 1 << m;</entry></row><row><entry></entry><entry>le = n/2;</entry></row></tbody></tgroup><tgroup><colspec></colspec><tbody><row><entry>/* allocate the storage for w</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>w = (struct complx *) calloc(le1,sizeof(struct complx));</entry></row><row><entry></entry><entry>if(!w) (</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>printf(*\nUnable to allocate complex W array\n*);</entry></row><row><entry></entry><entry>exit(1);</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>}</entry></row></tbody></tgroup><tgroup><colspec></colspec><tbody><row><entry>/* calculate the w values recursively */</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>arg = 4.0*atan(1.0)/le;</entry><entry>/* PI/le calculation */</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>wrecur_= w_real = cos(arg);</entry></row><row><entry></entry><entry>wrecur_imag = w_imag = −sin(arg);</entry></row><row><entry></entry><entry>xj = w;</entry></row><row><entry></entry><entry>for (j = 1; j < le ; j++) (</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>xj−>re = (float)wrecur_real;</entry></row><row><entry></entry><entry>xj−>im = (float)wrecur_imag;</entry></row><row><entry></entry><entry>xj++;</entry></row><row><entry></entry><entry>wtemp_real = wrecur_real * w_real − wrecur_imag * w_imag;</entry></row><row><entry></entry><entry>wrecur_imag = wrecur_real * w_imag + wrecur_imag * w_real;</entry></row><row><entry></entry><entry>wrecur_real = wtemp_real;</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>}</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>}</entry></row></tbody></tgroup><tgroup><colspec></colspec><tbody><row><entry>/* start fft */</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>le = n;</entry></row><row><entry></entry><entry>windex = 1;</entry></row><row><entry></entry><entry>for (l = 0; l < m; l++) (</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>le = le/2;</entry></row></tbody></tgroup><tgroup><colspec></colspec><tbody><row><entry>/* first iteration with no multiplies */</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>for(i = 0; i < n ; i = i + 2*le) {</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>xi = dat + i;</entry></row><row><entry></entry><entry>xip = xi + le;</entry></row><row><entry></entry><entry>temp.re = xi−>re + xip−>re;</entry></row><row><entry></entry><entry>temp.im = xi−>im − xip−>im;</entry></row><row><entry></entry><entry>tm.re = ci−>re xip−>re;</entry></row><row><entry></entry><entry>tm.re = xi−>im − xip−>im;</entry></row><row><entry></entry><entry>xip−>re = tm.re * u.re − tm.im + u.im;</entry></row><row><entry></entry><entry>xip−>im = tm.re * u.im + tm.im + u.re;</entry></row><row><entry></entry><entry>*xi  temp;</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>}</entry></row><row><entry></entry><entry>wptr = wptr + windex;</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>}</entry></row><row><entry></entry><entry>windex = 2*windex;</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>}</entry></row></tbody></tgroup><tgroup><colspec></colspec><tbody><row><entry>/* rearrange data by bit reversing *</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>j = 0;</entry></row><row><entry></entry><entry>for (i = 1 ; i < (n1) ; i++) (</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>k = n/2;</entry></row><row><entry></entry><entry>while(k >= j) (</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>j = j − k;</entry></row><row><entry></entry><entry>k = k/2;</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>}</entry></row><row><entry></entry><entry>j = j + k;</entry></row><row><entry></entry><entry>if (i < j) {</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>xi = dat + i;</entry></row><row><entry></entry><entry>xj = dat + j;</entry></row><row><entry></entry><entry>temp = *xj;</entry></row><row><entry></entry><entry>*xj = *xi;</entry></row><row><entry></entry><entry>*xi = temp;</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>}</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>}</entry></row></tbody></tgroup><tgroup><colspec></colspec><tbody><row><entry>}</entry></row><row><entry>/**************************************************************</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>/*** absolute( )  returns the absosulte value of its double</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>argment. ***/</entry></row></tbody></tgroup><tgroup><colspec></colspec><tbody><row><entry>double absolute(double arg)</entry></row><row><entry>{</entry></row></tbody></tgroup><tgroup><colspec></colspec><colspec></colspec><tbody><row><entry></entry><entry>if (arg >= 0) return arg;</entry></row><row><entry></entry><entry>else return −arg;</entry></row></tbody></tgroup><tgroup><colspec></colspec><tbody><row><entry>}</entry></row><row><entry>**************************************************************/</entry></row><row><entry></entry></row></tbody></tgroup></table></TABLECALS></TABLEUS>
Although specific features of this invention are shown in some drawings and not others, this is for convenience only as each feature may be combined with any or all of the other features in accordance with the invention. Other embodiments will occur to those skilled in the art and are within the following claims. For example, although the disclosure above relates in particular to inspecting tires after they have been retreaded, the system and method of this invention can be used to inspect tires before they are retreaded for retreading feasibility and/or to inspect tires generally after manufacture or during use.