Following up on Analytical Solution for the Convolution of Signal with a Box Filter, I am now trying to convolve a Gaussian filter with the sine signal by hand.

My method is to use the definition of convolution and attempt to integrate: \begin{align*} \overline{\phi} &= \phi(x) * h(x) = \int_{-\infty}^{+\infty} \! \phi(x') h(x - x') \, \mathrm{d} x' \\ \Rightarrow \overline{\phi} &= \int_{-\infty}^{+\infty} \! \sin(x') \left( \frac{6}{\pi \Delta^2} \right)^{1/2} \exp(-\frac{6 (x - x')^2}{\Delta^2}) \, \mathrm{d} x' \\ \overline{\phi} &= \left( \frac{6}{\pi \Delta^2} \right)^{1/2} \int_{-\infty}^{+\infty} \! \sin(x') \exp(-\frac{6 (x - x')^2}{\Delta^2}) \, \mathrm{d} x' \\ \end{align*} At this stage, the integration seems impossible by hand (e.g., integration by parts).

I also tried moving to wave space by taking Fourier transforms and instead using multiplication:

\begin{align*} \mathscr{F}\{\phi(x)*h(x)\} &= \mathscr{F}\{\phi(x)\} \cdot \mathscr{F}\{h(x)\} \\ \end{align*}

I get the Fourier transform of sine as $\sqrt{\pi/2} i (\delta(k - 1) - \delta(k + 1)$, but am not sure how to multiply this with the exponential and how the inverse Fourier transform will work. Am I missing something clever and/or elegant? Is such a solution possible? I don't have a good understanding of the Dirac delta and how to multiply it with an exponential in wave space.

  • $\begingroup$ short question, between line one and two, when inserting the Gaussian filter, what happened to your argument $(x-x')$? $\endgroup$ – Irreducible Oct 11 '19 at 6:27
  • 1
    $\begingroup$ Why are you trying to do it in Frequency Domain? Probably, speed wise, you'd better do that on time domain and it is easier. $\endgroup$ – Royi Oct 11 '19 at 8:54
  • $\begingroup$ @Irreducible -- Typo--good catch. Thanks. $\endgroup$ – coffeecake Oct 11 '19 at 11:51
  • $\begingroup$ @Royi -- thanks for the input. I can definitely stay in the time domain if it's easier--I just can't figure out the integration by hand. $\endgroup$ – coffeecake Oct 11 '19 at 11:53
  • $\begingroup$ Why do you need analytical solution? $\endgroup$ – Royi Oct 11 '19 at 12:37

Hint: any sine, convolved by a linear kernel, yields a sine with the same frequency (and a different amplitude or phase). This is a fundamental property of linear systems, thus of convolutive filters. Hence, you only have to find the amplitude. Luckily, there is a close-form solution for the integral of a Gaussian function:

$$\int_{-\infty}^\infty e^{-f x^2 + g x + h}\,dx=\sqrt{\frac{\pi}{f}}\,\exp\left(\frac{g^2}{4f} + h\right)$$

by pluging in Euler's formula: $$\sin(x')=\frac{\exp( \imath x')-\exp(- \imath x')}{2\imath}$$ into $$\int_{-\infty}^{+\infty} \! \exp(\pm \imath x')\exp(-\frac{6 (x - x')^2}{\Delta^2}) \, \mathrm{d} x'$$

  • 1
    $\begingroup$ Thank you for the answer. Based on this hint, I was able to find a nice closed-form solution, which aligns nicely with the discrete numerical approach I wrote. $\endgroup$ – coffeecake Oct 13 '19 at 18:26
  • $\begingroup$ Do not hesitate to share, I was lazy enough to avoid the computation $\endgroup$ – Laurent Duval Oct 13 '19 at 18:36

If you have an implementation you want to validate the best way to do it is by validating it versus a reference implementation.

For instance, the above, in MATLAB, would be something like:

% Setting the Grid Parameters
leftBound = -10;
rightBound = 10;
numSamples = 10000;

% Signals Parameters
gaussianKernelStd   = 2;
gaussianKernelMean  = -1; %<! Basically its shift on the grid
sineAmp             = 0.1;
sineFreq            = 1;
sinePhase           = 0;

% Generating the grid
vX = linspace(leftBound, rightBound, numSamples + 1);
vX = vX(:);

samplingInterval    = mean(diff(vX));
samplingFrequency   = 1 / samplingInterval;

% Generating the Sine Signal
vS = sineAmp * sin((2 * pi * sineFreq * vX) + sinePhase);
% Generating the Gaussian Kernel
vK = exp(-((vX - gaussianKernelMean) .^ 2) / (2 * gaussianKernelStd * gaussianKernelStd));
vK = vK / sum(vK * samplingInterval); %<! Normalization

vY = conv(vS, vK, 'same');

% plot(vX, vK);
% figure();
% plot(vX, vS);
plot(vX, [vS, vK, vY], 'LineWidth', 2);
legend({['Sine Signal'], ['Gaussian Kernel'], ['Convolution Result']});

The result is given by:

enter image description here

  • $\begingroup$ Very helpful. Thanks for taking the time to put this together. $\endgroup$ – coffeecake Oct 13 '19 at 18:25
  • $\begingroup$ @coffeecake, Could you please mark my answer? $\endgroup$ – Royi Jun 7 at 4:29

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.