Frequency Domain System Identification Toolbox for MATLAB
The FdIdent toolbox provides tools for frequency domain model identification and validation. A user-friendly GUI is also available to guide the user through the system identification steps:
- Design of optimized periodic excitation signals (multisine, binary, three-level) and optimized Discrete Interval Binary Signals (DIBS) signal generation.
- Identification of continuous-time or discrete-time systems with unknown delay.
- Model order selection.
- Model validation, including simulation, calculation of residuals, and test of cost functions.
- Calculation of confidence intervals of amplitude/phase and poles/zeros.
- Model conversion to and from the Control System Toolbox and System Identification Toolbox objects.
Frequency domain methods support continuous-time modeling, which can be a powerful and highly accurate complement to the more commonly used discrete-time methods. The methods in the toolbox can be applied to problems such as the modeling of electronic, mechanical, and acoustical systems.
Case Studies
Synchronous Motor Impedance Identification
Flexible Robot Arm Modeling
Aircraft Cabin Noise Analysis
Frequently Asked Questions (FAQ)
What is the difference between black-box and first principles modeling?
Black-box modeling relies on data-driven approaches where the internal structure is not explicitly defined. First principles modeling uses fundamental physical laws and equations to describe system behavior.
In summary, key differences:
- Knowledge requirement: first principles requires domain expertise; black-box needs mainly data
- Transparency: first principles offers a clear physical interpretation; black-box operates as a "black box"
- Data dependency: first principles needs minimal data; black-box requires extensive datasets
- Computational complexity: first principles often involves solving differential equations; black-box focuses on parameter estimation
Therefore, first principles modeling is preferred when physical understanding is critical, while black-box modeling excels when the system is too complex to model from first principles or when sufficient data is available.
How can I identify a stable system?
Making a good fit with stable poles is sometimes rather difficult. First of all, it is quite likely that the data themselves contain details that drive the identification routine to an unstable fit, which is otherwise the best available in an LS sense. In other words, an unstable model is the best approximation within the given data quality. This means that the data are not good enough to guarantee stability. E.g., in case of slight nonlinear distortions, the best linear approximation might be non-stable indeed.
In summary, possible reasons for unstability:
- nonlinearities
- a special pattern of noise
- too simple a model for a complex system
- unstability of the system itself (an unstable system can be measured within a stabilizing feedback loop)
- local minimum found (very rare)
Therefore, making repeated and improved measurements (better SNR, odd multisine, etc) is the first advice.
In the identification of high-order systems, there is a good chance that some poles will be driven to the unstable region by the noise or by slight nonlinearities. A natural instinct of a researcher is to try to eliminate these poles. Unfortunately, this is usually not a remedy. Eliminated poles may leave a bad fit that cannot be corrected anymore.
The Frequency Domain System Identification Toolbox offers some (artificial) tools to force stable solutions. However, we want to emphasize that these are artificial solutions: even reaching the best stable fit is not guaranteed. However, weakly defined poles (overmodeling) may be effectively driven to the stable region.
Command line
- Request in ELiS that it stabilizes all the poles by reflection or contraction. See "help elis", "elis runmod"
- In order to avoid that stabilization destroys the fit, if you are looking for minimum phase zeros, also request the reflection/contraction of the zeros
- Along with stabilization, allow the delay to be free
- Experiment with different starting values of the delay - usually, there is a delay value which makes the fit stable
- After an unstable fit with ELiS(use the new form, see "help elis"), execute stabmod=stable(model,'with-zeros');
Graphical User Interface
- Switch User level to Advanced, and request stabilization in elis, with the above options
- Write a vector of starting values into the delay field (works both with fixed or variable delay)
In high-order mechanical systems, the system equations may be poorly conditioned. This may cause unstability again. A possible remedy is to switch to orthogonal polynomials.
- GUI: choose "Improved numerical stability" in the "Estimate Plant Model" window
- command line: see "elis runmod".
How can I remove the effect of a known subsystem from the data?
Sometimes a part (maybe some poles) of the system are almost perfectly known, and it is necessary to identify only the rest of the dynamics. In this case, we can remove the effect of these poles/zeros from the data.
We enclose a self-explanatory example.
%%%%% 1. PREPARATIONS %%%%% % Close all windows first, and clear previous data: close all, clear, figure(1)
% Define full system model: model = fidmodel('s',real(poly([1+j,1-j])),real(poly([-1-j,-1+j,-0.1,-0.5]))); plot(model) %plot original model

