findresonances We've made some changes. Use 'CtrlF5' to clear your browser cache.

Scroll Prev Top Next More 
Returns the frequency, decay constant, Qfactor, amplitude and phase of resonances extracted from the time trace of a purely real or complex signal within a frequency range \( [f_{\text{min}}, f_{\text{max}}] \) specified by the user. The findresonances script command uses the filter diagonalization method (see Ref. [1]) to approximate the time signal by a superposition of exponentially decaying harmonic oscillations of the form
$$ s(t) \approx \sum_{k=1}^{N} A_k \cos(2 \pi f_k t  \phi_k) e^{ \alpha_k t} \text{, for real signals}$$
$$ s(t) \approx \sum_{k=1}^{N} A_k e^{i (2 \pi f_k t  \phi_k)} e^{ \alpha_k t} \text{, for complex signals}$$
Here \( N \) is the number of resonances and each resonance is characterized by four realvalued parameters:
•\( f_k \): Resonance frequency.
•\( \alpha_k \): Decay constant, where \( \alpha_k \ge 0 \). Alternatively, the decay is described by the Qfactor \( Q_k = \omega_k / 2 \alpha \), where \( \omega_k = 2 \pi f_k \) is the corresponding angular frequency.
•\( A_k \): Amplitude.
•\( \phi_k \): Phase.
Additionally, findresonances returns an error estimate that can be used to identify spurious resonances reported by the script command. This estimate is a measure of relative confidence, i.e. it is only meaningful by comparison between the estimates for all resonances found. If the value of the error estimate for a resonance stands out as significantly larger than the rest, there is a higher chance that it is a spurious resonance.
Important notes:
•The signal to analyze should start only after all sources have stopped injecting energy into the system. When the rising part of the signal is not removed, findresonances may report spurious resonances and, in particular, wrong Qfactors.
•The longer the provided signal, the more accurate the reported modes will be. However, the Qfactors are much more sensitive to this than the resonance frequencies. It is often possible to obtain very accurate frequency information from only a few oscillation periods, while accurate Qfactors require significantly more data.
•To reliably find modes, they must be excited with sufficient energy in the simulation. It is important to make sure the excitation bandwidth is comparable to or larger than the frequency window \( [f_{\text{min}}, f_{\text{max}}] \).
•Results are more reliable near the center of the frequency interval \( [f_{\text{min}}, f_{\text{max}}] \). When scanning large frequency intervals, it can be useful to run findresonances with multiple overlapping frequency windows.
•Exciting a small frequency range helps to reduce the noise in the calculation. Therefore, for a careful analysis of a resonance with known frequency, excite the system with a narrow band pulse centered at the resonant frequency.
•This script command cannot find reliably resonances with very low Qfactor (\(Q \lesssim 10\)). Especially when there are modes with both high and low Qfactors, then the lowQ resonance will not be very accurate.
[1] V. A. Mandelshtam and H. S. Taylor, "Harmonic inversion of time signals and its application," J. Chem. Phys., vol. 107, no. 17, p. 67566769 (1997).
Supported Product: FDTD, MODE, DEVICE, INTERCONNECT 
Syntax 
Description 
out = findresonances(time, signal, frequency_interval); 
Returns the values of the resonance parameters (see description above) extracted from the signal vs. time data. The result out is a Nx6 realvalued matrix, where N is the number of resonances found within the range specified by frequency_interval. Each row contains [frequency, decay_constant, Q_factor, amplitude, phase, error_estimate]. If no resonances are found, the matrix out will be empty. The inputs time and signal must be onedimensional arrays; time must be realvalued, while signal can be real or complexvalued. The input frequency_interval is a realvalued array with two entries \( [f_{\text{min}}, f_{\text{max}}] \) bounding the frequency range for the search. 
Example
The following example shows how to extract the resonances from a superposition of two decaying sinusoidal signals. We sample the same signal over time intervals of different duration and show that the results are the same. For this simple analytical signal only a few oscillation periods are required to get accurate values for all the resonant parameters. In practice, more complicated signals (for example, a signal from a time monitor in a FDTD simulation) might require more oscillation periods, especially for accurate decay or Qfactor values, as explained above in Important notes. Finally, note that the error estimates for the two resonances are roughly within the same order of magnitude, so their reliability is comparable.
# Resonant frequencies, decay constants, amplitudes and phases of the analytical signal:
f1 = 1.765;
alpha1 = 0.005;
ampl1=1.3;
phase1 = 0.4;
f2 = 2.345;
alpha2 = 0.012;
ampl2= 0.45;
phase2 = 1.234;
# Time intervals of the signal:
t_long = linspace(0,20,201);
t_short = t_long(1:20);
# Signal:
signal_long = ampl1*cos(2*pi*f1*t_long  phase1)*exp(alpha1*t_long) + ampl2*cos(2*pi*f2*t_long  phase2)*exp(alpha2*t_long);
signal_short = ampl1*cos(2*pi*f1*t_short  phase1)*exp(alpha1*t_short) + ampl2*cos(2*pi*f2*t_short  phase2)*exp(alpha2*t_short);
# Find resonances:
res_long = findresonances(t_long, signal_long, [1.5,3]);
res_short = findresonances(t_short, signal_short, [1.5,3]);
# Plot signal and show results:
plotxy(t_long, signal_long, t_short, signal_short, "time", "signal");
legend("long signal", "short signal");
?"***Long signal***";
?"Resonant frequencies: " + num2str(transpose(res_long(:,1)));
?"Decay constant: " + num2str(transpose(res_long(:,2)));
?"Qfactor: " + num2str(transpose(res_long(:,3)));
?"Amplitude: " + num2str(transpose(res_long(:,4)));
?"Phase: " + num2str(transpose(res_long(:,5)));
?"Error estimate: " + num2str(transpose(res_long(:,6)));
?"***Short signal***";
?"Resonant frequencies: " + num2str(transpose(res_short(:,1)));
?"Decay constant: " + num2str(transpose(res_short(:,2)));
?"Qfactor: " + num2str(transpose(res_short(:,3)));
?"Amplitude: " + num2str(transpose(res_short(:,4)));
?"Phase: " + num2str(transpose(res_short(:,5)));
?"Error estimate: " + num2str(transpose(res_short(:,6)));
result:
***Long signal***
Resonant frequencies: 1.765 2.345
Decay constant: 0.005 0.012
Qfactor: 1108.98 613.92
Amplitude: 1.3 0.45
Phase: 0.4 1.234
Error estimate: 1.02591e015 1.07493e015
***Short signal***
Resonant frequencies: 1.765 2.345
Decay constant: 0.005 0.012
Qfactor: 1108.98 613.92
Amplitude: 1.3 0.45
Phase: 0.4 1.234
Error estimate: 3.13843e016 1.64344e015
See Also