I need to divide an audio signal into frames in which the signal can be assumed to be stationary. How can I measure whether an audio signal is stationary in a frame?
-
$\begingroup$ There is an overwhelming amount of research and literature on this topic. What a priori knowledge do you have about your signal? For instance if your source is music you might want to do song segmentation. If you are dealing with seismic data you are interested in different aspects. $\endgroup$– André BergnerCommented Apr 1, 2013 at 10:21
-
$\begingroup$ I am working with underwater recordings e.g. containing marine animals. The recordings contain noise and have a 2000Hz sample rate. My goal is to perform binary classification of the records, and the signal of interest starts at approx. 100Hz and raises to 250 Hz over 1-2 seconds. $\endgroup$– MortenCommented Apr 1, 2013 at 10:50
-
$\begingroup$ My hope is some formula that express the how stationery a signal is - any ideas? $\endgroup$– MortenCommented Apr 1, 2013 at 10:58
-
2$\begingroup$ The question is, what do you mean with 'how stationary the signal is'? There is a clear definition of stationarity. And you'll find plenty of literature on measuring it if you dig a bit. Or do you want to identify certain parts of interest in your signal as you wrote. But than you have to look/ask for signal classification/identification or pattern recognition. That are two different things. $\endgroup$– André BergnerCommented Apr 5, 2013 at 20:08
2 Answers
I'm a DSP student and perhaps this is not the most complete answer. I have to answer the same question in a partial work and this is what I got so far:
As said by André pure stationary signal is a signal in which mean and variance does not change in time. In nature (real life, man interpreted music, etc.) this is very hard to find.
So you may:
- Visualize the signal in an spectrogram. If the signal is stationary the signal will appear as horizontal bars of same intensity in the spectrogram:
Even in this signal, made from a filtered white noise and a tone the media and the variance changes a little in time.
So, split the segments of your signal under test to find the whether the media and variance doesn't change 'much'. How 'much' depends on you:
% test for stationary B xnbf = buffer(signal,100); mxn = mean(xnbf); sxn = std(xnbf); figure; errorbar(mxn, sxn, 'o'); title('Signal A')
Also, check this link, which includes a comprehensive list of methods to test whether a process is stationary or not: https://quant.stackexchange.com/questions/2372/how-to-check-if-a-timeseries-is-stationary
% test for stationary B
xnbf = buffer(signal,100);
mxn = mean(xnbf);
sxn = std(xnbf);
figure; errorbar(mxn, sxn, 'o'); title('Signal A')
In the above code the mean and the variance should be calculated on the xnbf
instead of signal