# Filtering and peak finding

I have an observed signal which is the norm of the sum of two 3-vectors: $$S(t) = || \mathbf{A}(t) + \mathbf{B}(t) ||$$ Now, I have full knowledge of the vector $$\mathbf{A}(t)$$, $$\mathbf{A}(t) = \pmatrix{A_1(t) \\ A_2(t) \\ A_3(t)}$$ i.e. I know each of the components $$A_i(t)$$. The signal $$\mathbf{B}(t)$$ is unknown, and $$S(t)$$ is what I observe. Now the signal $$\mathbf{B}(t)$$ has peaks, particularly in the $$B_1(t)$$ component, and my goal is to determine the position of these peaks. I don't care about the amplitude of the peaks, I only want the position (time).

So what I need to do is somehow filter out the signal $$\mathbf{A}(t)$$ from the observed signal $$S(t)$$ and then apply a peak detection algorithm on the residual signal. My question is whether it is possible to do this?

As a simple example, I made a matlab script to construct synthetic data as follows: $$\mathbf{A}(t) = \pmatrix{ X(t) \\ Y(t) \\ 0}$$ $$\mathbf{B}(t) = \pmatrix{ G(t) \\ 0 \\ 0}$$ where $$X(t) = \sin{(2 \pi (f/4) t)}$$, $$Y(t) = \sin{(2 \pi f t)}$$, and $$G(t)$$ is a single Gaussian peak. The signals and matlab script are given below. As you can see, it is not easy to tell that there is a peak in my observed signal at $$t = 500$$ as there is in the unknown signal $$G(t)$$.

So is it possible to filter $$S(t)$$ to remove $$\mathbf{A}(t)$$ and clearly find the peaks in $$\mathbf{B}(t)$$?

N = 1000;
t = [1:N];

f = 20;
X = sin(2*pi*(f/4)*t/N);
Y = sin(2*pi*f*t/N);

G = gausswin(N, 100.0);
Z = zeros(1,N);

A = [ X ; Y ; Z];
B = [ G' ; Z ; Z ];
C = A + B;

signal = vecnorm(C);

figure

subplot(4,1,1);
plot(t,X);
title('Known X');

subplot(4,1,2);
plot(t,Y);
title('Known Y');

subplot(4,1,3);
plot(t,G);
title('Unknown signal G');

subplot(4,1,4);
plot(t,signal)
title('Observed signal');


Generally, this should not be possible because:

• you project a 3D information onto a 1D signal, and the system is underdetermined in general,
• you add a non-linearity (the norm), that further hinder restoration.

However, using the triangle inequality, you can bound $$B$$ from below:

$$\|A+B\| \le \|A\|+\|B\|$$

hence

$$B_{\inf} =\max(\|A+B\| -\|A\|,0)\le \|B\|$$

In the example you gave, if the signals $$A$$ and $$B$$ are weakly related, outcomes can become interesting:

signal = (sum(C.^2)).^(0.5);
signalInf = max((signal-(sum(A.^2)).^(0.5)),0);
signalG = (sum(B.^2)).^(0.5);

plot(t,[signal',signalInf',signalG'])
title('Observed signal');
legend('A','Binf','B')


From here, you can recover putative peaks from $$B_{\inf}$$. However, it is unlikely to work every time.

Could additional filtering help on $$S(t)$$? Without knowledge about the relative spectra of $$A$$ or $$B$$, I don't know (yet).