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$ Oct 11, 2019 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, 2019 at 8:54
  • $\begingroup$ @Irreducible -- Typo--good catch. Thanks. $\endgroup$
    – coffeecake
    Oct 11, 2019 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, 2019 at 11:53
  • $\begingroup$ Why do you need analytical solution? $\endgroup$
    – Royi
    Oct 11, 2019 at 12:37

2 Answers 2


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, 2019 at 18:26
  • $\begingroup$ Do not hesitate to share, I was lazy enough to avoid the computation $\endgroup$ Oct 13, 2019 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, 2019 at 18:25
  • $\begingroup$ @coffeecake, Could you please mark my answer? $\endgroup$
    – Royi
    Jun 7, 2021 at 4:29

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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