% Define helper data object for simulation: Fdat = fiddata(NaN*ones(10,1),ones(10,1),[0.05:0.05:0.5]); Fdat.SisoVariance = [0.001,0.001];
% Simulate noisy measurement: data = simfou(model,Fdat);
% Plot simulated data (simulated from original model) figure(2), plot(data), figure(3)


%%%%% 2. MAIN PART %%%%% model_est = elis(data,'s',2,4); % Estimate original model model_known = fidmodel('s',1,real(poly([-0.1]))); % Known subsystem datam = data/model_known; % Modify data, remove effect of one pole % Plot modified data: figure(4), plot(datam); figure(5), model_partial = elis(datam,'s',2,3); % Estimate remaining model


How shall I generate time domain data objects from my measured data?
Generating time domain data objects
When the data are available as workspace variables or ASCII files or variables in MAT-files, the "Compose" command in the "Read Time Domain Data" block allows to easily assemble them. The fields of the Compose window can be filled in with valid MATLAB commands, like variables, subscripted variables like data(:,2), or special file references (use "Browse" at the appropriate places). When assembling the objects, the function checks the data, ensures they are consistent, and gives warning if they are not.
A special call allows the independent use of the Compose window:
fdtool('callback','compinp','init1') %compose time domain objects
In the time domain, automatic determination of the period length, the excitation frequencies, and the Fourier coefficients is provided. However, setting the first two or at least the second one properly can improve speed and calculation accuracy. So, if you can, do not forget to fill in the "Frequencies" and/or the "PeriodLength" property, e.g.
data.frequencies = 1/0.03*[1:2:15]; data.periodlength = 0.03;
If the data from more than one experiment is used and measurements are properly synchronized, the property "synchronization" should be set:
data.synchronization=’on’;
Otherwise, unnecessarily long processing time may be wasted later, during the execution of the "Variance Analysis" block.
Sample programs for preparing a load
Simple example
Let us assume first that we have measured 4096 time domain samples, which are stored in the vectors inp and outp. The sampling frequency is fs = 40960 Hz, and the period length in each signal is Tp = 1/80 s (there are 8 periods). The frequency content is fv = [1:2:15]/Tp.
%Make the object: obj = tiddata(outp,inp,1/40960); %Set some properties: obj.periodlength = 1/80; obj.frequencies = [1:2:15]/80; get(obj) %check properties
The variable obj can now be imported to the "Read Time Domain Data" block.
Multiple experiments
As a more complex example (multiple experiments), let us assume that we have measured five times 1024 time domain samples stored in the 1024 x 5 arrays inp and outp. The sampling frequency is fs = 40960 Hz, and the period length in each signal is 1/160 s (there are 4 periods in each record).
%First prepare the data in 1 x 5 cell arrays: u = num2cell(inp,1); y = num2cell(outp,1); %Now make the object: obj = tiddata(y,u,1/40960); %Set some properties: obj.periodlength = 1/160; obj.synchronization=’on’; get(obj) %check properties
The variable obj can now be imported to the "Read Time Domain Data" block.
How shall I deal with frequency response function data?
It may happen that we need to start identification from frequency response function (FRF) data: magnitude (gain) and phase. The fdident toolbox is able to deal with these. Here are some possibilities to illustrate how it works.
When the data are available as workspace variables or ASCII files or variables in MAT-files, the "Compose" command in the "Read Frequency Domain Data" block allows to easily assemble them. The fields of the Compose window can be filled in with valid MATLAB commands, like variables, subscripted variables like data(:,2), or special file references (use "Browse" at the appropriate places). When assembling the objects, the function checks the data they ensures it is consistent, and gives warnings if they are not.
Especially for FRF data, set the "Data type" menu item to the proper value. The amplitudes are either in dB-degrees vectors, or in complex form.
A special call allows the independent use of the Compose window:
fdtool('callback','compinp','init2') %compose frequency domain objects
Command-line solution
1.) Define the data to be able to run this sequence
In practice, data often arrive in ASCII files. In such a case, load these data into MATLAB, and form vectors.
See 'help load' or 'help loadasc'.
load data.txt -ascii
Now you have an array which corresponds to the table
The following 3 lines are just preparations for simulation, not needed for true data:
F=20; freqv=[1:F]'/F*1e3; % Frequency vector (NOT radian frequencies), 1/20 kHz steps jomega=j*2*pi*freqv; K=2e-4; % Time constant in seconds tf=1./(1+jomega*K); % Complex amplitudes, 1st order system

