Wednesday 22 April 2015

convolution - Exponential average with time constant of slow, fast and impulse


I have been studying about exponential average. There are enough explanations about this at Internet, but they do not explain about the time constant.


I have one channel with a $T$ seconds time signal with sampling frequency $f_s$.


If I want to do average of this time signal, we need to use either linear or exponential method. Linear average method is quite simple so there is no trouble for applying. However, if I try to apply exponential average method, there are some problems.


If time signal varies quickly, we prefer to use fast time constant 125 ms. Also, the time signal varies slowly, using 1000 ms of slow time constant is better, but in this situation, I do not know how can I apply this time constant with time signal.


Is there any explanation or any example for doing exponential average with time constant?



Answer



Exponential averaging is performed using a first order IIR filter according to the difference equation: \begin{equation} y[n] = (1-\alpha)\;x[n]+\alpha \; y[n-1] \end{equation} where $x[n]$ and $y[n]$ are the input and output signals at time $n$ and the value of the single coefficient $\alpha$ is given by the equation: \begin{equation} \alpha = \exp( \frac{-1}{f_s \tau} ) \end{equation} where $f_s$ is the sampling frequency and $\tau$ is the time constant.


In this light, it can be seen that exponential averaging filters are simply low-pass filters, the roll-off of which is -6dB/oct. The only free parameter is the cut-off frequency, which is specified by the time constant. Longer time constants will yield a lower cut-off frequency, as can be see in the Matlab code and plot below.



figure; hold all
fs = 8000;
tau = 10.^(-1:-1:-4);
alpha = exp(-1/fs./tau);
color = 'brgc';
for index = 1 : length( alpha )
[Hz fVec] = freqz( [1-alpha(index)], [1 -alpha(index)], 8192, fs );
plot( fVec, 20*log10(abs(Hz)), color(index), 'LineWidth', 2 );
legText{index} = sprintf( '$\\tau = 10^{%d}$', log10(tau(index)) );
end

hLeg = legend(legText,3);
set( hLeg, 'interpreter', 'latex' );
axis( [8000/8192 4000 -70 10] )
ylabel('Amplitude [dB]')
xlabel('Frequency [Hz]')
set( gca, 'xscale', 'log' )

Different exponential averaging filters.


Notice the parallel -6dB/oct slopes (characteristic of single pole filters) and the falling cut-off frequency with lengthening time constants.


The correct choice of time constant depends on how fast the variation of the desired average is. In order to capture a quickly varying mean, only signal content above the fastest frequency of variation should be attenuated -- the time constant should be chosen accordingly. This means that if the signal mean varies very slowly, long time constants are needed, and vice versa. I find that trial and error works best to determine the optimal value, but formulas to calculate the cut-off frequency do exist, e.g. see this link.



Good luck!


No comments:

Post a Comment

readings - Appending 内 to a company name is read ない or うち?

For example, if I say マイクロソフト内のパートナーシップは強いです, is the 内 here read as うち or ない? Answer 「内」 in the form: 「Proper Noun + 内」 is always read 「ない...