# Detection of Troughs and Notches in a PPG Signal

I'm working a project which tries to determine Blood Pressure from PPG signals.I'm trying to extract the features as shown below...

I'm having problem in finding the troughs and dicrotic notch for each cycle and also the cycle start and end duration. Are there any manual method methods which can be applied ( I'm a newbie to signal processing )thereby which we can extract the trough and notch location in each cycle ?

• i hadn't seen this question before. are you confident that the notch will always be there with a slight bump to the right of the notch? what if the derivative never quite reaches zero? then where to you want to mark the notch time to calculate the Peak to Notch Time? – robert bristow-johnson Oct 25 '18 at 18:41
• Some words of caution; you will almost never see the textbook waveform shown. There will be huge variations in subject-to-subject signal quality, and the SNR is often negative. If your task is to solve an academic problem, then perhaps you will be given a collection of ideal waveforms, but as a real-life task, this is very difficult – Bob Dec 19 '19 at 20:19

Have you tried finding where the derivative of your signal is 0 (or crosses between positive and negative values)?

Simple, approximate, derivative filters are the first difference:

$y[n] = x[n] - x[n-1]$

and the central difference:

$y[n] = x[n] - x[n-2]$

You'll have to compensate for filter delay when mapping the zero crossings of the derivative back to the local minima and maxima of the original signal. For the first difference, the output is delayed by about half a sample period, and for the central difference, the output is delayed about a sample period.

• It might work for clean signals but as soon as noise is added, this will likely fail. – Ben Dec 19 '19 at 20:18
• Another reason why it's a bad idea : The behaviour of the derivative filter will change if one changes the sampling rate. I think cross-correlation is a more robust solution – Ben Apr 5 '20 at 15:19

I will try to answer your part of your question based on experience. Since, non ideal signals will contain noise you will have to remove it to some extent. For this you have two approaches:

• Moving Average filter= y[n] = $$\frac{1}L\sum_{k=0}^{L-1}x[n-k]$$ , where L is the window size of the filter, note that moving average filter is a comb filter and will attempt to attenuate frequency 'L' Hz and its integer multiples.
• Using a high pass filter(like backward difference operation, $$y[n]=x[n]-x[n-1]$$) of suitable order and subtracting the noise obtained from the PPG signal. Use this only if you are aware of the noise frequencies that may be involved, so that you can select a filter with appropriate cutoff frequency. Hence, it is best to go for moving average filter.
• Apart from high frequency noise, there might also exist a very low frequency noise called Baseline noise. You can remove it by using moving average of very low order and subtracting from ppg signal.

Now you can find cycle start and end duration using auto-correlation function. Auto-correlation means correlating signal with a delayed copy of itself. Equation wise- R($$\gamma$$)=$$\frac{\sum_{n=-\infty}^{+\infty}x[n].x[n-\gamma]}{R(0)}$$. In the equation x[n] is ppg signal and $$\gamma$$ is the delay which can vary from 0(no delay) to length of signal. When you plot auto-correlation function as function of $$\gamma$$, you will observe it is an sinusoidally decreasing function. Maximum occurs at no delay, because then you are correlating the signal with the exact itself. Your task would be to calculate the second maximum which indicates after how many shifting of samples, you got a strong similarity. That index value will give you the cycle duration. Once you have the cycle duration you are done. I implemented it for my lab and if you want to get an idea, here is the link to source code:Autocorrelation in Arduino Due

• For the record, there are way more than 2 approaches. One could use averaging , to average the cycles to decrease the noise and facilitate feature extraction for example. This is not the same as a moving-average filter. – Ben Apr 5 '20 at 15:20