tf_mag = abs(tf); % Magnitude vector tf_mag_dB = 20*log10(tf_mag); % Magnitude vector in decibels tf_phase = angle(tf); % Phase in radians tf_phase_degrees = tf_phase/(2*pi)*360; % Phase in degrees U = ones(size(tf_mag)); % The input amplitudes are all equal to one with zero phase Y = tf_mag.*exp(j*tf_phase); % Complex output Fourier amplitudesor, starting from dB-degrees data:
Y = 10.^(tf_mag_dB/20).*exp(j*tf_phase_degrees/360*2*pi);
2.) Now form an object from the data.
We will use here freqv, Y, and U.dat = fiddata(Y,U,freqv);If you have several repeated experiments:
dat = fiddata({Y1,Y2,...,YN},{U,U,...,U},freqv);If you have variance data of the Fourier amplitudes (scalars or vectors):
dat.variance=[varY,varU]; %variance column vectors, to prepare the fitIf the variances are not known, you may leave the variances empty.
Remark
Advanced users may also use the coherence data instead to obtain approximate variances, assuming that small coherence is caused by noise alone.
If these are in the vector 'cohvect',
vartf=coh2var(cohvect,Y./U); dat.variance=[vartf,zeros(size(U))];
Warning! Make sure that no measured coherence is over 1 (this might happen in some instruments because of roundoff errors).
3.) Make an estimation
figure(2); model=elis(dat,'s',0,1);
Solution with the GUI
Alternatively, a quick way when you already have an fiddata object:
- start fdtool,
- open the block "Read Frequency Data", and import your data from the workspace, then push "Close",
- if you are at Automatic Userlevel (see menu "UserLevel" in the main window), the block "Estimate Plant Model" will automatically open up,
- if you are at Interactive Userlevel (see menu "UserLevel" in the main window), open the block "Variances and/or Averaging", push "Execute", push "Close", and open the block "Estimate Plant Model".
- select proper numerator and denominator orders and make a fit.

