# How to accurately estimate the quality factor of a noisy signal

I'm currently interested in measuring the quality factor of a noisy signal. For the purposes of example, consider a single degree of freedom mechanical system excited by white noise: $$$$\begin{bmatrix} \dot{x}_1 \\ \dot{x}_2 \end{bmatrix} = \begin{bmatrix} 0 & 1 \\ -\kappa & -\mu \end{bmatrix} \begin{bmatrix} {x}_1 \\ {x}_2 \end{bmatrix} + \begin{bmatrix} 0 \\ \dot{w}(t) \end{bmatrix},$$$$

where $$\dot{w}(t)$$ has 0 mean and a covariance of $$\langle w(t)w(t')\rangle = 2\sigma\delta(t-t')$$.

How is the quality factor accurately estimated in this system? I'm finding that as the number of averages increases, that the quality factor appears to decrease.

The system is implemented in MATLAB using the following code:


clear;
close all;

% system variables
mu = 0.1;
kappa = (2*pi)^2; % natural frequency of 1Hz

% integration variables
fs = 5; % sampling rate
tend = 1e4; % simulation length
ICs = [0;0]; % initial conditions
tSim = 0:(1/fs):tend; % integration points

% noise
fsn = 10; % noise sampling rate
tnoise = 0:(1/fsn):tend; % noise calculation points
sigma = 1e-2; % unscaled sigma
sigmaScale = sqrt(2*fsn*sigma); % scale sigma by noise sampling rate
rng(0,'v5normal'); % initialize random number generator for reproduceability
noiseMat = randn(length(tnoise),1); % calculate noise matrix
Fnoise = griddedInterpolant(tnoise,noiseMat,'cubic'); % calculate interpolation constants

% simulate system
[T,X] = ode45(@(t,x) dfe(t,x,mu,kappa)+sigmaScale*Fnoise(t)*[0;1],tSim,ICs);

%% plot

% number of windows
N_wind = round(logspace(0,3.5,8));

figure;
colororder(abyss(length(N_wind))); % set color order
for i = 1:length(N_wind)
% calculate psd estimate
[Ynorm,f] = pwelch(X(:,1),hanning(round(length(X(:,1))/N_wind(i))),0,[],fs);
plot(f,pow2db(Ynorm),'LineWidth',2)
hold on
end

xlabel('Frequency [Hz]')
ylabel('Amplitude')
set(gcf,'theme','light')
set(gcf,'color','white')

function dx = dfe(t,x,mu,kappa) %#ok<INUSD>

dx = [0 1;-kappa -mu]*x;

end


The results obtained by this code clearly demonstrate that the quality factor does, in fact, change. How should a "correct" value or some approximation thereof be obtained?

Edit: in response to TimWescott's comment: in the present context, quality factor refers to $$$$Q = \frac{f_r}{\Delta f},$$$$ where $$f_r$$ is the frequency of resonance and $$\Delta f$$ is the bandwidth at half the maximum power or ~3dB below the maximum power. The quality factor is a property of the resonator that should be able to be estimated from the time series data. I'll note that I'm ultimately interested in a nonlinear system, but I'm using a linear system for testing.

Since quality factor is being measured from the psd estimate, it would also be beneficial to obtain the 95% confidence interval for the quality factor, or, equivalently, the standard deviation. As the signal length gets longer and the number of averages increases, the standard deviation of the quality factor should approach 0, and the quality factor should converge to some finite value. Thus, I amend the question to include some method for obtaining the 95% confidence interval of the quality factor.

• You probably need a better spectral estimate. The problem with the periodogram is that there is massive variance. Derivatives like welch’s method solve this by averaging, but this massively reduces resolution, leading the true peak to lie on a smoother and broader curve than the periodogram. Capon’s method would likely give better results, I would guess. Commented Jan 28 at 19:32