private static double[,] gaussian(int length)
       {
           //Dimensione dispari
           if (length % 2 == 0)
               length++;
           // deviazione std, da passare per una migliore implementazione come parametro della funzione
           double stddev = length / 4.9;
           // kernel gaussiano monodimensionale
           double[] monodimensional = new double[length];
 
           for (int i = 0; i < length; i++)
           {
               int x = i - length / 2;
               double exponent = x * x / (-2 * stddev * stddev);
               monodimensional[i] = Math.Exp(exponent);
           }
 
           // kernel gaussiano bidimensionale
           double[,] bidimensional = new double[length, length];
           double sum = 0.0;
           for (int i = 0; i < length; i++)
           {
               for (int j = 0; j < length; j++)
               {
                   bidimensional[i, j] = monodimensional[i] * monodimensional[j];
                   sum += bidimensional[i, j];
               }
           }
 
           //Normalizzazione
           for (int i = 0; i < length; i++)
           {
               for (int j = 0; j < length; j++)
               {
                   bidimensional[i, j] /= sum;
               }
           }
           return bidimensional;
       }