How shall I average several experiments with changing (maybe random) phases?
When nonlinearities may be present, making several multisine experiments with changing (random) phases in each experiment is a good practice. In this case, varanal cannot be used without special manipulations, since the changing phases cannot be brought to the same position.
There are two solutions to tackle this problem.
Correcting phases one by one
When generating the excitation signal, you have the phases of each sine. Let us denote the vector of phases in radians by phases. Here is a sample program for each experiment.
tdati = tiddata(yi,ui,Ts); tdati.frequencies = freqvect; Fdati = tim2fou(tdati); Fdati.output = exp(-j*phases).*Fdati.output; Fdati.input = exp(-j*phases).*Fdati.input;
Now the phases are not influenced by the excitation:
Fdatall = merge(Fdat1,Fdat2,...); % Multiple experiments Fdatall.synchronization = 'on'; % Tell varanal to simply average Fdat = varanal(Fdatall); % This can be used by elis or by the GUI
Convert data to FRF
Another possibility is to convert the data to FRF = Y/U. By this, the Gaussian nature of the noise is somewhat violated (not much for good input SNR), and the variance of Y/U is approximated, but usually this is not a big problem.
Do this for each experiment:
tdati = tiddata(yi,ui,Ts); tdati.frequencies = freqvect; Fdati = tim2fou(tdati); Fdatfrfi = stdtfm(Fdati); Fdatall = merge(Fdatfrf1,Fdatfrf2,...); % Multiple experiments Fdatall.synchronization = 'on'; % Tell varanal to simply average Fdat = varanal(Fdatall); % This can be used by elis or by the GUI
How can I prepare and send a report on the toolbox?
If you
- have suggestions or remarks on the FdIdent toolbox,
- want to ask something
- want to ask for the correction of a bug you seem to have found,
the quickest and most effective procedure is as follows.
Report on the GUI
Start the gui (fdtool), and open the Action Recorder. You can record your GUI actions with it. Then, after STOP, you can save the history record into a MAT-file. This can be replayed anywhere under the fdident toolbox, if you carefully follow the guidelines below.
If you want your actions to be reproducible by the developers, the GUI shall be started from exactly the same state. Therefore, at the beginning of each history record, we suggest doing a precise GUI status setting. Please push RECORD, and do the following.
- "File / Clear / Whole GUI" (set standard starting status), and
- "UserLevel: Interactive", or "UserLevel: Automatic", or "UserLevel: Advanced", as you prefer.
Now you can record your actions. When you are ready, push STOP, then select "File / Save history as...", and give it a file name with the extension .mat .
It is also possible to automatically load your data (e.g. from a MAT-file) to the workspace before your actions. To do this, push STOP after setting the UserLevel (and before recording your actions), select in the recorder "Edit / Insert MATLAB Command", and in the field "Param" type 'load <mydata>.mat'. Now push PLAY to really execute the load command. After this, and pushing RECORD, you can record your actions.
It is also possible to insert the load command later. Write e.g. number 3 into the Index field of the recorder, push <Enter>, select in the recorder "Edit / Insert MATLAB Command", and then insert the load command into the field "Param". It will be inserted before action 3.
You can also extend the history file to send more information. If you click on "Pause" at an action, later the history file will stop running before this action. You can even type your comments into the big edit box, and the developers will see them when reproducing. After editing, do not forget to save the history file again.
You might have also introduced some superfluous actions during recording. Please delete these (Edit / Delete menu item - this acts on the current action). After getting more familiar with the recorder, you can even insert actions into a history: go to the action you want to make insertion before, push RECORD, and do your recording. Edit / Cut and Edit / Paste also work for history actions.
To be totally sure that your history can be reproduced elsewhere, please
- save the history into a mat-file, and
- execute the following commands:
fdtool exit force % close all GUI-related windows
fdtool quick % this starts the GUI without any local settings
runhist <historyfilename>.mat
Please write an email to fdident@x2con.com with a short description of the problem, and also give the results of the following commands (exact reproduction may depend on using the same toolbox and Matlab versions, moreover, common error sources can often be localized by these informations):
version
computer fdident version fdident license which elis -all elis date
Attach the history file prepared above, attach the MAT file with the data (if you have some), and send the email.
Report on the command-line toolbox
Making a report on the command-line toolbox may be even easier. Please write a short M-file that reproduces the problem or question. Please write an email to fdident@x2con.com with a short description of the problem, and also give the results of the following commands (exact reproduction may depend on using the same toolbox and Matlab versions, moreover, common error sources can often be localized by these informations):
version computer fdident version fdident license which elis -all elis date
Attach the M-file, and also the MAT-file with the data (if you have some), and send the email.
Frequency Domain System Identification Toolbox
Software License Agreement
×
This software, the Frequency Domain System Identification Toolbox for MATLAB® (the "Program"), which contains now a graphical user interface and data/model object handling is being licensed for use with MATLAB. MATLAB is a registered trademark of The MathWorks, Inc.
Conditions (liability, etc.) are listed below.
GENERAL TERMS
LICENSE GRANT. By accepting the registration, X2 Consulting Ltd. grants to Licensee a nonexclusive license to install and use the Program(s) as provided by the installation procedure. The licensed Program is, and shall at all times remain, the property of the copyright holders and/or its licensors, and Licensee shall have no right, title, or interest therein, except as expressly set forth in this Agreement.
INSTALLATION AND USE. By accepting the terms and conditions of the Agreement, Licensee accepts the applicable rights and agrees to be bound by the applicable obligations and restrictions of the License Option purchased earlier.
License Options.
Individual License. The Program may be installed and operated on a single designated computer.
Group License. The Program may be installed and operated on a designated number of computers (up to the number of Group Copies purchased). Licensee shall accurately administer, count, and control the number of copies of each licensed Program installed.
Concurrent License. The Program may be installed on a single network server, and, where appropriate, portions of the Program on individual computers to accelerate startup times, so long as the installations on the individual computers are controlled by the license manager on the single network server. Licensee may have as many sessions of a Program in use at any given time as the number of Concurrent Copies purchased.
Classroom License. Program licensed to degree-granting educational institutions at X2 Consulting Classroom License discount are restricted to use in connection with on-campus computing facilities that are used solely in support of classroom instruction of students. The right to use the Program for any other purposes, including commercial purposes, is expressly prohibited.
Student License (Student versions of the Program or any Program licensed at a student discount). Student Licenses are restricted to use on the student's own computer. Student Licenses are further restricted to use in connection with courses offered by degree-granting institutions, either by students working toward a degree, or by continuing education students. The right to use the Program for any other purposes, including commercial purposes, is expressly prohibited. Notwithstanding anything to the contrary contained in this Agreement, Student Licenses are nontransferable. Maintenance and Support are not provided with the Student License.
Installation and rights
The Program may be installed on a backup computer (while the designated computer is disabled) or on a replacement computer. Replacements include both permanent and temporary use at the same or different site. Temporary use at a different site may include installation for use at home by Licensee's employees, provided Licensee permits such home use and Licensee otherwise complies with the terms of this Agreement and causes its employees to so comply, including full compliance with all applicable laws and regulations relating to import and export of technical data and computer software.
Licensee may not sell, license, sublicense, rent, or make the Program available for use by any Third Parties.
Licensee shall not provide access to the Program via a Web application without procuring specific rights to do so.
Licensees of the Concurrent License option are prohibited from providing Program access to users located outside the country in which the license manager server is installed.
Licensee shall not provide multi-user access to the Program by calling the Program as a server from other program without procuring specific rights to do so.
Licensee may make backup copies of the Program as necessary to support the use of the Program in accordance with this Agreement. Licensee may not remove any copyright, trademark, proprietary rights, disclaimer or warning notice included on or embedded in any part of the Program. All copies of Program shall contain all copyright and proprietary notices as in the original.
Licensee shall not attempt to access or use Program that Licensee is not currently licensed to use.
Special conditions by geographical area
EUROPEAN UNION: Except as expressly provided by this Agreement, Licensee may not alter or modify the Program without the consent of the copyright holders. In particular, Licensee may not alter, adapt, translate, or convert 'M-files' or 'P-code' contained in the Program in order to use those files with any products other than products of The MathWorks, nor may the Licensee incorporate or use 'M-files', 'P-code' or any other part of the Program in or as part of another computer program.
All copies of the Program and Documentation, whether made by Licensee or otherwise, shall be subject to the terms of this Agreement.
Licensee shall take appropriate action by instruction, agreement, or otherwise with any persons permitted access to the Program, so as to enable Licensee to satisfy its obligations under the terms of this Agreement.
FEDERAL ACQUISITION: This provision applies to all acquisitions of the Program and Documentation by or for the federal government of the United States. By accepting delivery of the Program, the government hereby agrees that this software qualifies as 'commercial' computer software within the meaning of FAR Part 12.212, DFARS Part 227.7202-1, DFARS Part 227.7202-3, DFARS Part 252.227-7013, and DFARS Part 252.227-7014. The terms and conditions of this Agreement shall pertain to the government's use and disclosure of the Program and Documentation, and shall supersede any conflicting contractual terms or conditions. If this license fails to meet the government's minimum needs or is inconsistent in any respect with federal procurement law, the government agrees to return the Program and Documentation, unused, to X2 Consulting Ltd.
Conditions
LIMITED WARRANTY/LIMITATION OF REMEDIES. X2 Consulting Ltd. warrants that X2Con, or its licensors has the right to grant the license rights hereunder. X2Con warrants that the downloadable file on the server will be free of errors, or it will be replaced by X2Con upon notification from the Licensee. X2Con further warrants, for a period of one (1) year from delivery, that each copy of each Program will conform in all material respects to the description of such Program's operation. In the event that the Program does not operate as warranted, Licensee's exclusive remedy and X2Con sole liability under this warranty shall be a) the correction or workaround by X2Con of major defects within a reasonable time, or b) should such correction or workaround prove neither satisfactory nor practical, termination of the relevant license and refund of the purchase fee paid to X2Con for the Program. All requests for warranty assistance should be directed to X2 Consulting Ltd., Budapest, Hungary, X2con@x2con.com. EXCEPT AS EXPRESSLY PROVIDED BY THIS AGREEMENT (OR AS IMPLIED BY LAW WHERE THE LAW PROVIDES THAT THE PARTICULAR TERMS IMPLIED CANNOT BE EXCLUDED BY CONTRACT), ALL OTHER CONDITIONS, WARRANTIES, OR OTHER TERMS (INCLUDING ANY WITH REGARD TO INFRINGEMENT, MERCHANTABLE QUALITY, OR FITNESS FOR PURPOSE) ARE EXCLUDED. SOME STATES DO NOT ALLOW LIMITATIONS ON HOW LONG AN IMPLIED WARRANTY LASTS, SO THE ABOVE LIMITATION MAY NOT APPLY TO LICENSEE. THIS WARRANTY GIVES LICENSEE SPECIFIC LEGAL RIGHTS AND LICENSEE MAY ALSO HAVE OTHER RIGHTS WHICH VARY FROM STATE TO STATE. LICENSEE ACCEPTS RESPONSIBILITY FOR ITS USE OF THE PROGRAM AND THE RESULTS OBTAINED THEREFROM.
LIMITATION OF LIABILITY. THE PROGRAM SHOULD NOT BE RELIED ON AS THE SOLE BASIS TO SOLVE A PROBLEM WHOSE INCORRECT SOLUTION COULD RESULT IN INJURY TO PERSON OR PROPERTY. IF A PROGRAM IS EMPLOYED IN SUCH A MANNER, IT IS AT THE LICENSEE'S OWN RISK AND X2Con EXPLICITLY DISCLAIMS ALL LIABILITY FOR SUCH MISUSE TO THE EXTENT ALLOWED BY LAW. X2Con'S LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM NEGLIGENCE OR FOR ANY OTHER MATTER IN RELATION TO WHICH LIABILITY BY LAW CANNOT BE EXCLUDED OR LIMITED SHALL NOT BE EXCLUDED OR LIMITED. EXCEPT AS AFORESAID, (A) ANY OTHER LIABILITY OF X2Con (WHETHER IN RELATION TO BREACH OF CONTRACT, NEGLIGENCE OR OTHERWISE) SHALL NOT IN TOTAL EXCEED THE AMOUNT PAID TO X2Con UNDER THIS AGREEMENT IN THE TWELVE MONTH PERIOD PRECEDING THE CLAIM IN QUESTION, FOR THE PROGRAM WITH RESPECT TO WHICH THE LIABILITY IN QUESTION ARISES, AS INSTALLED ON THE DESIGNATED COMPUTER(S) OR DESIGNATED SERVER(S) FOR WHICH USE OF THE PROGRAM IS LICENSED HEREUNDER; AND (B) X2Con SHALL HAVE NO LIABILITY FOR ANY INDIRECT OR CONSEQUENTIAL LOSS (WHETHER FORESEEABLE OR OTHERWISE AND INCLUDING LOSS OF PROFITS, LOSS OF BUSINESS, LOSS OF OPPORTUNITY, AND LOSS OF USE OF ANY COMPUTER HARDWARE OR SOFTWARE). SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THE ABOVE EXCLUSION OR LIMITATION MAY NOT APPLY TO LICENSEE.
MAINTENANCE AND SUPPORT. If the Licensee is registered, X2 Consulting Ltd. shall, through the developers: deliver subsequent releases of the Program that are not charged for separately; exert reasonable efforts to both (a) provide, within a reasonable time, workarounds for any material programming errors in the current release of the Program that are directly attributable to the developers, and (b) correct such errors in the next available release, provided Licensee provides the developers with sufficient information to identify the problems. During this same term, Licensee shall also be entitled to receive technical support by telephone, fax or electronic mail regarding the installation and/or use of the Licensed Program and their interaction with hardware, operating environments, and other software products. X2Con, Inc. reserves the option to discontinue, in whole or in part, offering maintenance and support. In such a case, Licensees registered no earlier than 6 months before discontinuing maintenance and support, may request refund of the purchase price.
TERM. This Agreement shall continue until the earlier of (a) termination by X2 Consulting Ltd. or Licensee as provided below, or (b) such time as there are no Program being licensed to Licensee hereunder.
For Student Licenses: The Student License term extends only for the duration of Licensee's enrollment in a degree-granting institution or participation in a continuing education program of a degree-granting institution.
ACCEPTANCE PERIOD. Licensee may receive a full refund if within thirty (30) days from the date of delivery (the 'acceptance period') licensee does not accept the terms and conditions of this license and the applicable addendum, or if licensee terminates this license for any reason, within the acceptance period.
DOCUMENTATION. The user guides and instructional material, if any, accompanying delivery of a Program as may be updated from time to time. Documentation may be delivered in hard copy and/or electronic format.
TERMINATION. X2Con, Inc. may terminate this license grant, by written notice to Licensee if Licensee breaches any material term of this license, including failure to pay any purchase price due, and Licensee has not cured such breach within sixty (60) days of written notification. Licensee may terminate this license at any time, for any reason. Licensee shall not be entitled to any refund if this license is terminated, except for purchase prices paid for any Program for which the Acceptance Period has not expired at the time of termination. Upon termination, Licensee shall promptly return all but archival copies of the Program and Documentation in Licensee's possession or control, or promptly provide written certification of their destruction.
TAXES, DUTIES, CUSTOMS. Absent appropriate exemption certificate(s), Licensee shall pay all taxes, duties, or customs, except for taxes based on X2Con net income.
ASSIGNMENT. This license is nontransferable to a Third Party without X2Con consent, which shall not be unreasonably withheld. This license may be transferred to an Affiliate provided that X2Con is notified in writing of the transfer and the Affiliate accepts these same terms and conditions.
GENERAL. To the extent any law, treaty, or regulation is in conflict with this Agreement, the conflicting terms of this Agreement shall be superseded only to the extent necessary by such law, treaty, or regulation. If any provision of this Agreement shall be otherwise unlawful, void, or otherwise unenforceable, that provision shall be enforced to the maximum extent permissible. In either case, the remainder of this Agreement shall not be affected. The parties agree that the U.N. Convention on Contracts for the International Sale of Goods shall not apply to this Agreement. This Agreement contains the entire understanding of the parties and may not be modified or amended except by written instrument, executed by authorized representatives of X2 Consulting and Licensee.